Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
55b548d3ca | ||
|
|
8eff09ff6e | ||
|
|
59596653a2 | ||
|
|
4df76391cb | ||
|
|
822f1d26b8 | ||
|
|
55a42ab0e2 | ||
|
|
cdf3521154 | ||
|
|
820b530240 | ||
|
|
1823f61748 | ||
|
|
d27d8ffd6a | ||
|
|
7a57012822 | ||
|
|
0a10f4d861 | ||
|
|
d1a3145483 | ||
|
|
08096106f8 | ||
|
|
a3fbccc454 | ||
|
|
9ea931d58d | ||
|
|
364be4e34d | ||
|
|
b22394c288 | ||
|
|
208dfbc3f3 | ||
|
|
cfb054b8b2 | ||
|
|
f47e6880fd | ||
|
|
f55f791f8a | ||
|
|
ba389ddb57 | ||
|
|
2ce143d466 | ||
|
|
b7f99503d9 | ||
|
|
52adfbae8a | ||
|
|
a861066cab | ||
|
|
1acec02bfb | ||
|
|
b88857386a | ||
|
|
4c48d4c1df | ||
|
|
68f8fd3d03 | ||
|
|
2d625c6e7a | ||
|
|
83fe2cce0d | ||
|
|
73bfaebab6 | ||
|
|
2ac61fd5cb | ||
|
|
7d31150b35 | ||
|
|
11e4033ec6 | ||
|
|
a6a8866727 | ||
|
|
ce61c3ef52 | ||
|
|
4602ea8107 | ||
|
|
5fb1a6c85e | ||
|
|
7e2ac525ac | ||
|
|
7590d6f7de | ||
|
|
d7c2284ccb | ||
|
|
84a0759288 | ||
|
|
0ca8e27fc8 | ||
|
|
5e30aef0a1 | ||
|
|
9e53791fef | ||
|
|
8346918e86 | ||
|
|
7714c6253a | ||
|
|
0a00e970d7 | ||
|
|
d0dd8dc4cd | ||
|
|
bc01609828 | ||
|
|
c6e7bcb980 | ||
|
|
8987194030 | ||
|
|
4495db796d | ||
|
|
e1a29a20a7 | ||
|
|
bd5ef7cb30 | ||
|
|
36363c885c | ||
|
|
a198f0e8d6 | ||
|
|
69cbe1e405 | ||
|
|
2b0ec87da6 | ||
|
|
08f95b8036 | ||
|
|
a15ad3a8d7 | ||
|
|
fef7f983b0 | ||
|
|
71eae683fb | ||
|
|
f692f41025 | ||
|
|
3b4acde6f8 | ||
|
|
6b14595582 | ||
|
|
50c2a69449 | ||
|
|
b62fc6922c | ||
|
|
1b5479f04f | ||
|
|
ac0041ff52 | ||
|
|
c6f129cdd3 | ||
|
|
21226e6ac9 | ||
|
|
b14f5f5031 | ||
|
|
6ff9f8c401 | ||
|
|
22b28b7b35 | ||
|
|
9e7de426c0 | ||
|
|
77abb65bab | ||
|
|
a5188e5d78 | ||
|
|
cce0ac2d7b | ||
|
|
001f6b9fd7 | ||
|
|
0395378726 | ||
|
|
31fe7a89d9 | ||
|
|
d8b47495e4 | ||
|
|
cba4603ad8 | ||
|
|
f37c74d0d9 | ||
|
|
2085dfb84b | ||
|
|
cdad13d5c5 | ||
|
|
95b50a44e9 | ||
|
|
78f630b5c1 | ||
|
|
08d000ea82 | ||
|
|
28c4fdc7ce | ||
|
|
96c81a69ae | ||
|
|
83720c6a81 | ||
|
|
c95acffab6 | ||
|
|
c2beb331f1 | ||
|
|
2667431ec9 | ||
|
|
21ce0f4d34 | ||
|
|
21c1a7dfa8 | ||
|
|
518a995e8e | ||
|
|
e20e0854ab | ||
|
|
7c3cde51f0 | ||
|
|
cc18a7ad08 | ||
|
|
35fa135e9e | ||
|
|
c68fe76156 | ||
|
|
80846cfea2 | ||
|
|
1a1b03c1f5 | ||
|
|
c411a1925b | ||
|
|
d8b4f5b1b6 | ||
|
|
486c9a493a | ||
|
|
b1ed98f53d | ||
|
|
ca8ca782fc | ||
|
|
c75f039c99 | ||
|
|
c1324fe7fe | ||
|
|
781d4a7c82 | ||
|
|
590479adda | ||
|
|
df2c50ccfc | ||
|
|
f5b60ea3f2 | ||
|
|
c95194f147 | ||
|
|
56a643f8d0 | ||
|
|
7daed688e0 | ||
|
|
f3782dffe1 | ||
|
|
b06063ebf7 | ||
|
|
6cb3d301d8 | ||
|
|
1aab738dd5 | ||
|
|
0aafad8b58 | ||
|
|
910d77252e | ||
|
|
524e6ca16d | ||
|
|
1aa88d05bf | ||
|
|
70271f3694 | ||
|
|
62201ae3fa | ||
|
|
8ce56fc346 | ||
|
|
8029fd1b4e | ||
|
|
de19712dbb | ||
|
|
1d41037bdd | ||
|
|
a98b8c5604 | ||
|
|
7d5d2682b7 | ||
|
|
2b5f8027f0 | ||
|
|
1e37351b48 | ||
|
|
70c8aad74e | ||
|
|
5527546f05 | ||
|
|
56671341ae | ||
|
|
41ea688ff3 | ||
|
|
004195144d | ||
|
|
962aefba17 | ||
|
|
88ec7a583d | ||
|
|
2303d362d7 | ||
|
|
da0e95fa03 | ||
|
|
c98bfad8b8 | ||
|
|
3dfb8389dc | ||
|
|
7c74dd2e05 | ||
|
|
05eabbf667 | ||
|
|
d1cafe2bcc | ||
|
|
26078fcb59 | ||
|
|
3d602b9f96 | ||
|
|
df4f9e425e | ||
|
|
efb9766388 | ||
|
|
ab0ad68d43 | ||
|
|
1be8db5ff4 | ||
|
|
1f68ee1f46 | ||
|
|
e7c6ae4726 | ||
|
|
5db1671895 | ||
|
|
023a0da619 | ||
|
|
51863fa435 | ||
|
|
f46ec64e60 | ||
|
|
f0d7a8e84d | ||
|
|
ac4fac85ed | ||
|
|
8f274e0695 | ||
|
|
cd0892ffe4 | ||
|
|
f9398b58f7 | ||
|
|
9c9f5cf41d | ||
|
|
5983395561 | ||
|
|
686bb4fd3f | ||
|
|
ff4ac7eefc | ||
|
|
20b52fbcd9 | ||
|
|
424fd149e7 | ||
|
|
e372f4f30a | ||
|
|
b520a2ea99 | ||
|
|
4e4174b7d3 | ||
|
|
0931f7c9e7 | ||
|
|
4faf97cdb4 | ||
|
|
71fa7be70d | ||
|
|
a7cb0ce6bf | ||
|
|
8fa1b820d4 | ||
|
|
05f42bc9d5 | ||
|
|
b635dcbe54 | ||
|
|
a1def4170c | ||
|
|
53f1fc495b | ||
|
|
17086d3017 | ||
|
|
d604e9d6af | ||
|
|
76aba6fb8d | ||
|
|
5e8ad3e6e2 | ||
|
|
2f780a22a0 | ||
|
|
7549b22604 | ||
|
|
8083725b96 | ||
|
|
3e624ebde5 | ||
|
|
16f031c585 | ||
|
|
32f7d0b68b | ||
|
|
8a3a418d05 | ||
|
|
3a76049868 | ||
|
|
e7495c2e85 | ||
|
|
a2726516b3 | ||
|
|
bf57fef29c | ||
|
|
a9679cd5b2 | ||
|
|
8e3eba761d | ||
|
|
b4ef9b90b9 | ||
|
|
b2ccbe0bed | ||
|
|
1913c6603e | ||
|
|
9eafaaab7d | ||
|
|
e672aa2b92 | ||
|
|
1ba1ec17fa | ||
|
|
288b0a5bed | ||
|
|
2bc4056c9c | ||
|
|
1c0b85a689 | ||
|
|
51e2538ea4 | ||
|
|
47645e4ea0 | ||
|
|
5aa121db9a | ||
|
|
c32300cd04 | ||
|
|
0d9b183ea1 | ||
|
|
a215fd9b4d | ||
|
|
2ffb9335b3 | ||
|
|
d9ddf4e598 | ||
|
|
eb3b9593be | ||
|
|
e49b989025 | ||
|
|
fdd7947728 | ||
|
|
cc4b69acf5 | ||
|
|
3139282035 | ||
|
|
9a721c79d5 | ||
|
|
5c4ccc544c | ||
|
|
751b93c51f | ||
|
|
1a0c9da630 | ||
|
|
383a680a70 | ||
|
|
83e600c301 | ||
|
|
f69eb78aa4 | ||
|
|
c046bd5a9d | ||
|
|
8740a5ed0f | ||
|
|
9e89b0a5c7 | ||
|
|
5b45f3c634 | ||
|
|
a95250f4f7 | ||
|
|
fb31dab995 | ||
|
|
d3aba54f69 | ||
|
|
e823e17f69 | ||
|
|
98e46dd38a | ||
|
|
405caec719 | ||
|
|
c32b1b90b1 | ||
|
|
2272315d83 | ||
|
|
dfd8eccf87 | ||
|
|
b826fbc197 | ||
|
|
878c7a96d6 | ||
|
|
3a1474c5a6 | ||
|
|
0f94fc8216 | ||
|
|
445893d664 | ||
|
|
e8cc99fa0d | ||
|
|
9948837294 | ||
|
|
3e0191aa17 | ||
|
|
8a3ee34e28 | ||
|
|
ae317c535b | ||
|
|
2949af533f | ||
|
|
e90f377c61 | ||
|
|
088ded2190 | ||
|
|
93a6e3f5ed | ||
|
|
63a6b158eb | ||
|
|
c471b691f7 | ||
|
|
b2c4bb8928 | ||
|
|
253d5f968e | ||
|
|
533274fd45 | ||
|
|
4a35ebf7eb | ||
|
|
9dd45ffc48 | ||
|
|
1e8bee4179 | ||
|
|
b367e1da91 | ||
|
|
2808e35234 | ||
|
|
df7b69249b | ||
|
|
6650ee5d64 | ||
|
|
c75e137bd0 | ||
|
|
57d00aaa4e | ||
|
|
e8a95aeb8e | ||
|
|
2fcdce578d | ||
|
|
ac729a30e3 | ||
|
|
2b626d38b1 | ||
|
|
a5d3633088 | ||
|
|
c79cea2b42 | ||
|
|
9c4e438099 | ||
|
|
7572eeb5ca | ||
|
|
b78f8369f4 | ||
|
|
881898d788 | ||
|
|
c355dbf1fc | ||
|
|
17262757ce | ||
|
|
e890fcd7e5 | ||
|
|
90ff84471f | ||
|
|
963643bdeb | ||
|
|
12c2c307eb | ||
|
|
a4fefad9e6 | ||
|
|
9bb7b6e458 | ||
|
|
18ed3fb529 | ||
|
|
6c70181d77 | ||
|
|
ed848d93d3 | ||
|
|
db30205fa6 | ||
|
|
d33cb38f15 | ||
|
|
1371809b37 | ||
|
|
3a24bed6fb | ||
|
|
ab5f4ee049 | ||
|
|
da8bdd9384 | ||
|
|
7e398fe45a | ||
|
|
1f6314a262 | ||
|
|
2c238c251e | ||
|
|
0018d60f9c | ||
|
|
f9670a71b1 | ||
|
|
bede82c866 | ||
|
|
d5cca6490f | ||
|
|
8f920cd6cc | ||
|
|
06eb3f4b90 | ||
|
|
e57002768b | ||
|
|
a85de1cef2 | ||
|
|
39d45d8d1f | ||
|
|
1bb6268a62 | ||
|
|
4c87f3fce1 | ||
|
|
86358c3fe9 | ||
|
|
34846df85b | ||
|
|
5b214e4187 | ||
|
|
5280f26e00 | ||
|
|
8226aed28e | ||
|
|
ec4496f837 | ||
|
|
91730fdb46 | ||
|
|
c892a15c5a | ||
|
|
2fc6613df0 | ||
|
|
cf0a3115f0 | ||
|
|
513b970c4d | ||
|
|
2b03bbce7c | ||
|
|
319568d92a | ||
|
|
f666047ae5 | ||
|
|
e86beec90f | ||
|
|
3d416fc961 | ||
|
|
2cd2f5d7f9 | ||
|
|
688e32d9a6 | ||
|
|
ef49276809 | ||
|
|
a3116dc2a6 | ||
|
|
3fda55bc39 | ||
|
|
f78294afb4 | ||
|
|
0a30904217 | ||
|
|
8a1506ee53 | ||
|
|
795798de41 | ||
|
|
fed7c147d8 | ||
|
|
5cdb80c002 | ||
|
|
57add57796 | ||
|
|
f7a72713e1 | ||
|
|
2c0a5346f4 | ||
|
|
3627cd4d5a | ||
|
|
6f39702af7 | ||
|
|
fe316a4368 | ||
|
|
e026ef8181 | ||
|
|
d9e78b71a6 | ||
|
|
92fc265333 | ||
|
|
d75137fe5f | ||
|
|
3d90acad8e | ||
|
|
dc3c168d84 | ||
|
|
8a5d4fc3e0 | ||
|
|
8cbfde0c3f | ||
|
|
9dc5908c5e | ||
|
|
3bdab06db4 | ||
|
|
e08b5f69bf | ||
|
|
f6e76b65b6 | ||
|
|
bbf8749f1e | ||
|
|
d4f7f64fc6 | ||
|
|
4a9cd4b8aa | ||
|
|
83ae030352 | ||
|
|
88b3b00c43 | ||
|
|
3b9c3632ad | ||
|
|
e8a8f0d0a3 | ||
|
|
113b4a84c2 | ||
|
|
a9a6c11402 | ||
|
|
2cb427e06d | ||
|
|
22bea4e7b0 | ||
|
|
6703db2528 | ||
|
|
44223018b0 | ||
|
|
d7b677c4db | ||
|
|
e531e434b6 | ||
|
|
97dcbc606e | ||
|
|
4d55df1569 | ||
|
|
a028653207 | ||
|
|
0d92230183 | ||
|
|
5c6c41e62f | ||
|
|
88ff380bbd | ||
|
|
8dd207ccec | ||
|
|
73426fb7bf | ||
|
|
3f13e4374a | ||
|
|
478a3e56c3 | ||
|
|
699594090a | ||
|
|
2a137b0059 | ||
|
|
81c53d3c4c | ||
|
|
c824f9c835 | ||
|
|
e1df40710e | ||
|
|
6507a73042 | ||
|
|
6a99936110 | ||
|
|
93441ece77 | ||
|
|
f5776682ce | ||
|
|
be264f3d81 | ||
|
|
8fcef1d834 | ||
|
|
8210bb32da | ||
|
|
8b3ddb7b47 | ||
|
|
dcb3e5e1cd | ||
|
|
3d2a872de1 | ||
|
|
61f5158279 | ||
|
|
ce481cfdb0 | ||
|
|
3d5c294f64 | ||
|
|
4f0678d782 | ||
|
|
9b1f7a372c | ||
|
|
9a1ee3d888 | ||
|
|
4f20680d5b | ||
|
|
dd5a25eb66 | ||
|
|
3a3f8c498c | ||
|
|
f603b49a3e | ||
|
|
52e182e7f0 | ||
|
|
7cc925120e | ||
|
|
603cb07c27 | ||
|
|
7b5019ba87 | ||
|
|
40f6b2fca4 | ||
|
|
1e50c5d6cb | ||
|
|
d46db268f8 | ||
|
|
8f5b549b84 | ||
|
|
770a9cd996 | ||
|
|
6afe377b55 | ||
|
|
fad73d2814 | ||
|
|
0666097934 |
No files matched your search
@@ -13,13 +13,13 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Validate gradle wrapper
|
||||
uses: gradle/actions/wrapper-validation@v3
|
||||
uses: gradle/actions/wrapper-validation@v4
|
||||
|
||||
- name: Set up JDK 21
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: '21'
|
||||
distribution: 'adopt'
|
||||
distribution: 'temurin'
|
||||
cache: 'gradle'
|
||||
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
|
||||
settings-path: ${{ github.workspace }} # location for the settings.xml file
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
name: Release
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
release:
|
||||
name: Publish Release
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Validate gradle wrapper
|
||||
uses: gradle/actions/wrapper-validation@v4
|
||||
|
||||
- name: Setup java 21
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: 21
|
||||
distribution: temurin
|
||||
|
||||
- name: Prepare gradle
|
||||
run: ./gradlew printVersion --no-daemon
|
||||
|
||||
- name: Extract changelog
|
||||
id: changelog
|
||||
run: |
|
||||
OUTPUT_DELIMITER="$(uuidgen)"
|
||||
echo "changelog<<$OUTPUT_DELIMITER" >> "$GITHUB_OUTPUT"
|
||||
|
||||
# extract tag name and use it to get changelog section
|
||||
TAG_NAME="v$(./gradlew -q --no-daemon printVersion)"
|
||||
awk -v tag="${TAG_NAME}" '
|
||||
$1 == "!!!!!" && $2 == tag {found=1; next}
|
||||
$1 == "!!!!!" && found {exit}
|
||||
found
|
||||
' CHANGELOG.md >> "$GITHUB_OUTPUT"
|
||||
|
||||
# end output
|
||||
echo "$OUTPUT_DELIMITER" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Publish plugin
|
||||
env:
|
||||
GITHUB_API_TOKEN: ${{ github.token }}
|
||||
MODRINTH_API_TOKEN: ${{ secrets.MODRINTH_PUBLISH_TOKEN }}
|
||||
CHANGELOG: ${{ steps.changelog.outputs.changelog }}
|
||||
run: ./gradlew publishMods --no-daemon -PnoDryPublish
|
||||
@@ -123,3 +123,6 @@ run/
|
||||
.project
|
||||
.settings/
|
||||
.classpath
|
||||
|
||||
# Build Source Kotlin
|
||||
/buildSrc/.kotlin/
|
||||
+263
@@ -0,0 +1,263 @@
|
||||
!!!!! v2.9.4
|
||||
|
||||
# PacketEvents 2.9.4 is out now! 🎉
|
||||
|
||||
This update includes minor bug fixes & minor additions to the API.
|
||||
|
||||
# Brief Announcement 📢⚠️
|
||||
|
||||
### We have our very own website: https://packetevents.com
|
||||
|
||||
### Documentation: https://docs.packetevents.com
|
||||
|
||||
### JavaDocs: https://javadocs.packetevents.com
|
||||
|
||||
## What's Changed (Summary)
|
||||
|
||||
* Added SpigotConversionUtil#getEntityMetadata to retrieve metadata from a Bukkit entity.
|
||||
* Fixed outdated 1.8 Spigot forks from being unable to load on PacketEvents.
|
||||
* Fixed WrapperPlayServerWorldBorder for versions lower than 1.12.
|
||||
|
||||
**View Full Changelog**: https://github.com/retrooper/packetevents/compare/v2.9.3...v2.9.4
|
||||
|
||||
## If you want to support PacketEvents, consider sponsoring us on [GitHub Sponsors](https://github.com/sponsors/retrooper)
|
||||
|
||||
## Maven/Gradle Dependency
|
||||
|
||||
### **Check out**: https://docs.packetevents.com/getting-started
|
||||
|
||||
!!!!! v2.9.3
|
||||
|
||||
# PacketEvents 2.9.3 is out now! 🎉
|
||||
|
||||
This is an update that adds support for Minecraft 1.21.8 server builds.
|
||||
|
||||
# Brief Announcement 📢⚠️
|
||||
|
||||
### We have our very own website: https://packetevents.com
|
||||
|
||||
### Documentation: https://docs.packetevents.com
|
||||
|
||||
### JavaDocs: https://javadocs.packetevents.com
|
||||
|
||||
## What's Changed (Summary)
|
||||
|
||||
* Added support for 1.21.8 Minecraft server builds.
|
||||
|
||||
**View Full Changelog**: https://github.com/retrooper/packetevents/compare/v2.9.2...v2.9.3
|
||||
|
||||
## If you want to support PacketEvents, consider sponsoring us on [GitHub Sponsors](https://github.com/sponsors/retrooper)
|
||||
|
||||
## Maven/Gradle Dependency
|
||||
|
||||
### **Check out**: https://docs.packetevents.com/getting-started
|
||||
|
||||
!!!!! v2.9.2
|
||||
|
||||
# PacketEvents 2.9.2 is out now! 🎉
|
||||
|
||||
This is a patch update that fixes issues with UserLoginEvent (which previously contained null user data) and with importing Adventure serializers.
|
||||
|
||||
# Brief Announcement 📢⚠️
|
||||
|
||||
### We have our very own website: https://packetevents.com
|
||||
|
||||
### Documentation: https://docs.packetevents.com
|
||||
|
||||
### JavaDocs: https://javadocs.packetevents.com
|
||||
|
||||
## What's Changed (Summary)
|
||||
|
||||
* Added support for 1.7.2+ Minecraft protocol (useful for proxies)
|
||||
* Fixed UserLoginEvent. It is now (always) triggered by PlayerJoinEvent to prevent User instances from containing null data.
|
||||
* Fixed importing Adventure serializers.
|
||||
|
||||
**View Full Changelog**: https://github.com/retrooper/packetevents/compare/v2.9.1...v2.9.2
|
||||
|
||||
## If you want to support PacketEvents, consider sponsoring us on [GitHub Sponsors](https://github.com/sponsors/retrooper)
|
||||
|
||||
## Maven/Gradle Dependency
|
||||
|
||||
### **Check out**: https://docs.packetevents.com/getting-started
|
||||
|
||||
!!!!! v2.9.1
|
||||
|
||||
# PacketEvents 2.9.1 is out now! 🎉
|
||||
|
||||
This is a hotfix patch update to fix issues with 2.9.0 release assets. See below for the 2.9.0 changelog.
|
||||
|
||||
### New update now supports Minecraft version 1.21.6 & 1.21.7. We suggest that you update, as numerous bugs have been fixed.
|
||||
|
||||
# Brief Announcement 📢⚠️
|
||||
|
||||
### We have our very own website: https://packetevents.com
|
||||
|
||||
### Documentation: https://docs.packetevents.com
|
||||
|
||||
### JavaDocs: https://javadocs.packetevents.com
|
||||
|
||||
## What's Changed? (Summary)
|
||||
|
||||
* Added 1.21.6 support
|
||||
* Added 1.21.7 support
|
||||
* Bug fixes
|
||||
|
||||
**View Full Changelog**: https://github.com/retrooper/packetevents/compare/v2.8.0...v2.9.1
|
||||
|
||||
## If you want to support PacketEvents, consider sponsoring us on [GitHub Sponsors](https://github.com/sponsors/retrooper)
|
||||
|
||||
## Maven/Gradle Dependency
|
||||
|
||||
### **Check out**: https://docs.packetevents.com/getting-started
|
||||
|
||||
!!!!! v2.9.0
|
||||
|
||||
# PacketEvents 2.9.0 is out now! 🎉
|
||||
|
||||
### New update now supports Minecraft version 1.21.6 & 1.21.7. We suggest that you update, as numerous bugs have been fixed.
|
||||
|
||||
# Brief Announcement 📢⚠️
|
||||
|
||||
### We have our very own website: https://packetevents.com
|
||||
|
||||
### Documentation: https://docs.packetevents.com
|
||||
|
||||
### JavaDocs: https://javadocs.packetevents.com
|
||||
|
||||
## What's Changed? (Summary)
|
||||
|
||||
* Added 1.21.6 support
|
||||
* Added 1.21.7 support
|
||||
* Bug fixes
|
||||
|
||||
**View Full Changelog**: https://github.com/retrooper/packetevents/compare/v2.8.0...v2.9.0
|
||||
|
||||
## If you want to support PacketEvents, consider sponsoring us on [GitHub Sponsors](https://github.com/sponsors/retrooper)
|
||||
|
||||
## Maven/Gradle Dependency
|
||||
|
||||
### **Check out**: https://docs.packetevents.com/getting-started
|
||||
|
||||
!!!!! v2.8.0
|
||||
|
||||
# PacketEvents 2.8.0 is out now! 🎉
|
||||
|
||||
### New update now supports Minecraft version 1.21.5. Please update, as numerous bugs have been fixed.
|
||||
|
||||
# Brief Announcement 📢⚠️
|
||||
|
||||
### We have our very own website: https://packetevents.com
|
||||
|
||||
### Documentation: https://docs.packetevents.com
|
||||
|
||||
### JavaDocs: https://javadocs.packetevents.com
|
||||
|
||||
## What's Changed? (Summary)
|
||||
|
||||
* Added 1.21.5 support
|
||||
* Various bugs fixed
|
||||
|
||||
**View Full Changelog**: https://github.com/retrooper/packetevents/compare/v2.7.0...v2.8.0
|
||||
|
||||
## Contributors 🏅
|
||||
|
||||
This update wouldn't be possible without these contributors ❤️: @booky10, @Axionize, @Bram1903, @ManInMyVan, @ytnoos,
|
||||
@AoElite, @HaHaWTH, @divinepablo, @scienziatopazzo, @bridgelol, @MachineBreaker, @Luuzzi, @Beaness, @Rubenicos, @Loyisa
|
||||
|
||||
## New Contributors
|
||||
|
||||
* @HaHaWTH made their first contribution in https://github.com/retrooper/packetevents/pull/1097
|
||||
* @divinepablo made their first contribution in https://github.com/retrooper/packetevents/pull/1098
|
||||
* @scienziatopazzo made their first contribution in https://github.com/retrooper/packetevents/pull/1105
|
||||
* @bridgelol made their first contribution in https://github.com/retrooper/packetevents/pull/1199
|
||||
* @Luuzzi made their first contribution in https://github.com/retrooper/packetevents/pull/1197
|
||||
* @Beaness made their first contribution in https://github.com/retrooper/packetevents/pull/1212
|
||||
* @Rubenicos made their first contribution in https://github.com/retrooper/packetevents/pull/1162
|
||||
* @Loyisa made their first contribution in https://github.com/retrooper/packetevents/pull/1220
|
||||
|
||||
## If you want to support PacketEvents, consider sponsoring us on [GitHub Sponsors](https://github.com/sponsors/retrooper)
|
||||
|
||||
## Maven/Gradle Dependency
|
||||
|
||||
### **Check out**: https://docs.packetevents.com/getting-started
|
||||
|
||||
!!!!! v2.7.0
|
||||
|
||||
# PacketEvents v2.7.0 is out now! 🎉
|
||||
|
||||
### New update with support of the latest Minecraft version. In addition to that, countless bugs were fixed.
|
||||
|
||||
# Brief Announcement 📢⚠️
|
||||
|
||||
### We have our own website: https://packetevents.com
|
||||
|
||||
### Documentation: https://docs.packetevents.com
|
||||
|
||||
### JavaDocs: https://javadocs.packetevents.com
|
||||
|
||||
## What's Changed? (Summary)
|
||||
|
||||
* Added 1.21.4 support
|
||||
* Fix: Potion contents item component for 1.21.2/1.21.3
|
||||
* Fix: NPC objects to have unique server team names
|
||||
* Add missing ServerVersion#V_1_9_1
|
||||
* Validation checks added for window click type
|
||||
|
||||
**Full Changelog**: https://github.com/retrooper/packetevents/compare/v2.6.0...v2.7.0
|
||||
|
||||
## New Contributors
|
||||
|
||||
* @Axionize made their first contribution in https://github.com/retrooper/packetevents/pull/1048
|
||||
* @ShreyasAyyengar made their first contribution in https://github.com/retrooper/packetevents/pull/1044
|
||||
* @mfnalex made their first contribution in https://github.com/retrooper/packetevents/pull/1076
|
||||
|
||||
## Contributors 🏅
|
||||
|
||||
This update wouldn't be possible without these contributors ❤️: @booky10, @rafi67000, @ShreyasAyyengar, @AoElite,
|
||||
@Tecnio, @Axionize, @mfnalex
|
||||
|
||||
### If you want to support PacketEvents, and any upcoming events we plan for the future, consider sponsoring us on [GitHub Sponsors](https://github.com/sponsors/retrooper)
|
||||
|
||||
## Maven/Gradle Dependency
|
||||
|
||||
### **Check out**: https://docs.packetevents.com/getting-started
|
||||
|
||||
!!!!! v2.6.0
|
||||
|
||||
# PacketEvents v2.6.0 is out now! 🎉
|
||||
|
||||
### New update with support of new platforms & the latest Minecraft version. In addition to that, countless bugs were fixed.
|
||||
|
||||
# Brief Announcement 📢⚠️
|
||||
|
||||
### We have our own website: https://packetevents.com
|
||||
|
||||
### Documentation: https://docs.packetevents.com
|
||||
|
||||
### JavaDocs: https://javadocs.packetevents.com
|
||||
|
||||
## What's Changed? (Summary)
|
||||
|
||||
* 1.21.2 and 1.21.3 Minecraft support
|
||||
* Sponge support added
|
||||
* Fabric support added (also server-side)
|
||||
* Utilizing the proper bStats API
|
||||
* Registry element issues fixed
|
||||
* Mappings issues fixed
|
||||
* AdvancedSlimePaper issues fixed
|
||||
* BungeeCord issues fixed
|
||||
|
||||
### **Full Changelog**: https://github.com/retrooper/packetevents/compare/v2.5.0...v2.6.0
|
||||
|
||||
## Contributors 🏅
|
||||
|
||||
This update wouldn't be possible without these contributors ❤️: @booky10, @ManInMyVan, @SamB440, @rafi67000, @Bram1903,
|
||||
@AbhigyaKrishna
|
||||
|
||||
### If you want to support PacketEvents, and any upcoming events we plan for the future, consider sponsoring us on [GitHub Sponsors](https://github.com/sponsors/retrooper)
|
||||
|
||||
## Maven/Gradle Dependency
|
||||
|
||||
### **Check out**: https://docs.packetevents.com/getting-started
|
||||
|
||||
!!!!!
|
||||
@@ -1,7 +1,7 @@
|
||||
<!--suppress HtmlDeprecatedAttribute -->
|
||||
<div align="center">
|
||||
<h2><i>packetevents</i></h2>
|
||||
<h3><i>Precision meets performance—a powerful tool for mastering Minecraft packet manipulation with speed and finesse.</i></h3>
|
||||
<h2><i>PacketEvents</i></h2>
|
||||
<h3><i>A powerful networking library for Minecraft packet processing and manipulation.</i></h3>
|
||||
<a href="https://github.com/retrooper/packetevents/actions"><img src="https://img.shields.io/github/actions/workflow/status/retrooper/packetevents/gradle-publish.yml?style=for-the-badge&logo=github"></a>
|
||||
<a href="https://discord.gg/DVHxPPxHZc"><img src="https://img.shields.io/discord/721686193061888071?color=5562e9&logo=discord&logoColor=white&style=for-the-badge"></a>
|
||||
<img src="https://img.shields.io/github/license/retrooper/packetevents?style=for-the-badge&logo=github">
|
||||
@@ -14,8 +14,8 @@
|
||||
- [Getting Started](https://docs.packetevents.com/getting-started)
|
||||
- [JavaDocs](https://javadocs.packetevents.com)
|
||||
- [Releases](https://github.com/retrooper/packetevents/releases/)
|
||||
- [GitHub](https://github.com/retrooper/packetevents/releases/)
|
||||
- [Modrinth](https://modrinth.com/plugin/packetevents)
|
||||
- [GitHub](https://github.com/retrooper/packetevents/releases/)
|
||||
- [SpigotMC](https://www.spigotmc.org/resources/packetevents-api.80279/)
|
||||
- [Development Builds](https://ci.codemc.io/job/retrooper/job/packetevents)
|
||||
- [Statistics](https://bstats.org/plugin/bukkit/packetevents/11327)
|
||||
@@ -28,14 +28,12 @@
|
||||
|
||||
<a href="https://www.ej-technologies.com"><img src="https://www.ej-technologies.com/images/product_banners/jprofiler_small.png"><br>
|
||||
|
||||
<a href="https://github.com/radstevee"><img src="https://github.com/radstevee.png" width="50px" alt="radstevee"/></a><br>
|
||||
|
||||
<h3>Credits</h3>
|
||||
|
||||
<i>Here are some projects that we are heavily inspired by, thus we have integrated</i>\
|
||||
<i>small portions of their code into our work.</i>
|
||||
|
||||
[Protocol Documentation for the Minecraft Java Edition](https://wiki.vg/Protocol)\
|
||||
[Protocol Documentation for the Minecraft Java Edition](https://minecraft.wiki/w/Minecraft_Wiki:Projects/wiki.vg_merge/Protocol)\
|
||||
[ViaVersion](https://github.com/ViaVersion/ViaVersion)\
|
||||
[ProtocolSupport](https://github.com/ProtocolSupport/ProtocolSupport)\
|
||||
[adventure](https://github.com/KyoriPowered/adventure)\
|
||||
|
||||
+13
-66
@@ -1,6 +1,6 @@
|
||||
import com.github.retrooper.compression.strategy.JsonArrayCompressionStrategy
|
||||
import com.github.retrooper.compression.strategy.JsonObjectCompressionStrategy
|
||||
import com.github.retrooper.compression.strategy.JsonToNbtStrategy
|
||||
import com.github.retrooper.compression.strategy.dir.JsonBase64DataDirStrategy
|
||||
import com.github.retrooper.compression.strategy.dir.JsonRegistryCompressionDirStrategy
|
||||
import com.github.retrooper.compression.strategy.dir.JsonToNbtDirStrategy
|
||||
import com.github.retrooper.excludeAdventure
|
||||
|
||||
plugins {
|
||||
@@ -39,76 +39,21 @@ dependencies {
|
||||
testImplementation(testlibs.slf4j)
|
||||
testImplementation(testlibs.bundles.junit)
|
||||
testImplementation(libs.netty)
|
||||
testImplementation(libs.classgraph)
|
||||
}
|
||||
|
||||
mappingCompression {
|
||||
mappingDirectory = rootDir.resolve("mappings")
|
||||
outDirectory = project.layout.buildDirectory.dir("mappings/generated/assets/mappings")
|
||||
|
||||
with<JsonToNbtStrategy> {
|
||||
compress("block/legacy_block_mappings.json")
|
||||
compress("block/modern_block_mappings.json")
|
||||
|
||||
compress("enchantment/enchantment_type_data.json")
|
||||
|
||||
compress("item/item_base_components.json")
|
||||
|
||||
compress("stats/statistics.json")
|
||||
|
||||
compress("world/biome_data.json")
|
||||
with<JsonToNbtDirStrategy> {
|
||||
compress("data")
|
||||
}
|
||||
|
||||
with<JsonArrayCompressionStrategy> {
|
||||
compress("attribute/attribute_mappings.json")
|
||||
|
||||
compress("block/block_entity_type_mappings.json")
|
||||
compress("block/block_type_mappings.json")
|
||||
|
||||
compress("chat/chat_type_mappings.json")
|
||||
|
||||
compress("command/argument_parser_mappings.json")
|
||||
|
||||
compress("damage/damagetype_mappings.json")
|
||||
|
||||
compress("enchantment/effect_component_type.json")
|
||||
|
||||
compress("entity/entity_data_type_mappings.json")
|
||||
compress("entity/painting_mappings.json")
|
||||
compress("entity/wolf_variant_mappings.json")
|
||||
|
||||
compress("item/consume_effect_type_mappings.json")
|
||||
compress("item/equipment_asset_mappings.json")
|
||||
compress("item/item_banner_pattern_mappings.json")
|
||||
compress("item/item_component_mappings.json")
|
||||
compress("item/item_instrument_mappings.json")
|
||||
compress("item/item_jukebox_song_mappings.json")
|
||||
compress("item/item_map_decoration_type_mappings.json")
|
||||
compress("item/item_potion_mappings.json")
|
||||
compress("item/item_trim_material_mappings.json")
|
||||
compress("item/item_trim_pattern_mappings.json")
|
||||
compress("item/recipe_book_category.json")
|
||||
compress("item/recipe_display_types.json")
|
||||
compress("item/recipe_serializer_mappings.json")
|
||||
compress("item/recipe_slot_display_types.json")
|
||||
|
||||
compress("particle/particle_type_mappings.json")
|
||||
|
||||
compress("sound/sound_mappings.json")
|
||||
|
||||
compress("world/biome_mappings.json")
|
||||
compress("world/world_position_source_mappings.json")
|
||||
with<JsonBase64DataDirStrategy> {
|
||||
compress("item_base_components")
|
||||
}
|
||||
|
||||
with<JsonObjectCompressionStrategy> {
|
||||
compress("enchantment/enchantment_type_mappings.json")
|
||||
|
||||
compress("entity/entity_effect_mappings.json")
|
||||
compress("entity/entity_type_mappings.json")
|
||||
compress("entity/legacy_entity_type_mappings.json")
|
||||
|
||||
compress("item/item_type_mappings.json")
|
||||
|
||||
compress("world/dimension_type_mappings.json")
|
||||
with<JsonRegistryCompressionDirStrategy> {
|
||||
compress("registries")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -145,7 +90,9 @@ tasks {
|
||||
shadowJar {
|
||||
exclude {
|
||||
val path = it.path
|
||||
path.startsWith("net/kyori") && !path.startsWith("net/kyori/adventure/text/serializer") && !path.startsWith("net/kyori/option")
|
||||
path.startsWith("net/kyori") && !path.startsWith("net/kyori/adventure/text/serializer") && !path.startsWith(
|
||||
"net/kyori/option"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.github.retrooper.packetevents.annotations;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import java.lang.annotation.Documented;
|
||||
|
||||
/**
|
||||
* Marks an API element as obsolete and makes this information available
|
||||
* at runtime via reflection. Use in conjunction with an IDE-recognized
|
||||
* annotation like @ApiStatus.Obsolete if IDE warnings are also desired.
|
||||
*/
|
||||
@Documented
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target({ElementType.FIELD}) // Adjust targets as needed
|
||||
public @interface RuntimeObsolete {
|
||||
/**
|
||||
* Specifies in which version the API became obsolete.
|
||||
* Should generally match the value in the corresponding @ApiStatus.Obsolete annotation.
|
||||
*/
|
||||
String since() default "";
|
||||
|
||||
/**
|
||||
* Optional: Add a reason or replacement suggestion.
|
||||
*/
|
||||
String reason() default "";
|
||||
}
|
||||
@@ -32,6 +32,7 @@ import com.github.retrooper.packetevents.protocol.packettype.PacketTypeCommon;
|
||||
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
|
||||
import com.github.retrooper.packetevents.protocol.player.User;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -44,7 +45,7 @@ public abstract class ProtocolPacketEvent extends PacketEvent implements PlayerE
|
||||
private final Object channel;
|
||||
private final ConnectionState connectionState;
|
||||
private final User user;
|
||||
private final Object player;
|
||||
private Object player;
|
||||
private Object byteBuf;
|
||||
private final int packetID;
|
||||
private final PacketTypeCommon packetType;
|
||||
@@ -145,6 +146,15 @@ public abstract class ProtocolPacketEvent extends PacketEvent implements PlayerE
|
||||
return (T) player;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@ApiStatus.Internal
|
||||
public void setPlayer(Object player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the connection state this packet has been sent/received in.
|
||||
*/
|
||||
public ConnectionState getConnectionState() {
|
||||
return connectionState;
|
||||
}
|
||||
|
||||
+5
@@ -2,4 +2,9 @@ package com.github.retrooper.packetevents.exception;
|
||||
|
||||
public class CancelPacketException extends RuntimeException {
|
||||
public static final CancelPacketException INSTANCE = new CancelPacketException();
|
||||
|
||||
@Override
|
||||
public synchronized Throwable fillInStackTrace() {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
@@ -35,6 +35,8 @@ public interface ChannelInjector {
|
||||
|
||||
void setPlayer(Object channel, Object player);
|
||||
|
||||
boolean isPlayerSet(Object channel);
|
||||
|
||||
boolean isProxy();
|
||||
|
||||
default PacketSide getPacketSide() {
|
||||
|
||||
+9
-6
@@ -37,7 +37,9 @@ import com.github.retrooper.packetevents.wrapper.handshaking.client.WrapperHands
|
||||
import com.github.retrooper.packetevents.wrapper.login.server.WrapperLoginServerLoginSuccess;
|
||||
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerJoinGame;
|
||||
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerRespawn;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
|
||||
@ApiStatus.Internal
|
||||
public class InternalPacketListener extends PacketListenerAbstract {
|
||||
|
||||
public InternalPacketListener() {
|
||||
@@ -65,10 +67,12 @@ public class InternalPacketListener extends PacketListenerAbstract {
|
||||
|
||||
//Map username with channel
|
||||
synchronized (channel) {
|
||||
ProtocolManager.CHANNELS.put(profile.getUUID(), channel);
|
||||
PacketEvents.getAPI().getProtocolManager().setChannel(profile.getUUID(), channel);
|
||||
}
|
||||
|
||||
PacketEvents.getAPI().getLogManager().debug("Mapped player UUID with their channel.");
|
||||
if (PacketEvents.getAPI().getLogManager().isDebug()) {
|
||||
PacketEvents.getAPI().getLogManager().debug("Mapped player UUID with their channel " + profile.getUUID() + " " + channel);
|
||||
}
|
||||
|
||||
// Switch the user's connection state to new state, but the variable event.getConnectionState() remains LOGIN
|
||||
// We switch user state immediately to remain in sync with vanilla, allowing you to encode packets immediately
|
||||
@@ -86,12 +90,11 @@ public class InternalPacketListener extends PacketListenerAbstract {
|
||||
WrapperConfigServerRegistryData packet = new WrapperConfigServerRegistryData(event);
|
||||
|
||||
if (packet.getElements() != null) { // 1.20.2 to 1.20.5
|
||||
SynchronizedRegistriesHandler.handleRegistry(user, packet.getServerVersion().toClientVersion(),
|
||||
SynchronizedRegistriesHandler.handleRegistry(user, packet,
|
||||
packet.getRegistryKey(), packet.getElements());
|
||||
}
|
||||
if (packet.getRegistryData() != null) { // since 1.20.5
|
||||
SynchronizedRegistriesHandler.handleLegacyRegistries(user, packet.getServerVersion()
|
||||
.toClientVersion(), packet.getRegistryData());
|
||||
SynchronizedRegistriesHandler.handleLegacyRegistries(user, packet, packet.getRegistryData());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,7 +104,7 @@ public class InternalPacketListener extends PacketListenerAbstract {
|
||||
user.setEntityId(joinGame.getEntityId());
|
||||
|
||||
if (joinGame.getDimensionCodec() != null) { // 1.16 to 1.20.1
|
||||
SynchronizedRegistriesHandler.handleLegacyRegistries(user, joinGame.getServerVersion().toClientVersion(),
|
||||
SynchronizedRegistriesHandler.handleLegacyRegistries(user, joinGame,
|
||||
joinGame.getDimensionCodec());
|
||||
}
|
||||
|
||||
|
||||
+13
-1
@@ -19,10 +19,12 @@
|
||||
package com.github.retrooper.packetevents.manager.player;
|
||||
|
||||
import com.github.retrooper.packetevents.PacketEvents;
|
||||
import com.github.retrooper.packetevents.event.ProtocolPacketEvent;
|
||||
import com.github.retrooper.packetevents.protocol.ConnectionState;
|
||||
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
|
||||
import com.github.retrooper.packetevents.protocol.player.User;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public interface PlayerManager {
|
||||
@@ -34,7 +36,17 @@ public interface PlayerManager {
|
||||
|
||||
User getUser(@NotNull Object player);
|
||||
|
||||
default ConnectionState getConnectionState(@NotNull Object player) {
|
||||
/**
|
||||
* <strong>WARNING</strong>: Usage of this method should be avoided. Please use either
|
||||
* {@link User#getDecoderState()} or {@link User#getEncoderState()}.<br>
|
||||
* To access the specific state a packet event was sent/received in, use {@link ProtocolPacketEvent#getConnectionState()}.
|
||||
* <p>
|
||||
* Since 1.20.2, the Minecraft protocol allows the decoder/encoder connection states to de-sync.
|
||||
*
|
||||
* @throws IllegalStateException if encoder/decoder connection states do not match
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
default ConnectionState getConnectionState(@NotNull Object player) throws IllegalStateException {
|
||||
return getUser(player).getConnectionState();
|
||||
}
|
||||
|
||||
|
||||
+23
@@ -33,8 +33,10 @@ import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public interface ProtocolManager {
|
||||
@ApiStatus.Internal
|
||||
Map<UUID, Object> CHANNELS = new ConcurrentHashMap<>();
|
||||
// Use SocketAddress because ProtocolLib wraps Channels with NettyChannelProxy class
|
||||
@ApiStatus.Internal
|
||||
Map<Object, User> USERS = new ConcurrentHashMap<>();
|
||||
|
||||
default Collection<User> getUsers() {
|
||||
@@ -150,11 +152,13 @@ public interface ProtocolManager {
|
||||
return USERS.get(pipeline);
|
||||
}
|
||||
|
||||
@ApiStatus.Internal
|
||||
default User removeUser(Object channel) {
|
||||
Object pipeline = ChannelHelper.getPipeline(channel);
|
||||
return USERS.remove(pipeline);
|
||||
}
|
||||
|
||||
@ApiStatus.Internal
|
||||
default void setUser(Object channel, User user) {
|
||||
synchronized (channel) {
|
||||
Object pipeline = ChannelHelper.getPipeline(channel);
|
||||
@@ -166,4 +170,23 @@ public interface ProtocolManager {
|
||||
default Object getChannel(UUID uuid) {
|
||||
return CHANNELS.get(uuid);
|
||||
}
|
||||
|
||||
@ApiStatus.Internal
|
||||
default void setChannel(UUID uuid, Object channel) {
|
||||
CHANNELS.put(uuid, channel);
|
||||
}
|
||||
|
||||
@ApiStatus.Internal
|
||||
default void removeChannel(Object channel) {
|
||||
CHANNELS.values().remove(channel);
|
||||
}
|
||||
|
||||
@ApiStatus.Internal
|
||||
default void removeChannelById(UUID uuid) {
|
||||
CHANNELS.remove(uuid);
|
||||
}
|
||||
|
||||
default boolean hasChannel(Object channel) {
|
||||
return CHANNELS.containsValue(channel);
|
||||
}
|
||||
}
|
||||
+3
-2
@@ -32,7 +32,8 @@ import org.jetbrains.annotations.NotNull;
|
||||
*/
|
||||
public enum ServerVersion {
|
||||
//TODO Rename to MinecraftVersion?
|
||||
V_1_7_10(5),
|
||||
V_1_7_2(4), V_1_7_4(4), V_1_7_5(4),
|
||||
V_1_7_6(5), V_1_7_7(5), V_1_7_8(5), V_1_7_9(5), V_1_7_10(5),
|
||||
V_1_8(47), V_1_8_3(47), V_1_8_8(47),
|
||||
V_1_9(107), V_1_9_1(108), V_1_9_2(109), V_1_9_4(110),
|
||||
//1.10 and 1.10.1 are redundant
|
||||
@@ -50,7 +51,7 @@ public enum ServerVersion {
|
||||
//1.20 and 1.20.1 have the same protocol version. 1.20.3 and 1.20.4 have the same protocol version. 1.20.5 and 1.20.6 have the same protocol version
|
||||
V_1_20(763), V_1_20_1(763), V_1_20_2(764), V_1_20_3(765), V_1_20_4(765), V_1_20_5(766), V_1_20_6(766),
|
||||
//1.21 and 1.21.1 have the same protocol version. 1.21.2 and 1.21.3 have the same protocol version
|
||||
V_1_21(767), V_1_21_1(767), V_1_21_2(768), V_1_21_3(768), V_1_21_4(769),
|
||||
V_1_21(767), V_1_21_1(767), V_1_21_2(768), V_1_21_3(768), V_1_21_4(769), V_1_21_5(770), V_1_21_6(771), V_1_21_7(772), V_1_21_8(772),
|
||||
//TODO UPDATE Add server version constant
|
||||
ERROR(-1, true);
|
||||
|
||||
|
||||
+2
@@ -31,4 +31,6 @@ public interface ByteBufAllocationOperator {
|
||||
|
||||
Object compositeBuffer();
|
||||
Object compositeBuffer(int maxNumComponents);
|
||||
|
||||
Object emptyBuffer();
|
||||
}
|
||||
@@ -239,6 +239,19 @@ public class ByteBufHelper {
|
||||
return PacketEvents.getAPI().getNettyManager().getByteBufOperator().resetWriterIndex(buffer);
|
||||
}
|
||||
|
||||
public static Object allocateNewBuffer(Object buffer) {
|
||||
return PacketEvents.getAPI().getNettyManager().getByteBufOperator().allocateNewBuffer(buffer);
|
||||
}
|
||||
|
||||
public static int getByteSize(int value) {
|
||||
for (int i = 1; i < 5; ++i) {
|
||||
if ((value & -1 << i * 7) == 0) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return 5;
|
||||
}
|
||||
|
||||
public static int readVarInt(Object buffer) {
|
||||
int value = 0;
|
||||
int length = 0;
|
||||
|
||||
@@ -74,6 +74,8 @@ public interface ByteBufOperator {
|
||||
Object markWriterIndex(Object buffer);
|
||||
Object resetWriterIndex(Object buffer);
|
||||
|
||||
Object allocateNewBuffer(Object buffer);
|
||||
|
||||
default float readFloat(Object buffer) {
|
||||
return Float.intBitsToFloat(readInt(buffer));
|
||||
}
|
||||
|
||||
+4
@@ -52,4 +52,8 @@ public class UnpooledByteBufAllocationHelper {
|
||||
public static Object compositeBuffer(int maxNumComponents) {
|
||||
return PacketEvents.getAPI().getNettyManager().getByteBufAllocationOperator().compositeBuffer(maxNumComponents);
|
||||
}
|
||||
|
||||
public static Object emptyBuffer() {
|
||||
return PacketEvents.getAPI().getNettyManager().getByteBufAllocationOperator().emptyBuffer();
|
||||
}
|
||||
}
|
||||
+144
@@ -0,0 +1,144 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.advancements;
|
||||
|
||||
import com.github.retrooper.packetevents.manager.server.ServerVersion;
|
||||
import com.github.retrooper.packetevents.resources.ResourceLocation;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class Advancement {
|
||||
|
||||
private @Nullable ResourceLocation parent;
|
||||
private @Nullable AdvancementDisplay display;
|
||||
/**
|
||||
* Removed with 1.20.2
|
||||
*/
|
||||
private List<String> criteria;
|
||||
private List<List<String>> requirements;
|
||||
/**
|
||||
* Added with 1.20
|
||||
*/
|
||||
private boolean sendsTelemetryData;
|
||||
|
||||
public Advancement(
|
||||
@Nullable ResourceLocation parent,
|
||||
@Nullable AdvancementDisplay display,
|
||||
List<List<String>> requirements,
|
||||
boolean sendsTelemetryData
|
||||
) {
|
||||
this(parent, display, Collections.emptyList(), requirements, sendsTelemetryData);
|
||||
}
|
||||
|
||||
@ApiStatus.Obsolete
|
||||
public Advancement(
|
||||
@Nullable ResourceLocation parent,
|
||||
@Nullable AdvancementDisplay display,
|
||||
List<String> criteria,
|
||||
List<List<String>> requirements,
|
||||
boolean sendsTelemetryData
|
||||
) {
|
||||
this.parent = parent;
|
||||
this.display = display;
|
||||
this.criteria = criteria;
|
||||
this.requirements = requirements;
|
||||
this.sendsTelemetryData = sendsTelemetryData;
|
||||
}
|
||||
|
||||
public static Advancement read(PacketWrapper<?> wrapper) {
|
||||
ResourceLocation parentId = wrapper.readOptional(ResourceLocation::read);
|
||||
AdvancementDisplay display = wrapper.readOptional(AdvancementDisplay::read);
|
||||
List<String> criteria = wrapper.getServerVersion().isOlderThan(ServerVersion.V_1_20_2)
|
||||
? wrapper.readList(PacketWrapper::readString) : null;
|
||||
List<List<String>> requirements = wrapper.readList(
|
||||
ew -> wrapper.readList(PacketWrapper::readString));
|
||||
boolean sendsTelemetryData = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_20)
|
||||
&& wrapper.readBoolean();
|
||||
return new Advancement(parentId, display, criteria, requirements, sendsTelemetryData);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, Advancement advancement) {
|
||||
wrapper.writeOptional(advancement.parent, ResourceLocation::write);
|
||||
wrapper.writeOptional(advancement.display, AdvancementDisplay::write);
|
||||
if (wrapper.getServerVersion().isOlderThan(ServerVersion.V_1_20_2)) {
|
||||
wrapper.writeList(advancement.criteria, PacketWrapper::writeString);
|
||||
}
|
||||
wrapper.writeList(advancement.getRequirements(), (ew, anyList) ->
|
||||
ew.writeList(anyList, PacketWrapper::writeString));
|
||||
if (wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_20)) {
|
||||
wrapper.writeBoolean(advancement.sendsTelemetryData);
|
||||
}
|
||||
}
|
||||
|
||||
public @Nullable ResourceLocation getParent() {
|
||||
return this.parent;
|
||||
}
|
||||
|
||||
public void setParent(@Nullable ResourceLocation parent) {
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
public @Nullable AdvancementDisplay getDisplay() {
|
||||
return this.display;
|
||||
}
|
||||
|
||||
public void setDisplay(@Nullable AdvancementDisplay display) {
|
||||
this.display = display;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removed with 1.20.2
|
||||
*/
|
||||
public List<String> getCriteria() {
|
||||
return this.criteria;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removed with 1.20.2
|
||||
*/
|
||||
public void setCriteria(List<String> criteria) {
|
||||
this.criteria = criteria;
|
||||
}
|
||||
|
||||
public List<List<String>> getRequirements() {
|
||||
return this.requirements;
|
||||
}
|
||||
|
||||
public void setRequirements(List<List<String>> requirements) {
|
||||
this.requirements = requirements;
|
||||
}
|
||||
|
||||
/**
|
||||
* Added with 1.20
|
||||
*/
|
||||
public boolean isSendsTelemetryData() {
|
||||
return this.sendsTelemetryData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Added with 1.20
|
||||
*/
|
||||
public void setSendsTelemetryData(boolean sendsTelemetryData) {
|
||||
this.sendsTelemetryData = sendsTelemetryData;
|
||||
}
|
||||
}
|
||||
+168
@@ -0,0 +1,168 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.advancements;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.item.ItemStack;
|
||||
import com.github.retrooper.packetevents.resources.ResourceLocation;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public final class AdvancementDisplay {
|
||||
|
||||
public static final int FLAG_HAS_BACKGROUND = 0b001;
|
||||
public static final int FLAG_SHOW_TOAST = 0b010;
|
||||
public static final int FLAG_HIDDEN = 0b100;
|
||||
|
||||
private Component title;
|
||||
private Component description;
|
||||
private ItemStack icon;
|
||||
private AdvancementType type;
|
||||
private boolean showToast;
|
||||
private boolean hidden;
|
||||
private @Nullable ResourceLocation background;
|
||||
private float x;
|
||||
private float y;
|
||||
|
||||
public AdvancementDisplay(Component title, Component description, ItemStack icon, AdvancementType type, @Nullable ResourceLocation background, boolean showToast,
|
||||
boolean hidden, float x, float y) {
|
||||
this.title = title;
|
||||
this.description = description;
|
||||
this.icon = icon;
|
||||
this.type = type;
|
||||
this.showToast = showToast;
|
||||
this.hidden = hidden;
|
||||
this.background = background;
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
public static AdvancementDisplay read(PacketWrapper<?> wrapper) {
|
||||
Component title = wrapper.readComponent();
|
||||
Component description = wrapper.readComponent();
|
||||
ItemStack icon = wrapper.readItemStack();
|
||||
AdvancementType type = wrapper.readEnum(AdvancementType.class);
|
||||
int flags = wrapper.readInt();
|
||||
ResourceLocation background = (flags & FLAG_HAS_BACKGROUND) != 0 ? ResourceLocation.read(wrapper) : null;
|
||||
boolean showToast = (flags & FLAG_SHOW_TOAST) != 0;
|
||||
boolean hidden = (flags & FLAG_HIDDEN) != 0;
|
||||
float x = wrapper.readFloat();
|
||||
float y = wrapper.readFloat();
|
||||
return new AdvancementDisplay(title, description, icon, type, background, showToast, hidden, x, y);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, AdvancementDisplay display) {
|
||||
wrapper.writeComponent(display.title);
|
||||
wrapper.writeComponent(display.description);
|
||||
wrapper.writeItemStack(display.icon);
|
||||
wrapper.writeEnum(display.type);
|
||||
wrapper.writeInt(display.packFlags());
|
||||
if (display.background != null) {
|
||||
ResourceLocation.write(wrapper, display.background);
|
||||
}
|
||||
wrapper.writeFloat(display.x);
|
||||
wrapper.writeFloat(display.y);
|
||||
}
|
||||
|
||||
public int packFlags() {
|
||||
int flags = 0;
|
||||
if (this.background != null) {
|
||||
flags |= FLAG_HAS_BACKGROUND;
|
||||
}
|
||||
if (this.showToast) {
|
||||
flags |= FLAG_SHOW_TOAST;
|
||||
}
|
||||
if (this.hidden) {
|
||||
flags |= FLAG_HIDDEN;
|
||||
}
|
||||
return flags;
|
||||
}
|
||||
|
||||
public Component getTitle() {
|
||||
return this.title;
|
||||
}
|
||||
|
||||
public void setTitle(Component title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public Component getDescription() {
|
||||
return this.description;
|
||||
}
|
||||
|
||||
public void setDescription(Component description) {
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public ItemStack getIcon() {
|
||||
return this.icon;
|
||||
}
|
||||
|
||||
public void setIcon(ItemStack icon) {
|
||||
this.icon = icon;
|
||||
}
|
||||
|
||||
public AdvancementType getType() {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
public void setType(AdvancementType type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public boolean isShowToast() {
|
||||
return this.showToast;
|
||||
}
|
||||
|
||||
public void setShowToast(boolean showToast) {
|
||||
this.showToast = showToast;
|
||||
}
|
||||
|
||||
public boolean isHidden() {
|
||||
return this.hidden;
|
||||
}
|
||||
|
||||
public void setHidden(boolean hidden) {
|
||||
this.hidden = hidden;
|
||||
}
|
||||
|
||||
public @Nullable ResourceLocation getBackground() {
|
||||
return this.background;
|
||||
}
|
||||
|
||||
public void setBackground(@Nullable ResourceLocation background) {
|
||||
this.background = background;
|
||||
}
|
||||
|
||||
public float getX() {
|
||||
return this.x;
|
||||
}
|
||||
|
||||
public void setX(float x) {
|
||||
this.x = x;
|
||||
}
|
||||
|
||||
public float getY() {
|
||||
return this.y;
|
||||
}
|
||||
|
||||
public void setY(float y) {
|
||||
this.y = y;
|
||||
}
|
||||
}
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.advancements;
|
||||
|
||||
import com.github.retrooper.packetevents.resources.ResourceLocation;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
public final class AdvancementHolder {
|
||||
|
||||
private ResourceLocation identifier;
|
||||
private Advancement advancement;
|
||||
|
||||
public AdvancementHolder(ResourceLocation identifier, Advancement advancement) {
|
||||
this.identifier = identifier;
|
||||
this.advancement = advancement;
|
||||
}
|
||||
|
||||
public static AdvancementHolder read(PacketWrapper<?> wrapper) {
|
||||
ResourceLocation identifier = wrapper.readIdentifier();
|
||||
Advancement advancement = Advancement.read(wrapper);
|
||||
return new AdvancementHolder(identifier, advancement);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, AdvancementHolder holder) {
|
||||
wrapper.writeIdentifier(holder.identifier);
|
||||
Advancement.write(wrapper, holder.advancement);
|
||||
}
|
||||
|
||||
public ResourceLocation getIdentifier() {
|
||||
return this.identifier;
|
||||
}
|
||||
|
||||
public void setIdentifier(ResourceLocation identifier) {
|
||||
this.identifier = identifier;
|
||||
}
|
||||
|
||||
public Advancement getAdvancement() {
|
||||
return this.advancement;
|
||||
}
|
||||
|
||||
public void setAdvancement(Advancement advancement) {
|
||||
this.advancement = advancement;
|
||||
}
|
||||
}
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.advancements;
|
||||
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jspecify.annotations.Nullable;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
public final class AdvancementProgress {
|
||||
|
||||
private Map<String, CriterionProgress> criteria;
|
||||
|
||||
public AdvancementProgress(Map<String, CriterionProgress> criteria) {
|
||||
this.criteria = criteria;
|
||||
}
|
||||
|
||||
public static AdvancementProgress read(PacketWrapper<?> wrapper) {
|
||||
Map<String, CriterionProgress> criteria = wrapper.readMap(PacketWrapper::readString, CriterionProgress::read);
|
||||
return new AdvancementProgress(criteria);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, AdvancementProgress progress) {
|
||||
wrapper.writeMap(progress.getCriteria(), PacketWrapper::writeString, CriterionProgress::write);
|
||||
}
|
||||
|
||||
public Map<String, CriterionProgress> getCriteria() {
|
||||
return this.criteria;
|
||||
}
|
||||
|
||||
public void setCriteria(Map<String, CriterionProgress> criteria) {
|
||||
this.criteria = criteria;
|
||||
}
|
||||
|
||||
public static final class CriterionProgress {
|
||||
|
||||
private @Nullable Long obtainedTimestamp;
|
||||
|
||||
public CriterionProgress(@Nullable Long obtainedTimestamp) {
|
||||
this.obtainedTimestamp = obtainedTimestamp;
|
||||
}
|
||||
|
||||
public static CriterionProgress read(PacketWrapper<?> wrapper) {
|
||||
return new CriterionProgress(wrapper.readOptional(PacketWrapper::readLong));
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, CriterionProgress progress) {
|
||||
wrapper.writeOptional(progress.obtainedTimestamp, PacketWrapper::writeLong);
|
||||
}
|
||||
|
||||
public @Nullable Long getObtainedTimestamp() {
|
||||
return this.obtainedTimestamp;
|
||||
}
|
||||
|
||||
public void setObtainedTimestamp(@Nullable Long obtainedTimestamp) {
|
||||
this.obtainedTimestamp = obtainedTimestamp;
|
||||
}
|
||||
}
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.advancements;
|
||||
|
||||
public enum AdvancementType {
|
||||
|
||||
TASK,
|
||||
CHALLENGE,
|
||||
GOAL,
|
||||
;
|
||||
}
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.attribute;
|
||||
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
@NullMarked
|
||||
public interface AttributeDisplay {
|
||||
|
||||
static AttributeDisplay read(PacketWrapper<?> wrapper) {
|
||||
AttributeDisplayType<?> type = wrapper.readMappedEntity(AttributeDisplayTypes.getRegistry());
|
||||
return type.read(wrapper);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked") // not unchecked
|
||||
static void write(PacketWrapper<?> wrapper, AttributeDisplay display) {
|
||||
wrapper.writeMappedEntity(display.getType());
|
||||
((AttributeDisplayType<? super AttributeDisplay>) display.getType()).write(wrapper, display);
|
||||
}
|
||||
|
||||
AttributeDisplayType<?> getType();
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.attribute;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.mapper.MappedEntity;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
@NullMarked
|
||||
public interface AttributeDisplayType<T extends AttributeDisplay> extends MappedEntity {
|
||||
|
||||
T read(PacketWrapper<?> wrapper);
|
||||
|
||||
void write(PacketWrapper<?> wrapper, T display);
|
||||
}
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.attribute;
|
||||
|
||||
import com.github.retrooper.packetevents.util.mappings.VersionedRegistry;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
@NullMarked
|
||||
public final class AttributeDisplayTypes {
|
||||
|
||||
private static final VersionedRegistry<AttributeDisplayType<?>> REGISTRY = new VersionedRegistry<>("attribute_display_type");
|
||||
|
||||
private AttributeDisplayTypes() {
|
||||
}
|
||||
|
||||
@ApiStatus.Internal
|
||||
public static <T extends AttributeDisplay> AttributeDisplayType<T> define(
|
||||
String name, PacketWrapper.Reader<T> reader, PacketWrapper.Writer<T> writer
|
||||
) {
|
||||
return REGISTRY.define(name, data ->
|
||||
new StaticAttributeDisplayType<>(data, reader, writer));
|
||||
}
|
||||
|
||||
public static VersionedRegistry<AttributeDisplayType<?>> getRegistry() {
|
||||
return REGISTRY;
|
||||
}
|
||||
|
||||
public static final AttributeDisplayType<DefaultAttributeDisplay> DEFAULT = define("default",
|
||||
DefaultAttributeDisplay::read, DefaultAttributeDisplay::write);
|
||||
public static final AttributeDisplayType<HiddenAttributeDisplay> HIDDEN = define("hidden",
|
||||
HiddenAttributeDisplay::read, HiddenAttributeDisplay::write);
|
||||
public static final AttributeDisplayType<OverrideAttributeDisplay> OVERRIDE = define("override",
|
||||
OverrideAttributeDisplay::read, OverrideAttributeDisplay::write);
|
||||
|
||||
static {
|
||||
REGISTRY.unloadMappings();
|
||||
}
|
||||
}
|
||||
+18
-3
@@ -26,8 +26,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public final class Attributes {
|
||||
|
||||
private static final VersionedRegistry<Attribute> REGISTRY = new VersionedRegistry<>(
|
||||
"attribute", "attribute/attribute_mappings");
|
||||
private static final VersionedRegistry<Attribute> REGISTRY = new VersionedRegistry<>("attribute");
|
||||
|
||||
private Attributes() {
|
||||
}
|
||||
@@ -50,7 +49,7 @@ public final class Attributes {
|
||||
if (normedName.startsWith(ResourceLocation.VANILLA_NAMESPACE + ":generic.")
|
||||
|| normedName.startsWith(ResourceLocation.VANILLA_NAMESPACE + ":player.")
|
||||
|| normedName.startsWith(ResourceLocation.VANILLA_NAMESPACE + ":zombie.")) {
|
||||
normedName = normedName.substring(name.indexOf('.') + 1);
|
||||
normedName = normedName.substring(normedName.indexOf('.') + 1);
|
||||
}
|
||||
return REGISTRY.getByName(normedName);
|
||||
}
|
||||
@@ -188,6 +187,22 @@ public final class Attributes {
|
||||
public static final Attribute TEMPT_RANGE = define("tempt_range",
|
||||
null, 10d, 0d, 2048d);
|
||||
|
||||
/**
|
||||
* Added with 1.21.6
|
||||
*/
|
||||
public static final Attribute CAMERA_DISTANCE = define("camera_distance",
|
||||
null, 4d, 0d, 32d);
|
||||
/**
|
||||
* Added with 1.21.6
|
||||
*/
|
||||
public static final Attribute WAYPOINT_TRANSMIT_RANGE = define("waypoint_transmit_range",
|
||||
null, 0d, 0d, 60_000_000d);
|
||||
/**
|
||||
* Added with 1.21.6
|
||||
*/
|
||||
public static final Attribute WAYPOINT_RECEIVE_RANGE = define("waypoint_receive_range",
|
||||
null, 0d, 0d, 60_000_000d);
|
||||
|
||||
/**
|
||||
* This attribute has been renamed in 1.20.5 to {@link #JUMP_STRENGTH}
|
||||
*/
|
||||
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.attribute;
|
||||
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
@NullMarked
|
||||
public class DefaultAttributeDisplay implements AttributeDisplay {
|
||||
|
||||
public static final DefaultAttributeDisplay INSTANCE = new DefaultAttributeDisplay();
|
||||
|
||||
private DefaultAttributeDisplay() {
|
||||
}
|
||||
|
||||
public static DefaultAttributeDisplay read(PacketWrapper<?> wrapper) {
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, DefaultAttributeDisplay display) {
|
||||
// NO-OP
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeDisplayType<?> getType() {
|
||||
return AttributeDisplayTypes.DEFAULT;
|
||||
}
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.attribute;
|
||||
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
@NullMarked
|
||||
public class HiddenAttributeDisplay implements AttributeDisplay {
|
||||
|
||||
public static final HiddenAttributeDisplay INSTANCE = new HiddenAttributeDisplay();
|
||||
|
||||
private HiddenAttributeDisplay() {
|
||||
}
|
||||
|
||||
public static HiddenAttributeDisplay read(PacketWrapper<?> wrapper) {
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, HiddenAttributeDisplay display) {
|
||||
// NO-OP
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeDisplayType<?> getType() {
|
||||
return AttributeDisplayTypes.HIDDEN;
|
||||
}
|
||||
}
|
||||
+64
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.attribute;
|
||||
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
@NullMarked
|
||||
public class OverrideAttributeDisplay implements AttributeDisplay {
|
||||
|
||||
private final Component component;
|
||||
|
||||
public OverrideAttributeDisplay(Component component) {
|
||||
this.component = component;
|
||||
}
|
||||
|
||||
public static OverrideAttributeDisplay read(PacketWrapper<?> wrapper) {
|
||||
return new OverrideAttributeDisplay(wrapper.readComponent());
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, OverrideAttributeDisplay display) {
|
||||
wrapper.writeComponent(display.component);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AttributeDisplayType<?> getType() {
|
||||
return AttributeDisplayTypes.OVERRIDE;
|
||||
}
|
||||
|
||||
public Component getComponent() {
|
||||
return this.component;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof OverrideAttributeDisplay)) return false;
|
||||
OverrideAttributeDisplay that = (OverrideAttributeDisplay) obj;
|
||||
return this.component.equals(that.component);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.component);
|
||||
}
|
||||
}
|
||||
+8
-4
@@ -22,6 +22,7 @@ import com.github.retrooper.packetevents.protocol.mapper.AbstractMappedEntity;
|
||||
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
|
||||
import com.github.retrooper.packetevents.resources.ResourceLocation;
|
||||
import com.github.retrooper.packetevents.util.mappings.TypesBuilderData;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class StaticAttribute extends AbstractMappedEntity implements Attribute {
|
||||
@@ -31,21 +32,24 @@ public class StaticAttribute extends AbstractMappedEntity implements Attribute {
|
||||
private final double minValue;
|
||||
private final double maxValue;
|
||||
|
||||
StaticAttribute(
|
||||
TypesBuilderData data, String legacyPrefix,
|
||||
@ApiStatus.Internal
|
||||
public StaticAttribute(
|
||||
@Nullable TypesBuilderData data, String legacyPrefix,
|
||||
double defaultValue, double minValue, double maxValue
|
||||
) {
|
||||
super(data);
|
||||
this.defaultValue = defaultValue;
|
||||
this.minValue = minValue;
|
||||
this.maxValue = maxValue;
|
||||
this.legacyName = legacyPrefix == null ? null : new ResourceLocation(
|
||||
this.legacyName = legacyPrefix == null || data == null ? null : new ResourceLocation(
|
||||
data.getName().getNamespace(), legacyPrefix + "." + data.getName().getKey());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceLocation getName(ClientVersion version) {
|
||||
assert this.data != null; // not marked as nullable in ctor
|
||||
if (this.data == null) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
return version.isNewerThanOrEquals(ClientVersion.V_1_21_2) || this.legacyName == null
|
||||
? this.data.getName() : this.legacyName;
|
||||
}
|
||||
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.attribute;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.mapper.AbstractMappedEntity;
|
||||
import com.github.retrooper.packetevents.util.mappings.TypesBuilderData;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper.Reader;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper.Writer;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
@NullMarked
|
||||
public class StaticAttributeDisplayType<T extends AttributeDisplay> extends AbstractMappedEntity implements AttributeDisplayType<T> {
|
||||
|
||||
private final Reader<T> reader;
|
||||
private final Writer<T> writer;
|
||||
|
||||
@ApiStatus.Internal
|
||||
public StaticAttributeDisplayType(@Nullable TypesBuilderData data, Reader<T> reader, Writer<T> writer) {
|
||||
super(data);
|
||||
this.reader = reader;
|
||||
this.writer = writer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public T read(PacketWrapper<?> wrapper) {
|
||||
return this.reader.apply(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(PacketWrapper<?> wrapper, T display) {
|
||||
this.writer.accept(wrapper, display);
|
||||
}
|
||||
}
|
||||
+13
-3
@@ -72,7 +72,12 @@ public class ChatTypeDecoration {
|
||||
wrapper.writeStyle(decoration.style);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static ChatTypeDecoration decode(NBT nbt, ClientVersion version) {
|
||||
return decode(nbt, PacketWrapper.createDummyWrapper(version));
|
||||
}
|
||||
|
||||
public static ChatTypeDecoration decode(NBT nbt, PacketWrapper<?> wrapper) {
|
||||
NBTCompound compound = (NBTCompound) nbt;
|
||||
String translationKey = compound.getStringTagValueOrThrow("translation_key");
|
||||
NBT paramsTag = compound.getTagOrThrow("parameters");
|
||||
@@ -90,11 +95,16 @@ public class ChatTypeDecoration {
|
||||
}
|
||||
NBTCompound styleTag = compound.getCompoundTagOrNull("style");
|
||||
Style style = styleTag == null ? empty() :
|
||||
AdventureSerializer.getNBTSerializer().deserializeStyle(styleTag);
|
||||
wrapper.getSerializers().nbt().deserializeStyle(styleTag, wrapper);
|
||||
return new ChatTypeDecoration(translationKey, params, style);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static NBT encode(ChatTypeDecoration decoration, ClientVersion version) {
|
||||
return encode(decoration, PacketWrapper.createDummyWrapper(version));
|
||||
}
|
||||
|
||||
public static NBT encode(ChatTypeDecoration decoration, PacketWrapper<?> wrapper) {
|
||||
NBTList<NBTString> paramsTag = NBTList.createStringList();
|
||||
for (Parameter param : decoration.parameters) {
|
||||
paramsTag.addTag(new NBTString(param.getId()));
|
||||
@@ -104,8 +114,8 @@ public class ChatTypeDecoration {
|
||||
compound.setTag("translation_key", new NBTString(decoration.translationKey));
|
||||
compound.setTag("parameters", paramsTag);
|
||||
if (!decoration.style.isEmpty()) {
|
||||
compound.setTag("style", AdventureSerializer.getNBTSerializer()
|
||||
.serializeStyle(decoration.style));
|
||||
compound.setTag("style", wrapper.getSerializers()
|
||||
.nbt().serializeStyle(decoration.style, wrapper));
|
||||
}
|
||||
return compound;
|
||||
}
|
||||
|
||||
@@ -31,8 +31,7 @@ import static com.github.retrooper.packetevents.protocol.chat.ChatTypeDecoration
|
||||
|
||||
public final class ChatTypes {
|
||||
|
||||
private static final VersionedRegistry<ChatType> REGISTRY = new VersionedRegistry<>(
|
||||
"chat_type", "chat/chat_type_mappings");
|
||||
private static final VersionedRegistry<ChatType> REGISTRY = new VersionedRegistry<>("chat_type");
|
||||
|
||||
private ChatTypes() {
|
||||
}
|
||||
|
||||
+19
@@ -1,5 +1,6 @@
|
||||
package com.github.retrooper.packetevents.protocol.chat;
|
||||
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.DataOutput;
|
||||
@@ -86,12 +87,23 @@ public class LastSeenMessages {
|
||||
}
|
||||
|
||||
public static class Update {
|
||||
|
||||
private final int offset;
|
||||
private final BitSet acknowledged;
|
||||
private final byte checksum;
|
||||
|
||||
/**
|
||||
* Checksum has been added with 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public Update(int offset, BitSet acknowledged) {
|
||||
this(offset, acknowledged, (byte) 0);
|
||||
}
|
||||
|
||||
public Update(int offset, BitSet acknowledged, byte checksum) {
|
||||
this.offset = offset;
|
||||
this.acknowledged = acknowledged;
|
||||
this.checksum = checksum;
|
||||
}
|
||||
|
||||
public int getOffset() {
|
||||
@@ -101,5 +113,12 @@ public class LastSeenMessages {
|
||||
public BitSet getAcknowledged() {
|
||||
return acknowledged;
|
||||
}
|
||||
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public byte getChecksum() {
|
||||
return this.checksum;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -28,6 +28,20 @@ import java.util.Optional;
|
||||
|
||||
public class Node {
|
||||
|
||||
public static final byte TYPE_MASK = 0b11;
|
||||
public static final byte TYPE_ROOT = 0b00;
|
||||
public static final byte TYPE_LITERAL = 0b01;
|
||||
public static final byte TYPE_ARGUMENT = 0b10;
|
||||
|
||||
public static final byte FLAG_MASK = ~TYPE_MASK;
|
||||
public static final byte FLAG_EXECUTABLE = 0b000100;
|
||||
public static final byte FLAG_REDIRECT = 0b001000;
|
||||
public static final byte FLAG_CUSTOM_SUGGESTIONS = 0b010000;
|
||||
/**
|
||||
* Added with 1.21.6
|
||||
*/
|
||||
public static final byte FLAG_RESTRICTED = 0b100000;
|
||||
|
||||
private byte flags;
|
||||
private List<Integer> children;
|
||||
private int redirectNodeIndex;
|
||||
|
||||
@@ -19,58 +19,56 @@
|
||||
package com.github.retrooper.packetevents.protocol.chat;
|
||||
|
||||
import com.github.retrooper.packetevents.manager.server.ServerVersion;
|
||||
import com.github.retrooper.packetevents.protocol.mapper.MappedEntity;
|
||||
import com.github.retrooper.packetevents.protocol.mapper.AbstractMappedEntity;
|
||||
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
|
||||
import com.github.retrooper.packetevents.resources.ResourceLocation;
|
||||
import com.github.retrooper.packetevents.util.mappings.MappingHelper;
|
||||
import com.github.retrooper.packetevents.util.mappings.TypesBuilder;
|
||||
import com.github.retrooper.packetevents.util.mappings.TypesBuilderData;
|
||||
import com.github.retrooper.packetevents.util.mappings.VersionedRegistry;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class Parsers {
|
||||
@NullMarked
|
||||
public final class Parsers {
|
||||
|
||||
private static final List<Parser> ALL_PARSERS = new ArrayList<>(); // support for old methods
|
||||
private static final Map<String, Parser> PARSER_MAP = new HashMap<>();
|
||||
private static final Map<Byte, Map<Integer, Parser>> PARSER_ID_MAP = new HashMap<>();
|
||||
private static final TypesBuilder TYPES_BUILDER = new TypesBuilder("command/argument_parser_mappings");
|
||||
private static final VersionedRegistry<Parser> REGISTRY = new VersionedRegistry<>("command_argument_type");
|
||||
|
||||
private Parsers() {
|
||||
}
|
||||
|
||||
@ApiStatus.Internal
|
||||
public static Parser define(String key) {
|
||||
return define(key, null, null);
|
||||
}
|
||||
|
||||
@ApiStatus.Internal
|
||||
public static Parser define(String key, @Nullable Reader reader, @Nullable Writer writer) {
|
||||
TypesBuilderData data = TYPES_BUILDER.define(key);
|
||||
Parser parser = new Parser(data, reader, writer);
|
||||
|
||||
ALL_PARSERS.add(parser);
|
||||
MappingHelper.registerMapping(TYPES_BUILDER, PARSER_MAP, PARSER_ID_MAP, parser);
|
||||
return parser;
|
||||
return REGISTRY.define(key, data -> new Parser(data, reader, writer));
|
||||
}
|
||||
|
||||
// with key
|
||||
public static Parser getByName(String name) {
|
||||
return PARSER_MAP.get(name);
|
||||
return REGISTRY.getByName(name);
|
||||
}
|
||||
|
||||
public static Parser getById(ClientVersion version, int id) {
|
||||
int index = TYPES_BUILDER.getDataIndex(version);
|
||||
Map<Integer, Parser> idMap = PARSER_ID_MAP.get((byte) index);
|
||||
return idMap.get(id);
|
||||
return REGISTRY.getById(version, id);
|
||||
}
|
||||
|
||||
public static List<Parser> getParsers() {
|
||||
return Collections.unmodifiableList(ALL_PARSERS);
|
||||
return new ArrayList<>(REGISTRY.getEntries());
|
||||
}
|
||||
|
||||
public static VersionedRegistry<Parser> getRegistry() {
|
||||
return REGISTRY;
|
||||
}
|
||||
|
||||
public static final Parser BRIGADIER_BOOL = define("brigadier:bool", null, null);
|
||||
@@ -152,8 +150,8 @@ public class Parsers {
|
||||
public static final Parser STYLE = define("style", null, null);
|
||||
public static final Parser MESSAGE = define("message", null, null);
|
||||
public static final Parser NBT_COMPOUND_TAG = define("nbt_compound_tag", null, null);
|
||||
@Deprecated
|
||||
public static final Parser NBT = NBT_COMPOUND_TAG;
|
||||
@ApiStatus.Obsolete
|
||||
public static final Parser NBT = define("nbt", null, null);
|
||||
public static final Parser NBT_TAG = define("nbt_tag", null, null);
|
||||
public static final Parser NBT_PATH = define("nbt_path", null, null);
|
||||
public static final Parser OBJECTIVE = define("objective", null, null);
|
||||
@@ -214,8 +212,25 @@ public class Parsers {
|
||||
public static final Parser LOOT_MODIFIER = define("loot_modifier", null, null);
|
||||
public static final Parser UUID = define("uuid", null, null);
|
||||
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final Parser RESOURCE_SELECTOR = define("resource_selector",
|
||||
wrapper -> Collections.singletonList(wrapper.readIdentifier()),
|
||||
(wrapper, value) -> wrapper.writeIdentifier((ResourceLocation) value.get(0))
|
||||
);
|
||||
|
||||
/**
|
||||
* Added with 1.21.6
|
||||
*/
|
||||
public static final Parser HEX_COLOR = define("hex_color", null, null);
|
||||
/**
|
||||
* Added with 1.21.6
|
||||
*/
|
||||
public static final Parser DIALOG = define("dialog", null, null);
|
||||
|
||||
static {
|
||||
TYPES_BUILDER.unloadFileMappings();
|
||||
REGISTRY.unloadMappings();
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
@@ -224,9 +239,8 @@ public class Parsers {
|
||||
@FunctionalInterface
|
||||
public interface Writer extends BiConsumer<PacketWrapper<?>, List<Object>> {}
|
||||
|
||||
public static final class Parser implements MappedEntity {
|
||||
public static final class Parser extends AbstractMappedEntity {
|
||||
|
||||
private final TypesBuilderData data;
|
||||
private final Reader reader;
|
||||
private final Writer writer;
|
||||
|
||||
@@ -239,8 +253,9 @@ public class Parsers {
|
||||
);
|
||||
}
|
||||
|
||||
private Parser(TypesBuilderData data, @Nullable Reader reader, Writer writer) {
|
||||
this.data = data;
|
||||
@ApiStatus.Internal
|
||||
public Parser(@Nullable TypesBuilderData data, @Nullable Reader reader, @Nullable Writer writer) {
|
||||
super(data);
|
||||
this.reader = reader;
|
||||
this.writer = writer;
|
||||
}
|
||||
@@ -257,24 +272,5 @@ public class Parsers {
|
||||
this.writer.accept(wrapper, properties);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResourceLocation getName() {
|
||||
return this.data.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getId(ClientVersion version) {
|
||||
int index = TYPES_BUILDER.getDataIndex(version);
|
||||
return this.data.getData()[index];
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (obj instanceof Parser) {
|
||||
return this.getName().equals(((Parser) obj).getName());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ package com.github.retrooper.packetevents.protocol.chat;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.mapper.AbstractMappedEntity;
|
||||
import com.github.retrooper.packetevents.util.mappings.TypesBuilderData;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.annotations.UnknownNullability;
|
||||
|
||||
@@ -39,6 +40,7 @@ public class StaticChatType extends AbstractMappedEntity implements ChatType {
|
||||
this(null, chatDecoration, null, narrationDecoration, null);
|
||||
}
|
||||
|
||||
@ApiStatus.Internal
|
||||
public StaticChatType(
|
||||
@Nullable TypesBuilderData data,
|
||||
ChatTypeDecoration chatDecoration,
|
||||
@@ -56,6 +58,7 @@ public class StaticChatType extends AbstractMappedEntity implements ChatType {
|
||||
this(null, chatDecoration, overlayDecoration, narrationDecoration, narrationPriority);
|
||||
}
|
||||
|
||||
@ApiStatus.Internal
|
||||
public StaticChatType(
|
||||
@Nullable TypesBuilderData data,
|
||||
@UnknownNullability("only nullable for 1.19") ChatTypeDecoration chatDecoration,
|
||||
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.chat.clickevent;
|
||||
|
||||
import com.github.retrooper.packetevents.manager.server.ServerVersion;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTCompound;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTInt;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTString;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
@NullMarked
|
||||
public class ChangePageClickEvent implements ClickEvent {
|
||||
|
||||
private final int page;
|
||||
|
||||
@ApiStatus.Obsolete
|
||||
public ChangePageClickEvent(String page) {
|
||||
this(Integer.parseInt(page));
|
||||
}
|
||||
|
||||
public ChangePageClickEvent(int page) {
|
||||
this.page = page;
|
||||
}
|
||||
|
||||
public static ChangePageClickEvent decode(NBTCompound compound, PacketWrapper<?> wrapper) {
|
||||
int page = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5)
|
||||
? compound.getNumberTagValueOrThrow("page").intValue()
|
||||
: Integer.parseInt(compound.getStringTagValueOrThrow("value"));
|
||||
return new ChangePageClickEvent(page);
|
||||
}
|
||||
|
||||
public static void encode(NBTCompound compound, PacketWrapper<?> wrapper, ChangePageClickEvent clickEvent) {
|
||||
if (wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5)) {
|
||||
compound.setTag("page", new NBTInt(clickEvent.page));
|
||||
} else {
|
||||
compound.setTag("value", new NBTString(Integer.toString(clickEvent.page)));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClickEventAction<?> getAction() {
|
||||
return ClickEventActions.CHANGE_PAGE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public net.kyori.adventure.text.event.ClickEvent asAdventure() {
|
||||
return net.kyori.adventure.text.event.ClickEvent.changePage(this.page);
|
||||
}
|
||||
|
||||
public int getPage() {
|
||||
return this.page;
|
||||
}
|
||||
}
|
||||
+76
@@ -0,0 +1,76 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.chat.clickevent;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.dialog.Dialog;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTCompound;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTEnd;
|
||||
import com.github.retrooper.packetevents.resources.ResourceLocation;
|
||||
import com.github.retrooper.packetevents.util.adventure.NbtTagHolder;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import net.kyori.adventure.text.event.ClickEvent.Payload;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
@NullMarked
|
||||
public interface ClickEvent {
|
||||
|
||||
static ClickEvent decode(NBTCompound compound, PacketWrapper<?> wrapper) {
|
||||
String actionName = compound.getStringTagValueOrThrow("action");
|
||||
ClickEventAction<?> action = ClickEventActions.getRegistry().getByNameOrThrow(actionName);
|
||||
return action.decode(compound, wrapper);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked") // not unchecked
|
||||
static void encode(NBTCompound compound, PacketWrapper<?> wrapper, ClickEvent clickEvent) {
|
||||
compound.set("action", clickEvent.getAction().getName(), ResourceLocation::encode, wrapper);
|
||||
((ClickEventAction<? super ClickEvent>) clickEvent.getAction()).encode(compound, wrapper, clickEvent);
|
||||
}
|
||||
|
||||
ClickEventAction<?> getAction();
|
||||
|
||||
static ClickEvent fromAdventure(net.kyori.adventure.text.event.ClickEvent clickEvent) {
|
||||
switch (clickEvent.action()) {
|
||||
case OPEN_URL:
|
||||
return new OpenUrlClickEvent(clickEvent.value());
|
||||
case OPEN_FILE:
|
||||
return new OpenFileClickEvent(clickEvent.value());
|
||||
case RUN_COMMAND:
|
||||
return new RunCommandClickEvent(clickEvent.value());
|
||||
case SUGGEST_COMMAND:
|
||||
return new SuggestCommandClickEvent(clickEvent.value());
|
||||
case CHANGE_PAGE:
|
||||
return new ChangePageClickEvent(clickEvent.value());
|
||||
case COPY_TO_CLIPBOARD:
|
||||
return new CopyToClipboardClickEvent(clickEvent.value());
|
||||
case SHOW_DIALOG:
|
||||
return new ShowDialogClickEvent((Dialog) ((Payload.Dialog) clickEvent.payload()).dialog());
|
||||
case CUSTOM:
|
||||
Payload.Custom payload = (Payload.Custom) clickEvent.payload();
|
||||
NbtTagHolder nbtTag = (NbtTagHolder) payload.nbt();
|
||||
return new CustomClickEvent(
|
||||
new ResourceLocation(payload.key()),
|
||||
nbtTag.getTag() instanceof NBTEnd ? null : nbtTag.getTag()
|
||||
);
|
||||
default:
|
||||
throw new UnsupportedOperationException("Unsupported clickevent: " + clickEvent);
|
||||
}
|
||||
}
|
||||
|
||||
net.kyori.adventure.text.event.ClickEvent asAdventure();
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.chat.clickevent;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.mapper.MappedEntity;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTCompound;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
@NullMarked
|
||||
public interface ClickEventAction<T extends ClickEvent> extends MappedEntity {
|
||||
|
||||
boolean isAllowFromServer();
|
||||
|
||||
T decode(NBTCompound compound, PacketWrapper<?> wrapper);
|
||||
|
||||
void encode(NBTCompound compound, PacketWrapper<?> wrapper, T clickEvent);
|
||||
}
|
||||
+89
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.chat.clickevent;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.util.NbtMapDecoder;
|
||||
import com.github.retrooper.packetevents.protocol.util.NbtMapEncoder;
|
||||
import com.github.retrooper.packetevents.util.mappings.VersionedRegistry;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
@NullMarked
|
||||
public final class ClickEventActions {
|
||||
|
||||
private static final VersionedRegistry<ClickEventAction<?>> REGISTRY = new VersionedRegistry<>("click_event_action");
|
||||
|
||||
private ClickEventActions() {
|
||||
}
|
||||
|
||||
@ApiStatus.Internal
|
||||
public static <T extends ClickEvent> ClickEventAction<T> define(
|
||||
String name, boolean allowFromServer,
|
||||
NbtMapDecoder<T> decoder, NbtMapEncoder<T> encoder
|
||||
) {
|
||||
return REGISTRY.define(name, data -> new StaticClickEventAction<>(
|
||||
data, allowFromServer, decoder, encoder));
|
||||
}
|
||||
|
||||
public static VersionedRegistry<ClickEventAction<?>> getRegistry() {
|
||||
return REGISTRY;
|
||||
}
|
||||
|
||||
public static final ClickEventAction<OpenUrlClickEvent> OPEN_URL = define("open_url", true,
|
||||
OpenUrlClickEvent::decode, OpenUrlClickEvent::encode);
|
||||
public static final ClickEventAction<OpenFileClickEvent> OPEN_FILE = define("open_file", false,
|
||||
OpenFileClickEvent::decode, OpenFileClickEvent::encode);
|
||||
public static final ClickEventAction<RunCommandClickEvent> RUN_COMMAND = define("run_command", true,
|
||||
RunCommandClickEvent::decode, RunCommandClickEvent::encode);
|
||||
/**
|
||||
* Removed in 1.9
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public static final ClickEventAction<TwitchUserInfoClickEvent> TWITCH_USER_INFO = define("twitch_user_info", false,
|
||||
TwitchUserInfoClickEvent::decode, TwitchUserInfoClickEvent::encode);
|
||||
public static final ClickEventAction<SuggestCommandClickEvent> SUGGEST_COMMAND = define("suggest_command", true,
|
||||
SuggestCommandClickEvent::decode, SuggestCommandClickEvent::encode);
|
||||
|
||||
/**
|
||||
* Added with 1.8
|
||||
*/
|
||||
public static final ClickEventAction<ChangePageClickEvent> CHANGE_PAGE = define("change_page", true,
|
||||
ChangePageClickEvent::decode, ChangePageClickEvent::encode);
|
||||
|
||||
/**
|
||||
* Added with 1.15
|
||||
*/
|
||||
public static final ClickEventAction<CopyToClipboardClickEvent> COPY_TO_CLIPBOARD = define("copy_to_clipboard", true,
|
||||
CopyToClipboardClickEvent::decode, CopyToClipboardClickEvent::encode);
|
||||
|
||||
/**
|
||||
* Added with 1.21.6
|
||||
*/
|
||||
public static final ClickEventAction<ShowDialogClickEvent> SHOW_DIALOG = define("show_dialog", true,
|
||||
ShowDialogClickEvent::decode, ShowDialogClickEvent::encode);
|
||||
/**
|
||||
* Added with 1.21.6
|
||||
*/
|
||||
public static final ClickEventAction<CustomClickEvent> CUSTOM = define("custom", true,
|
||||
CustomClickEvent::decode, CustomClickEvent::encode);
|
||||
|
||||
static {
|
||||
REGISTRY.unloadMappings();
|
||||
}
|
||||
}
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.chat.clickevent;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTCompound;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTString;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
@NullMarked
|
||||
public class CopyToClipboardClickEvent implements ClickEvent {
|
||||
|
||||
private final String value;
|
||||
|
||||
public CopyToClipboardClickEvent(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public static CopyToClipboardClickEvent decode(NBTCompound compound, PacketWrapper<?> wrapper) {
|
||||
String value = compound.getStringTagValueOrThrow("value");
|
||||
return new CopyToClipboardClickEvent(value);
|
||||
}
|
||||
|
||||
public static void encode(NBTCompound compound, PacketWrapper<?> wrapper, CopyToClipboardClickEvent clickEvent) {
|
||||
compound.setTag("value", new NBTString(clickEvent.value));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClickEventAction<?> getAction() {
|
||||
return ClickEventActions.COPY_TO_CLIPBOARD;
|
||||
}
|
||||
|
||||
@Override
|
||||
public net.kyori.adventure.text.event.ClickEvent asAdventure() {
|
||||
return net.kyori.adventure.text.event.ClickEvent.copyToClipboard(this.value);
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return this.value;
|
||||
}
|
||||
}
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.chat.clickevent;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBT;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTCompound;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTEnd;
|
||||
import com.github.retrooper.packetevents.resources.ResourceLocation;
|
||||
import com.github.retrooper.packetevents.util.adventure.NbtTagHolder;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
import org.jspecify.annotations.Nullable;
|
||||
|
||||
@NullMarked
|
||||
public class CustomClickEvent implements ClickEvent {
|
||||
|
||||
private final ResourceLocation id;
|
||||
private final @Nullable NBT payload;
|
||||
|
||||
public CustomClickEvent(ResourceLocation id, @Nullable NBT payload) {
|
||||
this.id = id;
|
||||
this.payload = payload;
|
||||
}
|
||||
|
||||
public static CustomClickEvent decode(NBTCompound compound, PacketWrapper<?> wrapper) {
|
||||
ResourceLocation id = compound.getOrThrow("id", ResourceLocation::decode, wrapper);
|
||||
NBT payload = compound.getTagOrNull("payload");
|
||||
return new CustomClickEvent(id, payload);
|
||||
}
|
||||
|
||||
public static void encode(NBTCompound compound, PacketWrapper<?> wrapper, CustomClickEvent clickEvent) {
|
||||
compound.set("id", clickEvent.id, ResourceLocation::encode, wrapper);
|
||||
if (clickEvent.payload != null) {
|
||||
compound.setTag("payload", clickEvent.payload);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClickEventAction<?> getAction() {
|
||||
return ClickEventActions.CUSTOM;
|
||||
}
|
||||
|
||||
@Override
|
||||
public net.kyori.adventure.text.event.ClickEvent asAdventure() {
|
||||
return net.kyori.adventure.text.event.ClickEvent.custom(
|
||||
this.id.key(), new NbtTagHolder(this.payload != null ? this.payload : NBTEnd.INSTANCE));
|
||||
}
|
||||
|
||||
public ResourceLocation getId() {
|
||||
return this.id;
|
||||
}
|
||||
|
||||
public @Nullable NBT getPayload() {
|
||||
return this.payload;
|
||||
}
|
||||
}
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.chat.clickevent;
|
||||
|
||||
import com.github.retrooper.packetevents.manager.server.ServerVersion;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTCompound;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTString;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
@NullMarked
|
||||
public class OpenFileClickEvent implements ClickEvent {
|
||||
|
||||
private final String path;
|
||||
|
||||
public OpenFileClickEvent(String path) {
|
||||
this.path = path;
|
||||
}
|
||||
|
||||
public static OpenFileClickEvent decode(NBTCompound compound, PacketWrapper<?> wrapper) {
|
||||
boolean v1215 = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5);
|
||||
String path = compound.getStringTagValueOrThrow(v1215 ? "path" : "value");
|
||||
return new OpenFileClickEvent(path);
|
||||
}
|
||||
|
||||
public static void encode(NBTCompound compound, PacketWrapper<?> wrapper, OpenFileClickEvent clickEvent) {
|
||||
boolean v1215 = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5);
|
||||
compound.setTag(v1215 ? "path" : "value", new NBTString(clickEvent.path));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClickEventAction<?> getAction() {
|
||||
return ClickEventActions.OPEN_FILE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public net.kyori.adventure.text.event.ClickEvent asAdventure() {
|
||||
return net.kyori.adventure.text.event.ClickEvent.openFile(this.path);
|
||||
}
|
||||
|
||||
public String getPath() {
|
||||
return this.path;
|
||||
}
|
||||
}
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.chat.clickevent;
|
||||
|
||||
import com.github.retrooper.packetevents.manager.server.ServerVersion;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTCompound;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTString;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
@NullMarked
|
||||
public class OpenUrlClickEvent implements ClickEvent {
|
||||
|
||||
private final String url;
|
||||
|
||||
public OpenUrlClickEvent(String url) {
|
||||
this.url = url;
|
||||
}
|
||||
|
||||
public static OpenUrlClickEvent decode(NBTCompound compound, PacketWrapper<?> wrapper) {
|
||||
boolean v1215 = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5);
|
||||
String url = compound.getStringTagValueOrThrow(v1215 ? "url" : "value");
|
||||
return new OpenUrlClickEvent(url);
|
||||
}
|
||||
|
||||
public static void encode(NBTCompound compound, PacketWrapper<?> wrapper, OpenUrlClickEvent clickEvent) {
|
||||
boolean v1215 = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5);
|
||||
compound.setTag(v1215 ? "url" : "value", new NBTString(clickEvent.url));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClickEventAction<?> getAction() {
|
||||
return ClickEventActions.OPEN_URL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public net.kyori.adventure.text.event.ClickEvent asAdventure() {
|
||||
return net.kyori.adventure.text.event.ClickEvent.openUrl(this.url);
|
||||
}
|
||||
|
||||
public String getUrl() {
|
||||
return this.url;
|
||||
}
|
||||
}
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.chat.clickevent;
|
||||
|
||||
import com.github.retrooper.packetevents.manager.server.ServerVersion;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTCompound;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTString;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
@NullMarked
|
||||
public class RunCommandClickEvent implements ClickEvent {
|
||||
|
||||
private final String command;
|
||||
|
||||
public RunCommandClickEvent(String command) {
|
||||
this.command = command;
|
||||
}
|
||||
|
||||
public static RunCommandClickEvent decode(NBTCompound compound, PacketWrapper<?> wrapper) {
|
||||
boolean v1215 = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5);
|
||||
String command = compound.getStringTagValueOrThrow(v1215 ? "command" : "value");
|
||||
return new RunCommandClickEvent(command);
|
||||
}
|
||||
|
||||
public static void encode(NBTCompound compound, PacketWrapper<?> wrapper, RunCommandClickEvent clickEvent) {
|
||||
boolean v1215 = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5);
|
||||
compound.setTag(v1215 ? "command" : "value", new NBTString(clickEvent.command));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClickEventAction<?> getAction() {
|
||||
return ClickEventActions.RUN_COMMAND;
|
||||
}
|
||||
|
||||
@Override
|
||||
public net.kyori.adventure.text.event.ClickEvent asAdventure() {
|
||||
return net.kyori.adventure.text.event.ClickEvent.runCommand(this.command);
|
||||
}
|
||||
|
||||
public String getCommand() {
|
||||
return this.command;
|
||||
}
|
||||
}
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.chat.clickevent;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.dialog.Dialog;
|
||||
import com.github.retrooper.packetevents.protocol.dialog.Dialogs;
|
||||
import com.github.retrooper.packetevents.protocol.mapper.MappedEntityRef;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTCompound;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
@NullMarked
|
||||
public class ShowDialogClickEvent implements ClickEvent {
|
||||
|
||||
private final MappedEntityRef<Dialog> dialog;
|
||||
|
||||
public ShowDialogClickEvent(Dialog dialog) {
|
||||
this(new MappedEntityRef.Static<>(dialog));
|
||||
}
|
||||
|
||||
public ShowDialogClickEvent(MappedEntityRef<Dialog> dialog) {
|
||||
this.dialog = dialog;
|
||||
}
|
||||
|
||||
public static ShowDialogClickEvent decode(NBTCompound compound, PacketWrapper<?> wrapper) {
|
||||
MappedEntityRef<Dialog> dialog = MappedEntityRef.decode(compound.getTagOrThrow("dialog"),
|
||||
Dialogs.getRegistry(), Dialog::decode, wrapper);
|
||||
return new ShowDialogClickEvent(dialog);
|
||||
}
|
||||
|
||||
public static void encode(NBTCompound compound, PacketWrapper<?> wrapper, ShowDialogClickEvent clickEvent) {
|
||||
compound.setTag("dialog", MappedEntityRef.encode(wrapper, Dialog::encode, clickEvent.dialog));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClickEventAction<?> getAction() {
|
||||
return ClickEventActions.SHOW_DIALOG;
|
||||
}
|
||||
|
||||
@Override
|
||||
public net.kyori.adventure.text.event.ClickEvent asAdventure() {
|
||||
return net.kyori.adventure.text.event.ClickEvent.showDialog(this.dialog.get());
|
||||
}
|
||||
|
||||
public MappedEntityRef<Dialog> getDialogRef() {
|
||||
return this.dialog;
|
||||
}
|
||||
|
||||
public Dialog getDialog() {
|
||||
return this.dialog.get();
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.chat.clickevent;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.mapper.AbstractMappedEntity;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTCompound;
|
||||
import com.github.retrooper.packetevents.protocol.util.NbtMapDecoder;
|
||||
import com.github.retrooper.packetevents.protocol.util.NbtMapEncoder;
|
||||
import com.github.retrooper.packetevents.util.mappings.TypesBuilderData;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
@NullMarked
|
||||
public class StaticClickEventAction<T extends ClickEvent> extends AbstractMappedEntity implements ClickEventAction<T> {
|
||||
|
||||
private final boolean allowFromServer;
|
||||
private final NbtMapDecoder<T> decoder;
|
||||
private final NbtMapEncoder<T> encoder;
|
||||
|
||||
@ApiStatus.Internal
|
||||
public StaticClickEventAction(
|
||||
@Nullable TypesBuilderData data, boolean allowFromServer,
|
||||
NbtMapDecoder<T> decoder, NbtMapEncoder<T> encoder
|
||||
) {
|
||||
super(data);
|
||||
this.allowFromServer = allowFromServer;
|
||||
this.decoder = decoder;
|
||||
this.encoder = encoder;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAllowFromServer() {
|
||||
return this.allowFromServer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public T decode(NBTCompound compound, PacketWrapper<?> wrapper) {
|
||||
return this.decoder.decode(compound, wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void encode(NBTCompound compound, PacketWrapper<?> wrapper, T clickEvent) {
|
||||
this.encoder.encode(compound, wrapper, clickEvent);
|
||||
}
|
||||
}
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.chat.clickevent;
|
||||
|
||||
import com.github.retrooper.packetevents.manager.server.ServerVersion;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTCompound;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTString;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
@NullMarked
|
||||
public class SuggestCommandClickEvent implements ClickEvent {
|
||||
|
||||
private final String command;
|
||||
|
||||
public SuggestCommandClickEvent(String command) {
|
||||
this.command = command;
|
||||
}
|
||||
|
||||
public static SuggestCommandClickEvent decode(NBTCompound compound, PacketWrapper<?> wrapper) {
|
||||
boolean v1215 = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5);
|
||||
String command = compound.getStringTagValueOrThrow(v1215 ? "command" : "value");
|
||||
return new SuggestCommandClickEvent(command);
|
||||
}
|
||||
|
||||
public static void encode(NBTCompound compound, PacketWrapper<?> wrapper, SuggestCommandClickEvent clickEvent) {
|
||||
boolean v1215 = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5);
|
||||
compound.setTag(v1215 ? "command" : "value", new NBTString(clickEvent.command));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClickEventAction<?> getAction() {
|
||||
return ClickEventActions.SUGGEST_COMMAND;
|
||||
}
|
||||
|
||||
@Override
|
||||
public net.kyori.adventure.text.event.ClickEvent asAdventure() {
|
||||
return net.kyori.adventure.text.event.ClickEvent.suggestCommand(this.command);
|
||||
}
|
||||
|
||||
public String getCommand() {
|
||||
return this.command;
|
||||
}
|
||||
}
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.chat.clickevent;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTCompound;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTString;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
/**
|
||||
* Removed in 1.9
|
||||
*/
|
||||
@NullMarked
|
||||
@ApiStatus.Obsolete
|
||||
public class TwitchUserInfoClickEvent implements ClickEvent {
|
||||
|
||||
private final String value;
|
||||
|
||||
public TwitchUserInfoClickEvent(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public static TwitchUserInfoClickEvent decode(NBTCompound compound, PacketWrapper<?> wrapper) {
|
||||
String value = compound.getStringTagValueOrThrow("value");
|
||||
return new TwitchUserInfoClickEvent(value);
|
||||
}
|
||||
|
||||
public static void encode(NBTCompound compound, PacketWrapper<?> wrapper, TwitchUserInfoClickEvent clickEvent) {
|
||||
compound.setTag("value", new NBTString(clickEvent.value));
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClickEventAction<?> getAction() {
|
||||
return ClickEventActions.TWITCH_USER_INFO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public net.kyori.adventure.text.event.ClickEvent asAdventure() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return this.value;
|
||||
}
|
||||
}
|
||||
+12
-2
@@ -19,6 +19,8 @@
|
||||
package com.github.retrooper.packetevents.protocol.chat.message;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.chat.ChatType;
|
||||
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
|
||||
import com.github.retrooper.packetevents.util.adventure.AdventureSerializer;
|
||||
import net.kyori.adventure.text.Component;
|
||||
|
||||
public class ChatMessage {
|
||||
@@ -34,14 +36,22 @@ public class ChatMessage {
|
||||
return chatContent;
|
||||
}
|
||||
|
||||
public ChatType getType() {
|
||||
return type;
|
||||
public String getChatContentJson(ClientVersion version) {
|
||||
return AdventureSerializer.serializer(version).asJson(this.getChatContent());
|
||||
}
|
||||
|
||||
public void setChatContent(Component chatContent) {
|
||||
this.chatContent = chatContent;
|
||||
}
|
||||
|
||||
public void setChatContentJson(ClientVersion version, String json) {
|
||||
this.setChatContent(AdventureSerializer.serializer(version).fromJson(json));
|
||||
}
|
||||
|
||||
public ChatType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(ChatType type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
-1
@@ -10,7 +10,6 @@ import org.jetbrains.annotations.Nullable;
|
||||
import java.time.Instant;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
//We'll extend ChatMessage_v1_16 for now, hopefully no breaking changes in the future
|
||||
public class ChatMessage_v1_19_3 extends ChatMessage_v1_16 {
|
||||
int index;
|
||||
byte[] signature;
|
||||
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.chat.message;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.chat.ChatType;
|
||||
import com.github.retrooper.packetevents.protocol.chat.LastSeenMessages;
|
||||
import com.github.retrooper.packetevents.protocol.chat.filter.FilterMask;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.UUID;
|
||||
|
||||
//We'll extend ChatMessage_v1_19_3 for now, hopefully no breaking changes in the future
|
||||
public class ChatMessage_v1_21_5 extends ChatMessage_v1_19_3 {
|
||||
|
||||
int globalIndex;
|
||||
|
||||
public ChatMessage_v1_21_5(int globalIndex, UUID senderUUID, int index, byte[] signature, String plainContent,
|
||||
Instant timestamp, long salt, LastSeenMessages.Packed lastSeenMessagesPacked, @Nullable Component unsignedChatContent,
|
||||
FilterMask filterMask, ChatType.Bound chatFormatting) {
|
||||
super(senderUUID, index, signature, plainContent, timestamp, salt, lastSeenMessagesPacked, unsignedChatContent, filterMask, chatFormatting);
|
||||
this.globalIndex = globalIndex;
|
||||
}
|
||||
|
||||
public int getGlobalIndex() {
|
||||
return this.globalIndex;
|
||||
}
|
||||
|
||||
public void setGlobalIndex(int globalIndex) {
|
||||
this.globalIndex = globalIndex;
|
||||
}
|
||||
}
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.chat.message.reader.impl;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.chat.ChatType;
|
||||
import com.github.retrooper.packetevents.protocol.chat.LastSeenMessages;
|
||||
import com.github.retrooper.packetevents.protocol.chat.filter.FilterMask;
|
||||
import com.github.retrooper.packetevents.protocol.chat.message.ChatMessage;
|
||||
import com.github.retrooper.packetevents.protocol.chat.message.ChatMessage_v1_21_5;
|
||||
import com.github.retrooper.packetevents.protocol.chat.message.reader.ChatMessageProcessor;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.UUID;
|
||||
|
||||
public class ChatMessageProcessor_v1_21_5 implements ChatMessageProcessor {
|
||||
|
||||
@Override
|
||||
public ChatMessage readChatMessage(@NotNull PacketWrapper<?> wrapper) {
|
||||
int globalIndex = wrapper.readVarInt();
|
||||
UUID senderUUID = wrapper.readUUID();
|
||||
int index = wrapper.readVarInt();
|
||||
byte[] signature = wrapper.readOptional((w) -> w.readBytes(256));
|
||||
String plainContent = wrapper.readString(256);
|
||||
Instant timestamp = wrapper.readTimestamp();
|
||||
long salt = wrapper.readLong();
|
||||
LastSeenMessages.Packed lastSeenMessagesPacked = wrapper.readLastSeenMessagesPacked();
|
||||
Component unsignedChatContent = wrapper.readOptional(PacketWrapper::readComponent);
|
||||
FilterMask filterMask = wrapper.readFilterMask();
|
||||
ChatType.Bound chatType = wrapper.readChatTypeBoundNetwork();
|
||||
|
||||
return new ChatMessage_v1_21_5(globalIndex, senderUUID, index, signature, plainContent, timestamp, salt, lastSeenMessagesPacked, unsignedChatContent, filterMask, chatType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeChatMessage(@NotNull PacketWrapper<?> wrapper, @NotNull ChatMessage data) {
|
||||
ChatMessage_v1_21_5 newData = (ChatMessage_v1_21_5) data;
|
||||
wrapper.writeVarInt(newData.getGlobalIndex());
|
||||
wrapper.writeUUID(newData.getSenderUUID());
|
||||
wrapper.writeVarInt(newData.getIndex());
|
||||
wrapper.writeOptional(newData.getSignature(), PacketWrapper::writeBytes);
|
||||
wrapper.writeString(newData.getPlainContent());
|
||||
wrapper.writeTimestamp(newData.getTimestamp());
|
||||
wrapper.writeLong(newData.getSalt());
|
||||
wrapper.writeLastSeenMessagesPacked(newData.getLastSeenMessagesPacked());
|
||||
wrapper.writeOptional(newData.getUnsignedChatContent().orElse(null), PacketWrapper::writeComponent);
|
||||
wrapper.writeFilterMask(newData.getFilterMask());
|
||||
wrapper.writeChatTypeBoundNetwork(newData.getChatFormatting());
|
||||
}
|
||||
}
|
||||
@@ -65,6 +65,16 @@ public class Color implements RGBLike {
|
||||
wrapper.writeInt(color.asRGB());
|
||||
}
|
||||
|
||||
public static Color readShort(PacketWrapper<?> wrapper) {
|
||||
return new Color(wrapper.readUnsignedByte(), wrapper.readUnsignedByte(), wrapper.readUnsignedByte());
|
||||
}
|
||||
|
||||
public static void writeShort(PacketWrapper<?> wrapper, Color color) {
|
||||
wrapper.writeByte(color.red);
|
||||
wrapper.writeByte(color.green);
|
||||
wrapper.writeByte(color.blue);
|
||||
}
|
||||
|
||||
public static Color decode(NBT nbt, ClientVersion version) {
|
||||
if (nbt instanceof NBTNumber) {
|
||||
return new Color(((NBTNumber) nbt).getAsInt());
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.color;
|
||||
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import net.kyori.adventure.util.RGBLike;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -54,6 +55,8 @@ public enum DyeColor implements RGBLike {
|
||||
|
||||
BLACK(new Color(0x1d1d21), new Color(0x0), new Color(0x1e1b1b), 29);
|
||||
|
||||
private static final DyeColor[] COLORS = values();
|
||||
|
||||
private final Color textureDiffuseColor;
|
||||
|
||||
private final Color textColor;
|
||||
@@ -70,6 +73,14 @@ public enum DyeColor implements RGBLike {
|
||||
this.mapColorId = mapColorId;
|
||||
}
|
||||
|
||||
public static DyeColor read(PacketWrapper<?> wrapper) {
|
||||
return wrapper.readEnum(COLORS);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, DyeColor color) {
|
||||
wrapper.writeEnum(color);
|
||||
}
|
||||
|
||||
public @NotNull Color color() {
|
||||
return this.textureDiffuseColor;
|
||||
}
|
||||
@@ -100,4 +111,4 @@ public enum DyeColor implements RGBLike {
|
||||
public int mapColorId() {
|
||||
return this.mapColorId;
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
@@ -31,6 +31,10 @@ public class ComponentPredicate implements Predicate<IComponentMap> {
|
||||
|
||||
private List<ComponentValue<?>> requiredComponents;
|
||||
|
||||
public ComponentPredicate() {
|
||||
this(new ArrayList<>());
|
||||
}
|
||||
|
||||
public ComponentPredicate(List<ComponentValue<?>> requiredComponents) {
|
||||
this.requiredComponents = requiredComponents;
|
||||
}
|
||||
|
||||
+213
-6
@@ -19,6 +19,30 @@
|
||||
package com.github.retrooper.packetevents.protocol.component;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.color.DyeColor;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.AxolotlVariantComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.CatCollarComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.CatVariantComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.ChickenVariantComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.CowVariantComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.FoxVariantComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.FrogVariantComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.HorseVariantComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.LlamaVariantComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.MooshroomVariantComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.PaintingVariantComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.ParrotVariantComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.PigVariantComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.RabbitVariantComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.SalmonSizeComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.SheepColorComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.ShulkerColorComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.TropicalFishBaseColorComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.TropicalFishPatternColorComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.TropicalFishPatternComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.VillagerVariantComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.WolfCollarComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.WolfSoundVariantComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.WolfVariantComponent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ArmorTrim;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.BannerLayers;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.BundleContents;
|
||||
@@ -31,6 +55,8 @@ import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemAdv
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemAttributeModifiers;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemBees;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemBlockStateProperties;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemBlocksAttacks;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemBreakSound;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemConsumable;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemContainerContents;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemContainerLoot;
|
||||
@@ -42,6 +68,7 @@ import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemEnc
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemEnchantments;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemEquippable;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemFireworks;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemInstrument;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemJukeboxPlayable;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemLock;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemLore;
|
||||
@@ -49,20 +76,27 @@ import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemMap
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemMapPostProcessingState;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemModel;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemPotionContents;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemPotionDurationScale;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemProfile;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemProvidesBannerPatterns;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemProvidesTrimMaterial;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemRarity;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemRecipes;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemRepairable;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemTool;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemTooltipDisplay;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemTooltipStyle;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemUnbreakable;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemUseCooldown;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemUseRemainder;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.ItemWeapon;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.LodestoneTracker;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.PotDecorations;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.SuspiciousStewEffects;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.WritableBookContent;
|
||||
import com.github.retrooper.packetevents.protocol.component.builtin.item.WrittenBookContent;
|
||||
import com.github.retrooper.packetevents.protocol.item.instrument.Instrument;
|
||||
import com.github.retrooper.packetevents.protocol.mapper.MaybeMappedEntity;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTCompound;
|
||||
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
|
||||
import com.github.retrooper.packetevents.resources.ResourceLocation;
|
||||
@@ -84,8 +118,7 @@ import java.util.Collection;
|
||||
*/
|
||||
public final class ComponentTypes {
|
||||
|
||||
private static final VersionedRegistry<ComponentType<?>> REGISTRY = new VersionedRegistry<>(
|
||||
"data_component_type", "item/item_component_mappings");
|
||||
private static final VersionedRegistry<ComponentType<?>> REGISTRY = new VersionedRegistry<>("data_component_type");
|
||||
|
||||
private ComponentTypes() {
|
||||
}
|
||||
@@ -122,8 +155,14 @@ public final class ComponentTypes {
|
||||
PacketWrapper::readVarInt, PacketWrapper::writeVarInt);
|
||||
public static final ComponentType<Integer> DAMAGE = define("damage",
|
||||
PacketWrapper::readVarInt, PacketWrapper::writeVarInt);
|
||||
public static final ComponentType<Boolean> UNBREAKABLE = define("unbreakable",
|
||||
PacketWrapper::readBoolean, PacketWrapper::writeBoolean);
|
||||
public static final ComponentType<ItemUnbreakable> UNBREAKABLE_MODERN = define("unbreakable",
|
||||
ItemUnbreakable::read, ItemUnbreakable::write);
|
||||
/**
|
||||
* Changed in 1.21.5
|
||||
*/
|
||||
@Deprecated
|
||||
public static final ComponentType<Boolean> UNBREAKABLE = UNBREAKABLE_MODERN.legacyMap(
|
||||
ItemUnbreakable::isShowInTooltip, ItemUnbreakable::new);
|
||||
public static final ComponentType<Component> CUSTOM_NAME = define("custom_name",
|
||||
PacketWrapper::readComponent, PacketWrapper::writeComponent);
|
||||
public static final ComponentType<Component> ITEM_NAME = define("item_name",
|
||||
@@ -148,8 +187,16 @@ public final class ComponentTypes {
|
||||
@Deprecated
|
||||
public static final ComponentType<Integer> CUSTOM_MODEL_DATA = CUSTOM_MODEL_DATA_LISTS.legacyMap(
|
||||
ItemCustomModelData::getLegacyId, ItemCustomModelData::new);
|
||||
/**
|
||||
* Removed with 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public static final ComponentType<Dummy> HIDE_ADDITIONAL_TOOLTIP = define("hide_additional_tooltip",
|
||||
Dummy::dummyRead, Dummy::dummyWrite);
|
||||
/**
|
||||
* Removed with 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public static final ComponentType<Dummy> HIDE_TOOLTIP = define("hide_tooltip",
|
||||
Dummy::dummyRead, Dummy::dummyWrite);
|
||||
public static final ComponentType<Integer> REPAIR_COST = define("repair_cost",
|
||||
@@ -204,8 +251,12 @@ public final class ComponentTypes {
|
||||
PacketWrapper::readNBT, PacketWrapper::writeNBT);
|
||||
public static final ComponentType<NBTCompound> BLOCK_ENTITY_DATA = define("block_entity_data",
|
||||
PacketWrapper::readNBT, PacketWrapper::writeNBT);
|
||||
public static final ComponentType<Instrument> INSTRUMENT = define("instrument",
|
||||
Instrument::read, Instrument::write);
|
||||
public static final ComponentType<ItemInstrument> ITEM_INSTRUMENT = define("instrument",
|
||||
ItemInstrument::read, ItemInstrument::write);
|
||||
@Deprecated
|
||||
public static final ComponentType<Instrument> INSTRUMENT = ITEM_INSTRUMENT.legacyMap(
|
||||
inst -> inst.getInstrument().getValue(),
|
||||
inst -> new ItemInstrument(new MaybeMappedEntity<>(inst)));
|
||||
public static final ComponentType<Integer> OMINOUS_BOTTLE_AMPLIFIER = define("ominous_bottle_amplifier",
|
||||
PacketWrapper::readVarInt, PacketWrapper::writeVarInt);
|
||||
public static final ComponentType<ItemRecipes> RECIPES = define("recipes",
|
||||
@@ -265,6 +316,162 @@ public final class ComponentTypes {
|
||||
public static final ComponentType<ItemTooltipStyle> TOOLTIP_STYLE = define("tooltip_style",
|
||||
ItemTooltipStyle::read, ItemTooltipStyle::write);
|
||||
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<ItemTooltipDisplay> TOOLTIP_DISPLAY = define("tooltip_display",
|
||||
ItemTooltipDisplay::read, ItemTooltipDisplay::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<ItemWeapon> WEAPON = define("weapon",
|
||||
ItemWeapon::read, ItemWeapon::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<ItemBlocksAttacks> BLOCKS_ATTACKS = define("blocks_attacks",
|
||||
ItemBlocksAttacks::read, ItemBlocksAttacks::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<ItemPotionDurationScale> POTION_DURATION_SCALE = define("potion_duration_scale",
|
||||
ItemPotionDurationScale::read, ItemPotionDurationScale::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<ItemProvidesTrimMaterial> PROVIDES_TRIM_MATERIAL = define("provides_trim_material",
|
||||
ItemProvidesTrimMaterial::read, ItemProvidesTrimMaterial::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<ItemProvidesBannerPatterns> PROVIDES_BANNER_PATTERNS = define("provides_banner_patterns",
|
||||
ItemProvidesBannerPatterns::read, ItemProvidesBannerPatterns::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<ItemBreakSound> BREAK_SOUND = define("break_sound",
|
||||
ItemBreakSound::read, ItemBreakSound::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<VillagerVariantComponent> VILLAGER_VARIANT = define("villager/variant",
|
||||
VillagerVariantComponent::read, VillagerVariantComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<WolfVariantComponent> WOLF_VARIANT = define("wolf/variant",
|
||||
WolfVariantComponent::read, WolfVariantComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<WolfSoundVariantComponent> WOLF_SOUND_VARIANT = define("wolf/sound_variant",
|
||||
WolfSoundVariantComponent::read, WolfSoundVariantComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<WolfCollarComponent> WOLF_COLLAR = define("wolf/collar",
|
||||
WolfCollarComponent::read, WolfCollarComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<FoxVariantComponent> FOX_VARIANT = define("fox/variant",
|
||||
FoxVariantComponent::read, FoxVariantComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<SalmonSizeComponent> SALMON_SIZE = define("salmon/size",
|
||||
SalmonSizeComponent::read, SalmonSizeComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<ParrotVariantComponent> PARROT_VARIANT = define("parrot/variant",
|
||||
ParrotVariantComponent::read, ParrotVariantComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<TropicalFishPatternComponent> TROPICAL_FISH_PATTERN = define("tropical_fish/pattern",
|
||||
TropicalFishPatternComponent::read, TropicalFishPatternComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<TropicalFishBaseColorComponent> TROPICAL_FISH_BASE_COLOR = define("tropical_fish/base_color",
|
||||
TropicalFishBaseColorComponent::read, TropicalFishBaseColorComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<TropicalFishPatternColorComponent> TROPICAL_FISH_PATTERN_COLOR = define("tropical_fish/pattern_color",
|
||||
TropicalFishPatternColorComponent::read, TropicalFishPatternColorComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<MooshroomVariantComponent> MOOSHROOM_VARIANT = define("mooshroom/variant",
|
||||
MooshroomVariantComponent::read, MooshroomVariantComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<RabbitVariantComponent> RABBIT_VARIANT = define("rabbit/variant",
|
||||
RabbitVariantComponent::read, RabbitVariantComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<PigVariantComponent> PIG_VARIANT = define("pig/variant",
|
||||
PigVariantComponent::read, PigVariantComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<CowVariantComponent> COW_VARIANT = define("cow/variant",
|
||||
CowVariantComponent::read, CowVariantComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<ChickenVariantComponent> CHICKEN_VARIANT = define("chicken/variant",
|
||||
ChickenVariantComponent::read, ChickenVariantComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<FrogVariantComponent> FROG_VARIANT = define("frog/variant",
|
||||
FrogVariantComponent::read, FrogVariantComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<HorseVariantComponent> HORSE_VARIANT = define("horse/variant",
|
||||
HorseVariantComponent::read, HorseVariantComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<PaintingVariantComponent> PAINTING_VARIANT = define("painting/variant",
|
||||
PaintingVariantComponent::read, PaintingVariantComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<LlamaVariantComponent> LLAMA_VARIANT = define("llama/variant",
|
||||
LlamaVariantComponent::read, LlamaVariantComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<AxolotlVariantComponent> AXOLOTL_VARIANT = define("axolotl/variant",
|
||||
AxolotlVariantComponent::read, AxolotlVariantComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<CatVariantComponent> CAT_VARIANT = define("cat/variant",
|
||||
CatVariantComponent::read, CatVariantComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<CatCollarComponent> CAT_COLLAR = define("cat/collar",
|
||||
CatCollarComponent::read, CatCollarComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<SheepColorComponent> SHEEP_COLOR = define("sheep/color",
|
||||
SheepColorComponent::read, SheepColorComponent::write);
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public static final ComponentType<ShulkerColorComponent> SHULKER_COLOR = define("shulker/color",
|
||||
ShulkerColorComponent::read, ShulkerColorComponent::write);
|
||||
|
||||
/**
|
||||
* Returns an immutable view of the component types.
|
||||
*
|
||||
|
||||
+1
-2
@@ -32,8 +32,7 @@ import org.jetbrains.annotations.Nullable;
|
||||
*/
|
||||
public final class EnchantEffectComponentTypes {
|
||||
|
||||
private static final VersionedRegistry<ComponentType<?>> REGISTRY = new VersionedRegistry<>(
|
||||
"enchantment_effect_component_type", "enchantment/effect_component_type");
|
||||
private static final VersionedRegistry<ComponentType<?>> REGISTRY = new VersionedRegistry<>("enchantment_effect_component_type");
|
||||
|
||||
private EnchantEffectComponentTypes() {
|
||||
}
|
||||
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component;
|
||||
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
public final class HashedComponentPatchMap {
|
||||
|
||||
private final Map<ComponentType<?>, Integer> addedComponents;
|
||||
private final Set<ComponentType<?>> removedComponents;
|
||||
|
||||
public HashedComponentPatchMap(Map<ComponentType<?>, Integer> addedComponents, Set<ComponentType<?>> removedComponents) {
|
||||
this.addedComponents = addedComponents;
|
||||
this.removedComponents = removedComponents;
|
||||
}
|
||||
|
||||
public static HashedComponentPatchMap read(PacketWrapper<?> wrapper) {
|
||||
Map<ComponentType<?>, Integer> addedComponents = wrapper.readMap(ew ->
|
||||
ew.readMappedEntity(ComponentTypes.getRegistry()), PacketWrapper::readInt);
|
||||
Set<ComponentType<?>> removedComponents = wrapper.readCollection(HashSet::new, ew ->
|
||||
ew.readMappedEntity(ComponentTypes.getRegistry()));
|
||||
return new HashedComponentPatchMap(addedComponents, removedComponents);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, HashedComponentPatchMap map) {
|
||||
wrapper.writeMap(map.addedComponents, PacketWrapper::writeMappedEntity, PacketWrapper::writeInt);
|
||||
wrapper.writeCollection(map.removedComponents, PacketWrapper::writeMappedEntity);
|
||||
}
|
||||
|
||||
public Map<ComponentType<?>, Integer> getAddedComponents() {
|
||||
return this.addedComponents;
|
||||
}
|
||||
|
||||
public Set<ComponentType<?>> getRemovedComponents() {
|
||||
return this.removedComponents;
|
||||
}
|
||||
}
|
||||
+13
@@ -22,14 +22,22 @@ import com.github.retrooper.packetevents.protocol.nbt.NBT;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTCompound;
|
||||
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
|
||||
import com.github.retrooper.packetevents.util.mappings.IRegistry;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jetbrains.annotations.Contract;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jspecify.annotations.NullMarked;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
@NullMarked
|
||||
public interface IComponentMap {
|
||||
|
||||
static StaticComponentMap decode(NBT nbt, PacketWrapper<?> wrapper, IRegistry<? extends ComponentType<?>> registry) {
|
||||
return decode(nbt, wrapper.getServerVersion().toClientVersion(), registry);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@SuppressWarnings("unchecked") // safe in this case
|
||||
static StaticComponentMap decode(NBT nbt, ClientVersion version, IRegistry<? extends ComponentType<?>> registry) {
|
||||
NBTCompound compound = (NBTCompound) nbt;
|
||||
@@ -45,6 +53,11 @@ public interface IComponentMap {
|
||||
return components.build();
|
||||
}
|
||||
|
||||
static NBT encode(PacketWrapper<?> wrapper, StaticComponentMap components) {
|
||||
return encode(components, wrapper.getServerVersion().toClientVersion());
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@SuppressWarnings("unchecked") // safe in this case
|
||||
static NBT encode(StaticComponentMap components, ClientVersion version) {
|
||||
NBTCompound compound = new NBTCompound();
|
||||
|
||||
+4
@@ -25,6 +25,7 @@ import com.github.retrooper.packetevents.util.mappings.TypesBuilderData;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper.Reader;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper.Writer;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.function.Function;
|
||||
@@ -36,6 +37,7 @@ public class StaticComponentType<T> extends AbstractMappedEntity implements Comp
|
||||
private final @Nullable Decoder<T> decoder;
|
||||
private final @Nullable Encoder<T> encoder;
|
||||
|
||||
@ApiStatus.Internal
|
||||
public StaticComponentType(
|
||||
@Nullable TypesBuilderData data,
|
||||
@Nullable Reader<T> reader,
|
||||
@@ -44,6 +46,7 @@ public class StaticComponentType<T> extends AbstractMappedEntity implements Comp
|
||||
this(data, reader, writer, null, null);
|
||||
}
|
||||
|
||||
@ApiStatus.Internal
|
||||
public StaticComponentType(
|
||||
@Nullable TypesBuilderData data,
|
||||
@Nullable Decoder<T> decoder,
|
||||
@@ -52,6 +55,7 @@ public class StaticComponentType<T> extends AbstractMappedEntity implements Comp
|
||||
this(data, null, null, decoder, encoder);
|
||||
}
|
||||
|
||||
@ApiStatus.Internal
|
||||
public StaticComponentType(
|
||||
@Nullable TypesBuilderData data,
|
||||
@Nullable Reader<T> reader,
|
||||
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.axolotl.AxolotlVariant;
|
||||
import com.github.retrooper.packetevents.protocol.entity.axolotl.AxolotlVariants;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class AxolotlVariantComponent {
|
||||
|
||||
private AxolotlVariant variant;
|
||||
|
||||
public AxolotlVariantComponent(AxolotlVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
public static AxolotlVariantComponent read(PacketWrapper<?> wrapper) {
|
||||
AxolotlVariant type = wrapper.readMappedEntity(AxolotlVariants.getRegistry());
|
||||
return new AxolotlVariantComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, AxolotlVariantComponent component) {
|
||||
wrapper.writeMappedEntity(component.variant);
|
||||
}
|
||||
|
||||
public AxolotlVariant getVariant() {
|
||||
return this.variant;
|
||||
}
|
||||
|
||||
public void setVariant(AxolotlVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof AxolotlVariantComponent)) return false;
|
||||
AxolotlVariantComponent that = (AxolotlVariantComponent) obj;
|
||||
return this.variant.equals(that.variant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.variant);
|
||||
}
|
||||
}
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.color.DyeColor;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class CatCollarComponent {
|
||||
|
||||
private DyeColor color;
|
||||
|
||||
public CatCollarComponent(DyeColor color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public static CatCollarComponent read(PacketWrapper<?> wrapper) {
|
||||
DyeColor type = DyeColor.read(wrapper);
|
||||
return new CatCollarComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, CatCollarComponent component) {
|
||||
DyeColor.write(wrapper, component.color);
|
||||
}
|
||||
|
||||
public DyeColor getDyeColor() {
|
||||
return this.color;
|
||||
}
|
||||
|
||||
public void setDyeColor(DyeColor color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof CatCollarComponent)) return false;
|
||||
CatCollarComponent that = (CatCollarComponent) obj;
|
||||
return this.color.equals(that.color);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.color);
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.cat.CatVariant;
|
||||
import com.github.retrooper.packetevents.protocol.entity.cat.CatVariants;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class CatVariantComponent {
|
||||
|
||||
private CatVariant variant;
|
||||
|
||||
public CatVariantComponent(CatVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
public static CatVariantComponent read(PacketWrapper<?> wrapper) {
|
||||
CatVariant type = wrapper.readMappedEntity(CatVariants.getRegistry());
|
||||
return new CatVariantComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, CatVariantComponent component) {
|
||||
wrapper.writeMappedEntity(component.variant);
|
||||
}
|
||||
|
||||
public CatVariant getVariant() {
|
||||
return this.variant;
|
||||
}
|
||||
|
||||
public void setVariant(CatVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof CatVariantComponent)) return false;
|
||||
CatVariantComponent that = (CatVariantComponent) obj;
|
||||
return this.variant.equals(that.variant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.variant);
|
||||
}
|
||||
}
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.chicken.ChickenVariant;
|
||||
import com.github.retrooper.packetevents.protocol.entity.chicken.ChickenVariants;
|
||||
import com.github.retrooper.packetevents.protocol.mapper.MaybeMappedEntity;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class ChickenVariantComponent {
|
||||
|
||||
private MaybeMappedEntity<ChickenVariant> variant;
|
||||
|
||||
public ChickenVariantComponent(MaybeMappedEntity<ChickenVariant> variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
public static ChickenVariantComponent read(PacketWrapper<?> wrapper) {
|
||||
MaybeMappedEntity<ChickenVariant> variant = MaybeMappedEntity.read(wrapper,
|
||||
ChickenVariants.getRegistry(), ChickenVariant::read);
|
||||
return new ChickenVariantComponent(variant);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, ChickenVariantComponent component) {
|
||||
MaybeMappedEntity.write(wrapper, component.variant, ChickenVariant::write);
|
||||
}
|
||||
|
||||
public MaybeMappedEntity<ChickenVariant> getVariant() {
|
||||
return this.variant;
|
||||
}
|
||||
|
||||
public void setVariant(MaybeMappedEntity<ChickenVariant> variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof ChickenVariantComponent)) return false;
|
||||
ChickenVariantComponent that = (ChickenVariantComponent) obj;
|
||||
return this.variant.equals(that.variant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.variant);
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.cow.CowVariant;
|
||||
import com.github.retrooper.packetevents.protocol.entity.cow.CowVariants;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class CowVariantComponent {
|
||||
|
||||
private CowVariant variant;
|
||||
|
||||
public CowVariantComponent(CowVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
public static CowVariantComponent read(PacketWrapper<?> wrapper) {
|
||||
CowVariant type = wrapper.readMappedEntity(CowVariants.getRegistry());
|
||||
return new CowVariantComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, CowVariantComponent component) {
|
||||
wrapper.writeMappedEntity(component.variant);
|
||||
}
|
||||
|
||||
public CowVariant getVariant() {
|
||||
return this.variant;
|
||||
}
|
||||
|
||||
public void setVariant(CowVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof CowVariantComponent)) return false;
|
||||
CowVariantComponent that = (CowVariantComponent) obj;
|
||||
return this.variant.equals(that.variant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.variant);
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.fox.FoxVariant;
|
||||
import com.github.retrooper.packetevents.protocol.entity.fox.FoxVariants;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class FoxVariantComponent {
|
||||
|
||||
private FoxVariant variant;
|
||||
|
||||
public FoxVariantComponent(FoxVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
public static FoxVariantComponent read(PacketWrapper<?> wrapper) {
|
||||
FoxVariant type = wrapper.readMappedEntity(FoxVariants.getRegistry());
|
||||
return new FoxVariantComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, FoxVariantComponent component) {
|
||||
wrapper.writeMappedEntity(component.variant);
|
||||
}
|
||||
|
||||
public FoxVariant getVariant() {
|
||||
return this.variant;
|
||||
}
|
||||
|
||||
public void setVariant(FoxVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof FoxVariantComponent)) return false;
|
||||
FoxVariantComponent that = (FoxVariantComponent) obj;
|
||||
return this.variant.equals(that.variant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.variant);
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.frog.FrogVariant;
|
||||
import com.github.retrooper.packetevents.protocol.entity.frog.FrogVariants;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class FrogVariantComponent {
|
||||
|
||||
private FrogVariant variant;
|
||||
|
||||
public FrogVariantComponent(FrogVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
public static FrogVariantComponent read(PacketWrapper<?> wrapper) {
|
||||
FrogVariant variant = wrapper.readMappedEntity(FrogVariants.getRegistry());
|
||||
return new FrogVariantComponent(variant);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, FrogVariantComponent component) {
|
||||
wrapper.writeMappedEntity(component.variant);
|
||||
}
|
||||
|
||||
public FrogVariant getVariant() {
|
||||
return this.variant;
|
||||
}
|
||||
|
||||
public void setVariant(FrogVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof FrogVariantComponent)) return false;
|
||||
FrogVariantComponent that = (FrogVariantComponent) obj;
|
||||
return this.variant.equals(that.variant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.variant);
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.horse.HorseVariant;
|
||||
import com.github.retrooper.packetevents.protocol.entity.horse.HorseVariants;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class HorseVariantComponent {
|
||||
|
||||
private HorseVariant variant;
|
||||
|
||||
public HorseVariantComponent(HorseVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
public static HorseVariantComponent read(PacketWrapper<?> wrapper) {
|
||||
HorseVariant variant = wrapper.readMappedEntity(HorseVariants.getRegistry());
|
||||
return new HorseVariantComponent(variant);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, HorseVariantComponent component) {
|
||||
wrapper.writeMappedEntity(component.variant);
|
||||
}
|
||||
|
||||
public HorseVariant getVariant() {
|
||||
return this.variant;
|
||||
}
|
||||
|
||||
public void setVariant(HorseVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof HorseVariantComponent)) return false;
|
||||
HorseVariantComponent that = (HorseVariantComponent) obj;
|
||||
return this.variant.equals(that.variant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.variant);
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.llama.LlamaVariant;
|
||||
import com.github.retrooper.packetevents.protocol.entity.llama.LlamaVariants;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class LlamaVariantComponent {
|
||||
|
||||
private LlamaVariant variant;
|
||||
|
||||
public LlamaVariantComponent(LlamaVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
public static LlamaVariantComponent read(PacketWrapper<?> wrapper) {
|
||||
LlamaVariant type = wrapper.readMappedEntity(LlamaVariants.getRegistry());
|
||||
return new LlamaVariantComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, LlamaVariantComponent component) {
|
||||
wrapper.writeMappedEntity(component.variant);
|
||||
}
|
||||
|
||||
public LlamaVariant getVariant() {
|
||||
return this.variant;
|
||||
}
|
||||
|
||||
public void setVariant(LlamaVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof LlamaVariantComponent)) return false;
|
||||
LlamaVariantComponent that = (LlamaVariantComponent) obj;
|
||||
return this.variant.equals(that.variant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.variant);
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.mooshroom.MooshroomVariant;
|
||||
import com.github.retrooper.packetevents.protocol.entity.mooshroom.MooshroomVariants;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class MooshroomVariantComponent {
|
||||
|
||||
private MooshroomVariant variant;
|
||||
|
||||
public MooshroomVariantComponent(MooshroomVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
public static MooshroomVariantComponent read(PacketWrapper<?> wrapper) {
|
||||
MooshroomVariant type = wrapper.readMappedEntity(MooshroomVariants.getRegistry());
|
||||
return new MooshroomVariantComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, MooshroomVariantComponent component) {
|
||||
wrapper.writeMappedEntity(component.variant);
|
||||
}
|
||||
|
||||
public MooshroomVariant getVariant() {
|
||||
return this.variant;
|
||||
}
|
||||
|
||||
public void setVariant(MooshroomVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof MooshroomVariantComponent)) return false;
|
||||
MooshroomVariantComponent that = (MooshroomVariantComponent) obj;
|
||||
return this.variant.equals(that.variant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.variant);
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.world.painting.PaintingVariant;
|
||||
import com.github.retrooper.packetevents.protocol.world.painting.PaintingVariants;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class PaintingVariantComponent {
|
||||
|
||||
private PaintingVariant variant;
|
||||
|
||||
public PaintingVariantComponent(PaintingVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
public static PaintingVariantComponent read(PacketWrapper<?> wrapper) {
|
||||
PaintingVariant variant = wrapper.readMappedEntity(PaintingVariants.getRegistry());
|
||||
return new PaintingVariantComponent(variant);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, PaintingVariantComponent component) {
|
||||
wrapper.writeMappedEntity(component.variant);
|
||||
}
|
||||
|
||||
public PaintingVariant getVariant() {
|
||||
return this.variant;
|
||||
}
|
||||
|
||||
public void setVariant(PaintingVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof PaintingVariantComponent)) return false;
|
||||
PaintingVariantComponent that = (PaintingVariantComponent) obj;
|
||||
return this.variant.equals(that.variant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.variant);
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.parrot.ParrotVariant;
|
||||
import com.github.retrooper.packetevents.protocol.entity.parrot.ParrotVariants;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class ParrotVariantComponent {
|
||||
|
||||
private ParrotVariant variant;
|
||||
|
||||
public ParrotVariantComponent(ParrotVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
public static ParrotVariantComponent read(PacketWrapper<?> wrapper) {
|
||||
ParrotVariant type = wrapper.readMappedEntity(ParrotVariants.getRegistry());
|
||||
return new ParrotVariantComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, ParrotVariantComponent component) {
|
||||
wrapper.writeMappedEntity(component.variant);
|
||||
}
|
||||
|
||||
public ParrotVariant getVariant() {
|
||||
return this.variant;
|
||||
}
|
||||
|
||||
public void setVariant(ParrotVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof ParrotVariantComponent)) return false;
|
||||
ParrotVariantComponent that = (ParrotVariantComponent) obj;
|
||||
return this.variant.equals(that.variant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.variant);
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.pig.PigVariant;
|
||||
import com.github.retrooper.packetevents.protocol.entity.pig.PigVariants;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class PigVariantComponent {
|
||||
|
||||
private PigVariant variant;
|
||||
|
||||
public PigVariantComponent(PigVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
public static PigVariantComponent read(PacketWrapper<?> wrapper) {
|
||||
PigVariant type = wrapper.readMappedEntity(PigVariants.getRegistry());
|
||||
return new PigVariantComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, PigVariantComponent component) {
|
||||
wrapper.writeMappedEntity(component.variant);
|
||||
}
|
||||
|
||||
public PigVariant getVariant() {
|
||||
return this.variant;
|
||||
}
|
||||
|
||||
public void setVariant(PigVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof PigVariantComponent)) return false;
|
||||
PigVariantComponent that = (PigVariantComponent) obj;
|
||||
return this.variant.equals(that.variant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.variant);
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.rabbit.RabbitVariant;
|
||||
import com.github.retrooper.packetevents.protocol.entity.rabbit.RabbitVariants;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class RabbitVariantComponent {
|
||||
|
||||
private RabbitVariant variant;
|
||||
|
||||
public RabbitVariantComponent(RabbitVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
public static RabbitVariantComponent read(PacketWrapper<?> wrapper) {
|
||||
RabbitVariant type = wrapper.readMappedEntity(RabbitVariants.getRegistry());
|
||||
return new RabbitVariantComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, RabbitVariantComponent component) {
|
||||
wrapper.writeMappedEntity(component.variant);
|
||||
}
|
||||
|
||||
public RabbitVariant getVariant() {
|
||||
return this.variant;
|
||||
}
|
||||
|
||||
public void setVariant(RabbitVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof RabbitVariantComponent)) return false;
|
||||
RabbitVariantComponent that = (RabbitVariantComponent) obj;
|
||||
return this.variant.equals(that.variant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.variant);
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.salmon.SalmonVariant;
|
||||
import com.github.retrooper.packetevents.protocol.entity.salmon.SalmonVariants;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class SalmonSizeComponent {
|
||||
|
||||
private SalmonVariant variant;
|
||||
|
||||
public SalmonSizeComponent(SalmonVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
public static SalmonSizeComponent read(PacketWrapper<?> wrapper) {
|
||||
SalmonVariant type = wrapper.readMappedEntity(SalmonVariants.getRegistry());
|
||||
return new SalmonSizeComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, SalmonSizeComponent component) {
|
||||
wrapper.writeMappedEntity(component.variant);
|
||||
}
|
||||
|
||||
public SalmonVariant getVariant() {
|
||||
return this.variant;
|
||||
}
|
||||
|
||||
public void setVariant(SalmonVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof SalmonSizeComponent)) return false;
|
||||
SalmonSizeComponent that = (SalmonSizeComponent) obj;
|
||||
return this.variant.equals(that.variant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.variant);
|
||||
}
|
||||
}
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.color.DyeColor;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class SheepColorComponent {
|
||||
|
||||
private DyeColor color;
|
||||
|
||||
public SheepColorComponent(DyeColor color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public static SheepColorComponent read(PacketWrapper<?> wrapper) {
|
||||
DyeColor type = DyeColor.read(wrapper);
|
||||
return new SheepColorComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, SheepColorComponent component) {
|
||||
DyeColor.write(wrapper, component.color);
|
||||
}
|
||||
|
||||
public DyeColor getDyeColor() {
|
||||
return this.color;
|
||||
}
|
||||
|
||||
public void setDyeColor(DyeColor color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof SheepColorComponent)) return false;
|
||||
SheepColorComponent that = (SheepColorComponent) obj;
|
||||
return this.color.equals(that.color);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.color);
|
||||
}
|
||||
}
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.color.DyeColor;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class ShulkerColorComponent {
|
||||
|
||||
private DyeColor color;
|
||||
|
||||
public ShulkerColorComponent(DyeColor color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public static ShulkerColorComponent read(PacketWrapper<?> wrapper) {
|
||||
DyeColor type = DyeColor.read(wrapper);
|
||||
return new ShulkerColorComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, ShulkerColorComponent component) {
|
||||
DyeColor.write(wrapper, component.color);
|
||||
}
|
||||
|
||||
public DyeColor getDyeColor() {
|
||||
return this.color;
|
||||
}
|
||||
|
||||
public void setDyeColor(DyeColor color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof ShulkerColorComponent)) return false;
|
||||
ShulkerColorComponent that = (ShulkerColorComponent) obj;
|
||||
return this.color.equals(that.color);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.color);
|
||||
}
|
||||
}
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.color.DyeColor;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class TropicalFishBaseColorComponent {
|
||||
|
||||
private DyeColor color;
|
||||
|
||||
public TropicalFishBaseColorComponent(DyeColor color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public static TropicalFishBaseColorComponent read(PacketWrapper<?> wrapper) {
|
||||
DyeColor type = DyeColor.read(wrapper);
|
||||
return new TropicalFishBaseColorComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, TropicalFishBaseColorComponent component) {
|
||||
DyeColor.write(wrapper, component.color);
|
||||
}
|
||||
|
||||
public DyeColor getDyeColor() {
|
||||
return this.color;
|
||||
}
|
||||
|
||||
public void setDyeColor(DyeColor color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof TropicalFishBaseColorComponent)) return false;
|
||||
TropicalFishBaseColorComponent that = (TropicalFishBaseColorComponent) obj;
|
||||
return this.color.equals(that.color);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.color);
|
||||
}
|
||||
}
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.color.DyeColor;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class TropicalFishPatternColorComponent {
|
||||
|
||||
private DyeColor color;
|
||||
|
||||
public TropicalFishPatternColorComponent(DyeColor color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public static TropicalFishPatternColorComponent read(PacketWrapper<?> wrapper) {
|
||||
DyeColor type = DyeColor.read(wrapper);
|
||||
return new TropicalFishPatternColorComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, TropicalFishPatternColorComponent component) {
|
||||
DyeColor.write(wrapper, component.color);
|
||||
}
|
||||
|
||||
public DyeColor getDyeColor() {
|
||||
return this.color;
|
||||
}
|
||||
|
||||
public void setDyeColor(DyeColor color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof TropicalFishPatternColorComponent)) return false;
|
||||
TropicalFishPatternColorComponent that = (TropicalFishPatternColorComponent) obj;
|
||||
return this.color.equals(that.color);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.color);
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.tropicalfish.TropicalFishPattern;
|
||||
import com.github.retrooper.packetevents.protocol.entity.tropicalfish.TropicalFishPatterns;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class TropicalFishPatternComponent {
|
||||
|
||||
private TropicalFishPattern variant;
|
||||
|
||||
public TropicalFishPatternComponent(TropicalFishPattern variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
public static TropicalFishPatternComponent read(PacketWrapper<?> wrapper) {
|
||||
TropicalFishPattern type = wrapper.readMappedEntity(TropicalFishPatterns.getRegistry());
|
||||
return new TropicalFishPatternComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, TropicalFishPatternComponent component) {
|
||||
wrapper.writeMappedEntity(component.variant);
|
||||
}
|
||||
|
||||
public TropicalFishPattern getVariant() {
|
||||
return this.variant;
|
||||
}
|
||||
|
||||
public void setVariant(TropicalFishPattern variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof TropicalFishPatternComponent)) return false;
|
||||
TropicalFishPatternComponent that = (TropicalFishPatternComponent) obj;
|
||||
return this.variant.equals(that.variant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.variant);
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.villager.type.VillagerType;
|
||||
import com.github.retrooper.packetevents.protocol.entity.villager.type.VillagerTypes;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class VillagerVariantComponent {
|
||||
|
||||
private VillagerType villagerType;
|
||||
|
||||
public VillagerVariantComponent(VillagerType villagerType) {
|
||||
this.villagerType = villagerType;
|
||||
}
|
||||
|
||||
public static VillagerVariantComponent read(PacketWrapper<?> wrapper) {
|
||||
VillagerType type = wrapper.readMappedEntity(VillagerTypes.getRegistry());
|
||||
return new VillagerVariantComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, VillagerVariantComponent component) {
|
||||
wrapper.writeMappedEntity(component.villagerType);
|
||||
}
|
||||
|
||||
public VillagerType getVillagerType() {
|
||||
return this.villagerType;
|
||||
}
|
||||
|
||||
public void setVillagerType(VillagerType villagerType) {
|
||||
this.villagerType = villagerType;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof VillagerVariantComponent)) return false;
|
||||
VillagerVariantComponent that = (VillagerVariantComponent) obj;
|
||||
return this.villagerType.equals(that.villagerType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.villagerType);
|
||||
}
|
||||
}
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.color.DyeColor;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class WolfCollarComponent {
|
||||
|
||||
private DyeColor color;
|
||||
|
||||
public WolfCollarComponent(DyeColor color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
public static WolfCollarComponent read(PacketWrapper<?> wrapper) {
|
||||
DyeColor type = DyeColor.read(wrapper);
|
||||
return new WolfCollarComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, WolfCollarComponent component) {
|
||||
DyeColor.write(wrapper, component.color);
|
||||
}
|
||||
|
||||
public DyeColor getDyeColor() {
|
||||
return this.color;
|
||||
}
|
||||
|
||||
public void setDyeColor(DyeColor color) {
|
||||
this.color = color;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof WolfCollarComponent)) return false;
|
||||
WolfCollarComponent that = (WolfCollarComponent) obj;
|
||||
return this.color.equals(that.color);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.color);
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.wolfvariant.WolfSoundVariant;
|
||||
import com.github.retrooper.packetevents.protocol.entity.wolfvariant.WolfSoundVariants;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class WolfSoundVariantComponent {
|
||||
|
||||
private WolfSoundVariant soundVariant;
|
||||
|
||||
public WolfSoundVariantComponent(WolfSoundVariant soundVariant) {
|
||||
this.soundVariant = soundVariant;
|
||||
}
|
||||
|
||||
public static WolfSoundVariantComponent read(PacketWrapper<?> wrapper) {
|
||||
WolfSoundVariant type = wrapper.readMappedEntity(WolfSoundVariants.getRegistry());
|
||||
return new WolfSoundVariantComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, WolfSoundVariantComponent component) {
|
||||
wrapper.writeMappedEntity(component.soundVariant);
|
||||
}
|
||||
|
||||
public WolfSoundVariant getSoundVariant() {
|
||||
return this.soundVariant;
|
||||
}
|
||||
|
||||
public void setSoundVariant(WolfSoundVariant soundVariant) {
|
||||
this.soundVariant = soundVariant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof WolfSoundVariantComponent)) return false;
|
||||
WolfSoundVariantComponent that = (WolfSoundVariantComponent) obj;
|
||||
return this.soundVariant.equals(that.soundVariant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.soundVariant);
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.entity.wolfvariant.WolfVariant;
|
||||
import com.github.retrooper.packetevents.protocol.entity.wolfvariant.WolfVariants;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class WolfVariantComponent {
|
||||
|
||||
private WolfVariant variant;
|
||||
|
||||
public WolfVariantComponent(WolfVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
public static WolfVariantComponent read(PacketWrapper<?> wrapper) {
|
||||
WolfVariant type = wrapper.readMappedEntity(WolfVariants.getRegistry());
|
||||
return new WolfVariantComponent(type);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, WolfVariantComponent component) {
|
||||
wrapper.writeMappedEntity(component.variant);
|
||||
}
|
||||
|
||||
public WolfVariant getVariant() {
|
||||
return this.variant;
|
||||
}
|
||||
|
||||
public void setVariant(WolfVariant variant) {
|
||||
this.variant = variant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof WolfVariantComponent)) return false;
|
||||
WolfVariantComponent that = (WolfVariantComponent) obj;
|
||||
return this.variant.equals(that.variant);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.variant);
|
||||
}
|
||||
}
|
||||
+26
-2
@@ -18,9 +18,11 @@
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin.item;
|
||||
|
||||
import com.github.retrooper.packetevents.manager.server.ServerVersion;
|
||||
import com.github.retrooper.packetevents.protocol.item.trimmaterial.TrimMaterial;
|
||||
import com.github.retrooper.packetevents.protocol.item.trimpattern.TrimPattern;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
@@ -28,8 +30,20 @@ public class ArmorTrim {
|
||||
|
||||
private TrimMaterial material;
|
||||
private TrimPattern pattern;
|
||||
/**
|
||||
* Removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
private boolean showInTooltip;
|
||||
|
||||
public ArmorTrim(TrimMaterial material, TrimPattern pattern) {
|
||||
this(material, pattern, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link #showInTooltip} has been removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public ArmorTrim(TrimMaterial material, TrimPattern pattern, boolean showInTooltip) {
|
||||
this.material = material;
|
||||
this.pattern = pattern;
|
||||
@@ -39,14 +53,16 @@ public class ArmorTrim {
|
||||
public static ArmorTrim read(PacketWrapper<?> wrapper) {
|
||||
TrimMaterial material = TrimMaterial.read(wrapper);
|
||||
TrimPattern pattern = TrimPattern.read(wrapper);
|
||||
boolean showInTooltip = wrapper.readBoolean();
|
||||
boolean showInTooltip = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5) || wrapper.readBoolean();
|
||||
return new ArmorTrim(material, pattern, showInTooltip);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, ArmorTrim trim) {
|
||||
TrimMaterial.write(wrapper, trim.material);
|
||||
TrimPattern.write(wrapper, trim.pattern);
|
||||
wrapper.writeBoolean(trim.showInTooltip);
|
||||
if (wrapper.getServerVersion().isOlderThan(ServerVersion.V_1_21_5)) {
|
||||
wrapper.writeBoolean(trim.showInTooltip);
|
||||
}
|
||||
}
|
||||
|
||||
public TrimMaterial getMaterial() {
|
||||
@@ -65,10 +81,18 @@ public class ArmorTrim {
|
||||
this.pattern = pattern;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public boolean isShowInTooltip() {
|
||||
return this.showInTooltip;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public void setShowInTooltip(boolean showInTooltip) {
|
||||
this.showInTooltip = showInTooltip;
|
||||
}
|
||||
|
||||
+2
-2
@@ -81,13 +81,13 @@ public class BannerLayers {
|
||||
public static Layer read(PacketWrapper<?> wrapper) {
|
||||
BannerPattern pattern = wrapper.readMappedEntityOrDirect(
|
||||
BannerPatterns.getRegistry(), BannerPattern::readDirect);
|
||||
DyeColor color = wrapper.readEnum(DyeColor.values());
|
||||
DyeColor color = DyeColor.read(wrapper);
|
||||
return new Layer(pattern, color);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, Layer layer) {
|
||||
wrapper.writeMappedEntityOrDirect(layer.pattern, BannerPattern::writeDirect);
|
||||
wrapper.writeEnum(layer.color);
|
||||
DyeColor.write(wrapper, layer.color);
|
||||
}
|
||||
|
||||
public BannerPattern getPattern() {
|
||||
|
||||
+64
-6
@@ -18,23 +18,37 @@
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin.item;
|
||||
|
||||
import com.github.retrooper.packetevents.manager.server.ServerVersion;
|
||||
import com.github.retrooper.packetevents.protocol.component.predicates.ComponentMatchers;
|
||||
import com.github.retrooper.packetevents.protocol.mapper.MappedEntitySet;
|
||||
import com.github.retrooper.packetevents.protocol.nbt.NBTCompound;
|
||||
import com.github.retrooper.packetevents.protocol.world.states.type.StateType;
|
||||
import com.github.retrooper.packetevents.protocol.world.states.type.StateTypes;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
// why do I have to implement this mess, I just want to deserialize items
|
||||
public class ItemAdventurePredicate {
|
||||
|
||||
private List<BlockPredicate> predicates;
|
||||
/**
|
||||
* Removed with 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
private boolean showInTooltip;
|
||||
|
||||
public ItemAdventurePredicate(List<BlockPredicate> predicates) {
|
||||
this(predicates, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link #showInTooltip} has been removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public ItemAdventurePredicate(List<BlockPredicate> predicates, boolean showInTooltip) {
|
||||
this.predicates = predicates;
|
||||
this.showInTooltip = showInTooltip;
|
||||
@@ -42,13 +56,15 @@ public class ItemAdventurePredicate {
|
||||
|
||||
public static ItemAdventurePredicate read(PacketWrapper<?> wrapper) {
|
||||
List<BlockPredicate> predicates = wrapper.readList(BlockPredicate::read);
|
||||
boolean showInTooltip = wrapper.readBoolean();
|
||||
boolean showInTooltip = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5) || wrapper.readBoolean();
|
||||
return new ItemAdventurePredicate(predicates, showInTooltip);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, ItemAdventurePredicate predicate) {
|
||||
wrapper.writeList(predicate.predicates, BlockPredicate::write);
|
||||
wrapper.writeBoolean(predicate.showInTooltip);
|
||||
if (wrapper.getServerVersion().isOlderThan(ServerVersion.V_1_21_5)) {
|
||||
wrapper.writeBoolean(predicate.showInTooltip);
|
||||
}
|
||||
}
|
||||
|
||||
public void addPredicate(BlockPredicate predicate) {
|
||||
@@ -63,10 +79,18 @@ public class ItemAdventurePredicate {
|
||||
this.predicates = predicates;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removed with 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public boolean isShowInTooltip() {
|
||||
return this.showInTooltip;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removed with 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public void setShowInTooltip(boolean showInTooltip) {
|
||||
this.showInTooltip = showInTooltip;
|
||||
}
|
||||
@@ -90,15 +114,29 @@ public class ItemAdventurePredicate {
|
||||
private @Nullable MappedEntitySet<StateType.Mapped> blocks;
|
||||
private @Nullable List<PropertyMatcher> properties;
|
||||
private @Nullable NBTCompound nbt;
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
private ComponentMatchers matchers;
|
||||
|
||||
public BlockPredicate(
|
||||
@Nullable MappedEntitySet<StateType.Mapped> blocks,
|
||||
@Nullable List<PropertyMatcher> properties,
|
||||
@Nullable NBTCompound nbt
|
||||
) {
|
||||
this(blocks, properties, nbt, new ComponentMatchers());
|
||||
}
|
||||
|
||||
public BlockPredicate(
|
||||
@Nullable MappedEntitySet<StateType.Mapped> blocks,
|
||||
@Nullable List<PropertyMatcher> properties,
|
||||
@Nullable NBTCompound nbt,
|
||||
ComponentMatchers matchers
|
||||
) {
|
||||
this.blocks = blocks;
|
||||
this.properties = properties;
|
||||
this.nbt = nbt;
|
||||
this.matchers = matchers;
|
||||
}
|
||||
|
||||
public static BlockPredicate read(PacketWrapper<?> wrapper) {
|
||||
@@ -107,7 +145,9 @@ public class ItemAdventurePredicate {
|
||||
List<PropertyMatcher> properties = wrapper.readOptional(
|
||||
ew -> wrapper.readList(PropertyMatcher::read));
|
||||
NBTCompound nbt = wrapper.readOptional(PacketWrapper::readNBT);
|
||||
return new BlockPredicate(blocks, properties, nbt);
|
||||
ComponentMatchers matchers = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5)
|
||||
? ComponentMatchers.read(wrapper) : new ComponentMatchers();
|
||||
return new BlockPredicate(blocks, properties, nbt, matchers);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, BlockPredicate predicate) {
|
||||
@@ -115,6 +155,9 @@ public class ItemAdventurePredicate {
|
||||
wrapper.writeOptional(predicate.properties,
|
||||
(ew, val) -> ew.writeList(val, PropertyMatcher::write));
|
||||
wrapper.writeOptional(predicate.nbt, PacketWrapper::writeNBT);
|
||||
if (wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5)) {
|
||||
ComponentMatchers.write(wrapper, predicate.matchers);
|
||||
}
|
||||
}
|
||||
|
||||
public @Nullable MappedEntitySet<StateType.Mapped> getBlocks() {
|
||||
@@ -148,6 +191,20 @@ public class ItemAdventurePredicate {
|
||||
this.nbt = nbt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public ComponentMatchers getMatchers() {
|
||||
return this.matchers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public void setMatchers(ComponentMatchers matchers) {
|
||||
this.matchers = matchers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj) return true;
|
||||
@@ -155,12 +212,13 @@ public class ItemAdventurePredicate {
|
||||
BlockPredicate that = (BlockPredicate) obj;
|
||||
if (!Objects.equals(this.blocks, that.blocks)) return false;
|
||||
if (!Objects.equals(this.properties, that.properties)) return false;
|
||||
return Objects.equals(this.nbt, that.nbt);
|
||||
if (!Objects.equals(this.nbt, that.nbt)) return false;
|
||||
return this.matchers.equals(that.matchers);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(this.blocks, this.properties, this.nbt);
|
||||
return Objects.hash(this.blocks, this.properties, this.nbt, this.matchers);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+53
-4
@@ -20,8 +20,10 @@ package com.github.retrooper.packetevents.protocol.component.builtin.item;
|
||||
|
||||
import com.github.retrooper.packetevents.manager.server.ServerVersion;
|
||||
import com.github.retrooper.packetevents.protocol.attribute.Attribute;
|
||||
import com.github.retrooper.packetevents.protocol.attribute.AttributeDisplay;
|
||||
import com.github.retrooper.packetevents.protocol.attribute.AttributeOperation;
|
||||
import com.github.retrooper.packetevents.protocol.attribute.Attributes;
|
||||
import com.github.retrooper.packetevents.protocol.attribute.DefaultAttributeDisplay;
|
||||
import com.github.retrooper.packetevents.resources.ResourceLocation;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerUpdateAttributes.PropertyModifier;
|
||||
@@ -37,6 +39,11 @@ public class ItemAttributeModifiers {
|
||||
|
||||
public static final ItemAttributeModifiers EMPTY = new ItemAttributeModifiers(
|
||||
Collections.emptyList(), true) {
|
||||
@Override
|
||||
public void setModifiers(List<ModifierEntry> modifiers) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setShowInTooltip(boolean showInTooltip) {
|
||||
throw new UnsupportedOperationException();
|
||||
@@ -44,8 +51,20 @@ public class ItemAttributeModifiers {
|
||||
};
|
||||
|
||||
private List<ModifierEntry> modifiers;
|
||||
/**
|
||||
* Removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
private boolean showInTooltip;
|
||||
|
||||
public ItemAttributeModifiers(List<ModifierEntry> modifiers) {
|
||||
this(modifiers, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link #showInTooltip} has been removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public ItemAttributeModifiers(List<ModifierEntry> modifiers, boolean showInTooltip) {
|
||||
this.modifiers = modifiers;
|
||||
this.showInTooltip = showInTooltip;
|
||||
@@ -53,13 +72,15 @@ public class ItemAttributeModifiers {
|
||||
|
||||
public static ItemAttributeModifiers read(PacketWrapper<?> wrapper) {
|
||||
List<ModifierEntry> modifiers = wrapper.readList(ModifierEntry::read);
|
||||
boolean showInTooltip = wrapper.readBoolean();
|
||||
boolean showInTooltip = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5) || wrapper.readBoolean();
|
||||
return new ItemAttributeModifiers(modifiers, showInTooltip);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, ItemAttributeModifiers modifiers) {
|
||||
wrapper.writeList(modifiers.modifiers, ModifierEntry::write);
|
||||
wrapper.writeBoolean(modifiers.showInTooltip);
|
||||
if (wrapper.getServerVersion().isOlderThan(ServerVersion.V_1_21_5)) {
|
||||
wrapper.writeBoolean(modifiers.showInTooltip);
|
||||
}
|
||||
}
|
||||
|
||||
public void addModifier(ModifierEntry modifier) {
|
||||
@@ -74,10 +95,18 @@ public class ItemAttributeModifiers {
|
||||
this.modifiers = modifiers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public boolean isShowInTooltip() {
|
||||
return this.showInTooltip;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public void setShowInTooltip(boolean showInTooltip) {
|
||||
this.showInTooltip = showInTooltip;
|
||||
}
|
||||
@@ -106,24 +135,39 @@ public class ItemAttributeModifiers {
|
||||
private Attribute attribute;
|
||||
private Modifier modifier;
|
||||
private EquipmentSlotGroup slotGroup;
|
||||
private AttributeDisplay display;
|
||||
|
||||
@ApiStatus.Obsolete
|
||||
public ModifierEntry(Attribute attribute, Modifier modifier, EquipmentSlotGroup slotGroup) {
|
||||
this(attribute, modifier, slotGroup, DefaultAttributeDisplay.INSTANCE);
|
||||
}
|
||||
|
||||
public ModifierEntry(
|
||||
Attribute attribute, Modifier modifier,
|
||||
EquipmentSlotGroup slotGroup, AttributeDisplay display
|
||||
) {
|
||||
this.attribute = attribute;
|
||||
this.modifier = modifier;
|
||||
this.slotGroup = slotGroup;
|
||||
this.display = display;
|
||||
}
|
||||
|
||||
public static ModifierEntry read(PacketWrapper<?> wrapper) {
|
||||
Attribute attribute = wrapper.readMappedEntity(Attributes::getById);
|
||||
Modifier modifier = Modifier.read(wrapper);
|
||||
EquipmentSlotGroup slot = wrapper.readEnum(EquipmentSlotGroup.values());
|
||||
return new ModifierEntry(attribute, modifier, slot);
|
||||
AttributeDisplay display = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_6)
|
||||
? AttributeDisplay.read(wrapper) : DefaultAttributeDisplay.INSTANCE;
|
||||
return new ModifierEntry(attribute, modifier, slot, display);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, ModifierEntry entry) {
|
||||
wrapper.writeMappedEntity(entry.attribute);
|
||||
Modifier.write(wrapper, entry.modifier);
|
||||
wrapper.writeEnum(entry.slotGroup);
|
||||
if (wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_6)) {
|
||||
AttributeDisplay.write(wrapper, entry.display);
|
||||
}
|
||||
}
|
||||
|
||||
public Attribute getAttribute() {
|
||||
@@ -294,7 +338,12 @@ public class ItemAttributeModifiers {
|
||||
CHEST("chest"),
|
||||
HEAD("head"),
|
||||
ARMOR("armor"),
|
||||
BODY("body");
|
||||
BODY("body"),
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
SADDLE("saddle"),
|
||||
;
|
||||
|
||||
public static final Index<String, EquipmentSlotGroup> ID_INDEX = Index.create(
|
||||
EquipmentSlotGroup.class, EquipmentSlotGroup::getId);
|
||||
|
||||
+294
@@ -0,0 +1,294 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin.item;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.mapper.MappedEntitySet;
|
||||
import com.github.retrooper.packetevents.protocol.sound.Sound;
|
||||
import com.github.retrooper.packetevents.protocol.world.damagetype.DamageType;
|
||||
import com.github.retrooper.packetevents.protocol.world.damagetype.DamageTypes;
|
||||
import com.github.retrooper.packetevents.resources.ResourceLocation;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
public class ItemBlocksAttacks {
|
||||
|
||||
private float blockDelaySeconds;
|
||||
private float disableCooldownScale;
|
||||
private List<DamageReduction> damageReductions;
|
||||
private ItemDamageFunction itemDamage;
|
||||
private @Nullable ResourceLocation bypassedBy;
|
||||
private @Nullable Sound blockSound;
|
||||
private @Nullable Sound disableSound;
|
||||
|
||||
public ItemBlocksAttacks(
|
||||
float blockDelaySeconds, float disableCooldownScale, List<DamageReduction> damageReductions,
|
||||
ItemDamageFunction itemDamage, @Nullable ResourceLocation bypassedBy,
|
||||
@Nullable Sound blockSound, @Nullable Sound disableSound
|
||||
) {
|
||||
this.blockDelaySeconds = blockDelaySeconds;
|
||||
this.disableCooldownScale = disableCooldownScale;
|
||||
this.damageReductions = damageReductions;
|
||||
this.itemDamage = itemDamage;
|
||||
this.bypassedBy = bypassedBy;
|
||||
this.blockSound = blockSound;
|
||||
this.disableSound = disableSound;
|
||||
}
|
||||
|
||||
public static ItemBlocksAttacks read(PacketWrapper<?> wrapper) {
|
||||
float blockDelaySeconds = wrapper.readFloat();
|
||||
float disableCooldownScale = wrapper.readFloat();
|
||||
List<DamageReduction> damageReductions = wrapper.readList(DamageReduction::read);
|
||||
ItemDamageFunction itemDamage = ItemDamageFunction.read(wrapper);
|
||||
ResourceLocation bypassedBy = wrapper.readOptional(PacketWrapper::readIdentifier);
|
||||
Sound blockSound = wrapper.readOptional(Sound::read);
|
||||
Sound disableSound = wrapper.readOptional(Sound::read);
|
||||
return new ItemBlocksAttacks(
|
||||
blockDelaySeconds, disableCooldownScale, damageReductions,
|
||||
itemDamage, bypassedBy, blockSound, disableSound);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, ItemBlocksAttacks attack) {
|
||||
wrapper.writeFloat(attack.blockDelaySeconds);
|
||||
wrapper.writeFloat(attack.disableCooldownScale);
|
||||
wrapper.writeList(attack.damageReductions, DamageReduction::write);
|
||||
ItemDamageFunction.write(wrapper, attack.itemDamage);
|
||||
wrapper.writeOptional(attack.bypassedBy, PacketWrapper::writeIdentifier);
|
||||
wrapper.writeOptional(attack.blockSound, Sound::write);
|
||||
wrapper.writeOptional(attack.disableSound, Sound::write);
|
||||
}
|
||||
|
||||
public float getBlockDelaySeconds() {
|
||||
return this.blockDelaySeconds;
|
||||
}
|
||||
|
||||
public void setBlockDelaySeconds(float blockDelaySeconds) {
|
||||
this.blockDelaySeconds = blockDelaySeconds;
|
||||
}
|
||||
|
||||
public float getDisableCooldownScale() {
|
||||
return this.disableCooldownScale;
|
||||
}
|
||||
|
||||
public void setDisableCooldownScale(float disableCooldownScale) {
|
||||
this.disableCooldownScale = disableCooldownScale;
|
||||
}
|
||||
|
||||
public List<DamageReduction> getDamageReductions() {
|
||||
return this.damageReductions;
|
||||
}
|
||||
|
||||
public void setDamageReductions(List<DamageReduction> damageReductions) {
|
||||
this.damageReductions = damageReductions;
|
||||
}
|
||||
|
||||
public ItemDamageFunction getItemDamage() {
|
||||
return this.itemDamage;
|
||||
}
|
||||
|
||||
public void setItemDamage(ItemDamageFunction itemDamage) {
|
||||
this.itemDamage = itemDamage;
|
||||
}
|
||||
|
||||
public @Nullable ResourceLocation getBypassedBy() {
|
||||
return this.bypassedBy;
|
||||
}
|
||||
|
||||
public void setBypassedBy(@Nullable ResourceLocation bypassedBy) {
|
||||
this.bypassedBy = bypassedBy;
|
||||
}
|
||||
|
||||
public @Nullable Sound getBlockSound() {
|
||||
return this.blockSound;
|
||||
}
|
||||
|
||||
public void setBlockSound(@Nullable Sound blockSound) {
|
||||
this.blockSound = blockSound;
|
||||
}
|
||||
|
||||
public @Nullable Sound getDisableSound() {
|
||||
return this.disableSound;
|
||||
}
|
||||
|
||||
public void setDisableSound(@Nullable Sound disableSound) {
|
||||
this.disableSound = disableSound;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof ItemBlocksAttacks)) return false;
|
||||
ItemBlocksAttacks that = (ItemBlocksAttacks) obj;
|
||||
if (Float.compare(that.blockDelaySeconds, this.blockDelaySeconds) != 0) return false;
|
||||
if (Float.compare(that.disableCooldownScale, this.disableCooldownScale) != 0) return false;
|
||||
if (!this.damageReductions.equals(that.damageReductions)) return false;
|
||||
if (!this.itemDamage.equals(that.itemDamage)) return false;
|
||||
if (!Objects.equals(this.bypassedBy, that.bypassedBy)) return false;
|
||||
if (!Objects.equals(this.blockSound, that.blockSound)) return false;
|
||||
return Objects.equals(this.disableSound, that.disableSound);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(this.blockDelaySeconds, this.disableCooldownScale, this.damageReductions, this.itemDamage, this.bypassedBy, this.blockSound, this.disableSound);
|
||||
}
|
||||
|
||||
public static final class DamageReduction {
|
||||
|
||||
private float horizontalBlockingAngle;
|
||||
private @Nullable MappedEntitySet<DamageType> type;
|
||||
private float base;
|
||||
private float factor;
|
||||
|
||||
public DamageReduction(float horizontalBlockingAngle, @Nullable MappedEntitySet<DamageType> type, float base, float factor) {
|
||||
this.horizontalBlockingAngle = horizontalBlockingAngle;
|
||||
this.type = type;
|
||||
this.base = base;
|
||||
this.factor = factor;
|
||||
}
|
||||
|
||||
public static DamageReduction read(PacketWrapper<?> wrapper) {
|
||||
float horizontalBlockingAngle = wrapper.readFloat();
|
||||
MappedEntitySet<DamageType> type = wrapper.readOptional(ew ->
|
||||
MappedEntitySet.read(ew, DamageTypes.getRegistry()));
|
||||
float base = wrapper.readFloat();
|
||||
float factor = wrapper.readFloat();
|
||||
return new DamageReduction(horizontalBlockingAngle, type, base, factor);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, DamageReduction reduction) {
|
||||
wrapper.writeFloat(reduction.horizontalBlockingAngle);
|
||||
wrapper.writeOptional(reduction.type, MappedEntitySet::write);
|
||||
wrapper.writeFloat(reduction.base);
|
||||
wrapper.writeFloat(reduction.factor);
|
||||
}
|
||||
|
||||
public float getHorizontalBlockingAngle() {
|
||||
return this.horizontalBlockingAngle;
|
||||
}
|
||||
|
||||
public void setHorizontalBlockingAngle(float horizontalBlockingAngle) {
|
||||
this.horizontalBlockingAngle = horizontalBlockingAngle;
|
||||
}
|
||||
|
||||
public @Nullable MappedEntitySet<DamageType> getType() {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
public void setType(@Nullable MappedEntitySet<DamageType> type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public float getBase() {
|
||||
return this.base;
|
||||
}
|
||||
|
||||
public void setBase(float base) {
|
||||
this.base = base;
|
||||
}
|
||||
|
||||
public float getFactor() {
|
||||
return this.factor;
|
||||
}
|
||||
|
||||
public void setFactor(float factor) {
|
||||
this.factor = factor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof DamageReduction)) return false;
|
||||
DamageReduction that = (DamageReduction) obj;
|
||||
if (Float.compare(that.horizontalBlockingAngle, this.horizontalBlockingAngle) != 0) return false;
|
||||
if (Float.compare(that.base, this.base) != 0) return false;
|
||||
if (Float.compare(that.factor, this.factor) != 0) return false;
|
||||
return Objects.equals(this.type, that.type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(this.horizontalBlockingAngle, this.type, this.base, this.factor);
|
||||
}
|
||||
}
|
||||
|
||||
public static final class ItemDamageFunction {
|
||||
|
||||
private float threshold;
|
||||
private float base;
|
||||
private float factor;
|
||||
|
||||
public ItemDamageFunction(float threshold, float base, float factor) {
|
||||
this.threshold = threshold;
|
||||
this.base = base;
|
||||
this.factor = factor;
|
||||
}
|
||||
|
||||
public static ItemDamageFunction read(PacketWrapper<?> wrapper) {
|
||||
float threshold = wrapper.readFloat();
|
||||
float base = wrapper.readFloat();
|
||||
float factor = wrapper.readFloat();
|
||||
return new ItemDamageFunction(threshold, base, factor);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, ItemDamageFunction function) {
|
||||
wrapper.writeFloat(function.threshold);
|
||||
wrapper.writeFloat(function.base);
|
||||
wrapper.writeFloat(function.factor);
|
||||
}
|
||||
|
||||
public float getThreshold() {
|
||||
return this.threshold;
|
||||
}
|
||||
|
||||
public void setThreshold(float threshold) {
|
||||
this.threshold = threshold;
|
||||
}
|
||||
|
||||
public float getBase() {
|
||||
return this.base;
|
||||
}
|
||||
|
||||
public void setBase(float base) {
|
||||
this.base = base;
|
||||
}
|
||||
|
||||
public float getFactor() {
|
||||
return this.factor;
|
||||
}
|
||||
|
||||
public void setFactor(float factor) {
|
||||
this.factor = factor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof ItemDamageFunction)) return false;
|
||||
ItemDamageFunction that = (ItemDamageFunction) obj;
|
||||
if (Float.compare(that.threshold, this.threshold) != 0) return false;
|
||||
if (Float.compare(that.base, this.base) != 0) return false;
|
||||
return Float.compare(that.factor, this.factor) == 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(this.threshold, this.base, this.factor);
|
||||
}
|
||||
}
|
||||
}
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin.item;
|
||||
|
||||
import com.github.retrooper.packetevents.protocol.sound.Sound;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class ItemBreakSound {
|
||||
|
||||
private Sound sound;
|
||||
|
||||
public ItemBreakSound(Sound sound) {
|
||||
this.sound = sound;
|
||||
}
|
||||
|
||||
public static ItemBreakSound read(PacketWrapper<?> wrapper) {
|
||||
Sound sound = Sound.read(wrapper);
|
||||
return new ItemBreakSound(sound);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, ItemBreakSound sound) {
|
||||
Sound.write(wrapper, sound.sound);
|
||||
}
|
||||
|
||||
public Sound getSound() {
|
||||
return this.sound;
|
||||
}
|
||||
|
||||
public void setSound(Sound sound) {
|
||||
this.sound = sound;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof ItemBreakSound)) return false;
|
||||
ItemBreakSound that = (ItemBreakSound) obj;
|
||||
return this.sound.equals(that.sound);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.sound);
|
||||
}
|
||||
}
|
||||
+26
-2
@@ -18,15 +18,29 @@
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin.item;
|
||||
|
||||
import com.github.retrooper.packetevents.manager.server.ServerVersion;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class ItemDyeColor {
|
||||
|
||||
private int rgb;
|
||||
/**
|
||||
* Removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
private boolean showInTooltip;
|
||||
|
||||
public ItemDyeColor(int rgb) {
|
||||
this(rgb, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link #showInTooltip} has been removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public ItemDyeColor(int rgb, boolean showInTooltip) {
|
||||
this.rgb = rgb;
|
||||
this.showInTooltip = showInTooltip;
|
||||
@@ -34,13 +48,15 @@ public class ItemDyeColor {
|
||||
|
||||
public static ItemDyeColor read(PacketWrapper<?> wrapper) {
|
||||
int rgb = wrapper.readInt();
|
||||
boolean showInTooltip = wrapper.readBoolean();
|
||||
boolean showInTooltip = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5) || wrapper.readBoolean();
|
||||
return new ItemDyeColor(rgb, showInTooltip);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, ItemDyeColor color) {
|
||||
wrapper.writeInt(color.rgb);
|
||||
wrapper.writeBoolean(color.showInTooltip);
|
||||
if (wrapper.getServerVersion().isOlderThan(ServerVersion.V_1_21_5)) {
|
||||
wrapper.writeBoolean(color.showInTooltip);
|
||||
}
|
||||
}
|
||||
|
||||
public int getRgb() {
|
||||
@@ -51,10 +67,18 @@ public class ItemDyeColor {
|
||||
this.rgb = rgb;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public boolean isShowInTooltip() {
|
||||
return this.showInTooltip;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public void setShowInTooltip(boolean showInTooltip) {
|
||||
this.showInTooltip = showInTooltip;
|
||||
}
|
||||
|
||||
+31
-2
@@ -18,10 +18,12 @@
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin.item;
|
||||
|
||||
import com.github.retrooper.packetevents.manager.server.ServerVersion;
|
||||
import com.github.retrooper.packetevents.protocol.item.enchantment.type.EnchantmentType;
|
||||
import com.github.retrooper.packetevents.protocol.item.enchantment.type.EnchantmentTypes;
|
||||
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
@@ -32,6 +34,11 @@ public class ItemEnchantments implements Iterable<Map.Entry<EnchantmentType, Int
|
||||
|
||||
public static final ItemEnchantments EMPTY = new ItemEnchantments(
|
||||
Collections.emptyMap(), true) {
|
||||
@Override
|
||||
public void setEnchantments(Map<EnchantmentType, Integer> enchantments) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setShowInTooltip(boolean showInTooltip) {
|
||||
throw new UnsupportedOperationException();
|
||||
@@ -39,8 +46,20 @@ public class ItemEnchantments implements Iterable<Map.Entry<EnchantmentType, Int
|
||||
};
|
||||
|
||||
private Map<EnchantmentType, Integer> enchantments;
|
||||
/**
|
||||
* Removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
private boolean showInTooltip;
|
||||
|
||||
public ItemEnchantments(Map<EnchantmentType, Integer> enchantments) {
|
||||
this(enchantments, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public ItemEnchantments(Map<EnchantmentType, Integer> enchantments, boolean showInTooltip) {
|
||||
this.enchantments = Collections.unmodifiableMap(enchantments);
|
||||
this.showInTooltip = showInTooltip;
|
||||
@@ -51,7 +70,7 @@ public class ItemEnchantments implements Iterable<Map.Entry<EnchantmentType, Int
|
||||
ew -> wrapper.readMappedEntity(EnchantmentTypes.getRegistry()),
|
||||
PacketWrapper::readVarInt
|
||||
);
|
||||
boolean showInTooltip = wrapper.readBoolean();
|
||||
boolean showInTooltip = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5) || wrapper.readBoolean();
|
||||
return new ItemEnchantments(enchantments, showInTooltip);
|
||||
}
|
||||
|
||||
@@ -61,7 +80,9 @@ public class ItemEnchantments implements Iterable<Map.Entry<EnchantmentType, Int
|
||||
(ew, enchantment) -> ew.writeVarInt(enchantment.getId(version)),
|
||||
PacketWrapper::writeVarInt
|
||||
);
|
||||
wrapper.writeBoolean(enchantments.isShowInTooltip());
|
||||
if (wrapper.getServerVersion().isOlderThan(ServerVersion.V_1_21_5)) {
|
||||
wrapper.writeBoolean(enchantments.isShowInTooltip());
|
||||
}
|
||||
}
|
||||
|
||||
public int getEnchantmentLevel(EnchantmentType enchantment) {
|
||||
@@ -92,10 +113,18 @@ public class ItemEnchantments implements Iterable<Map.Entry<EnchantmentType, Int
|
||||
this.enchantments = enchantments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public boolean isShowInTooltip() {
|
||||
return this.showInTooltip;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public void setShowInTooltip(boolean showInTooltip) {
|
||||
this.showInTooltip = showInTooltip;
|
||||
}
|
||||
|
||||
+123
-8
@@ -18,13 +18,16 @@
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin.item;
|
||||
|
||||
import com.github.retrooper.packetevents.manager.server.ServerVersion;
|
||||
import com.github.retrooper.packetevents.protocol.entity.type.EntityType;
|
||||
import com.github.retrooper.packetevents.protocol.entity.type.EntityTypes;
|
||||
import com.github.retrooper.packetevents.protocol.mapper.MappedEntitySet;
|
||||
import com.github.retrooper.packetevents.protocol.player.EquipmentSlot;
|
||||
import com.github.retrooper.packetevents.protocol.sound.Sound;
|
||||
import com.github.retrooper.packetevents.protocol.sound.Sounds;
|
||||
import com.github.retrooper.packetevents.resources.ResourceLocation;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Objects;
|
||||
@@ -39,7 +42,20 @@ public class ItemEquippable {
|
||||
private boolean dispensable;
|
||||
private boolean swappable;
|
||||
private boolean damageOnHurt;
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
private boolean equipOnInteract;
|
||||
/**
|
||||
* Added with 1.21.6
|
||||
*/
|
||||
private boolean canBeSheared;
|
||||
/**
|
||||
* Added with 1.21.6
|
||||
*/
|
||||
private Sound shearingSound;
|
||||
|
||||
@ApiStatus.Obsolete
|
||||
public ItemEquippable(
|
||||
EquipmentSlot slot,
|
||||
Sound equipSound,
|
||||
@@ -49,6 +65,40 @@ public class ItemEquippable {
|
||||
boolean dispensable,
|
||||
boolean swappable,
|
||||
boolean damageOnHurt
|
||||
) {
|
||||
this(slot, equipSound, assetId, cameraOverlay, allowedEntities,
|
||||
dispensable, swappable, damageOnHurt, false);
|
||||
}
|
||||
|
||||
@ApiStatus.Obsolete
|
||||
public ItemEquippable(
|
||||
EquipmentSlot slot,
|
||||
Sound equipSound,
|
||||
@Nullable ResourceLocation assetId,
|
||||
@Nullable ResourceLocation cameraOverlay,
|
||||
@Nullable MappedEntitySet<EntityType> allowedEntities,
|
||||
boolean dispensable,
|
||||
boolean swappable,
|
||||
boolean damageOnHurt,
|
||||
boolean equipOnInteract
|
||||
) {
|
||||
this(slot, equipSound, assetId, cameraOverlay, allowedEntities,
|
||||
dispensable, swappable, damageOnHurt, equipOnInteract,
|
||||
false, Sounds.ITEM_SHEARS_SNIP);
|
||||
}
|
||||
|
||||
public ItemEquippable(
|
||||
EquipmentSlot slot,
|
||||
Sound equipSound,
|
||||
@Nullable ResourceLocation assetId,
|
||||
@Nullable ResourceLocation cameraOverlay,
|
||||
@Nullable MappedEntitySet<EntityType> allowedEntities,
|
||||
boolean dispensable,
|
||||
boolean swappable,
|
||||
boolean damageOnHurt,
|
||||
boolean equipOnInteract,
|
||||
boolean canBeSheared,
|
||||
Sound shearingSound
|
||||
) {
|
||||
this.slot = slot;
|
||||
this.equipSound = equipSound;
|
||||
@@ -58,20 +108,34 @@ public class ItemEquippable {
|
||||
this.dispensable = dispensable;
|
||||
this.swappable = swappable;
|
||||
this.damageOnHurt = damageOnHurt;
|
||||
this.equipOnInteract = equipOnInteract;
|
||||
this.canBeSheared = canBeSheared;
|
||||
this.shearingSound = shearingSound;
|
||||
}
|
||||
|
||||
public static ItemEquippable read(PacketWrapper<?> wrapper) {
|
||||
EquipmentSlot slot = wrapper.readEnum(EquipmentSlot.values());
|
||||
Sound equipSound = Sound.read(wrapper);
|
||||
ResourceLocation model = wrapper.readOptional(PacketWrapper::readIdentifier);
|
||||
ResourceLocation assetId = wrapper.readOptional(PacketWrapper::readIdentifier);
|
||||
ResourceLocation cameraOverlay = wrapper.readOptional(PacketWrapper::readIdentifier);
|
||||
MappedEntitySet<EntityType> allowedEntities = wrapper.readOptional(
|
||||
ew -> MappedEntitySet.read(ew, EntityTypes::getById));
|
||||
boolean dispensable = wrapper.readBoolean();
|
||||
boolean swappable = wrapper.readBoolean();
|
||||
boolean damageOnHurt = wrapper.readBoolean();
|
||||
return new ItemEquippable(slot, equipSound, model,
|
||||
cameraOverlay, allowedEntities, dispensable, swappable, damageOnHurt);
|
||||
boolean equipOnInteract = false;
|
||||
boolean canBeSheared = false;
|
||||
Sound shearingSound = Sounds.ITEM_SHEARS_SNIP;
|
||||
if (wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5)) {
|
||||
equipOnInteract = wrapper.readBoolean();
|
||||
if (wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_6)) {
|
||||
canBeSheared = wrapper.readBoolean();
|
||||
shearingSound = Sound.read(wrapper);
|
||||
}
|
||||
}
|
||||
return new ItemEquippable(slot, equipSound, assetId,
|
||||
cameraOverlay, allowedEntities, dispensable, swappable,
|
||||
damageOnHurt, equipOnInteract, canBeSheared, shearingSound);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, ItemEquippable equippable) {
|
||||
@@ -83,6 +147,13 @@ public class ItemEquippable {
|
||||
wrapper.writeBoolean(equippable.dispensable);
|
||||
wrapper.writeBoolean(equippable.swappable);
|
||||
wrapper.writeBoolean(equippable.damageOnHurt);
|
||||
if (wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5)) {
|
||||
wrapper.writeBoolean(equippable.equipOnInteract);
|
||||
if (wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_6)) {
|
||||
wrapper.writeBoolean(equippable.canBeSheared);
|
||||
Sound.write(wrapper, equippable.shearingSound);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public EquipmentSlot getSlot() {
|
||||
@@ -149,6 +220,48 @@ public class ItemEquippable {
|
||||
this.damageOnHurt = damageOnHurt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public boolean isEquipOnInteract() {
|
||||
return this.equipOnInteract;
|
||||
}
|
||||
|
||||
/**
|
||||
* Added with 1.21.5
|
||||
*/
|
||||
public void setEquipOnInteract(boolean equipOnInteract) {
|
||||
this.equipOnInteract = equipOnInteract;
|
||||
}
|
||||
|
||||
/**
|
||||
* Added with 1.21.6
|
||||
*/
|
||||
public boolean isCanBeSheared() {
|
||||
return this.canBeSheared;
|
||||
}
|
||||
|
||||
/**
|
||||
* Added with 1.21.6
|
||||
*/
|
||||
public void setCanBeSheared(boolean canBeSheared) {
|
||||
this.canBeSheared = canBeSheared;
|
||||
}
|
||||
|
||||
/**
|
||||
* Added with 1.21.6
|
||||
*/
|
||||
public Sound getShearingSound() {
|
||||
return this.shearingSound;
|
||||
}
|
||||
|
||||
/**
|
||||
* Added with 1.21.6
|
||||
*/
|
||||
public void setShearingSound(Sound shearingSound) {
|
||||
this.shearingSound = shearingSound;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public @Nullable ResourceLocation getModel() {
|
||||
return this.assetId;
|
||||
@@ -161,26 +274,28 @@ public class ItemEquippable {
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj) return true;
|
||||
if (!(obj instanceof ItemEquippable)) return false;
|
||||
ItemEquippable that = (ItemEquippable) obj;
|
||||
if (this.dispensable != that.dispensable) return false;
|
||||
if (this.swappable != that.swappable) return false;
|
||||
if (this.damageOnHurt != that.damageOnHurt) return false;
|
||||
if (this.equipOnInteract != that.equipOnInteract) return false;
|
||||
if (this.canBeSheared != that.canBeSheared) return false;
|
||||
if (this.slot != that.slot) return false;
|
||||
if (!Objects.equals(this.equipSound, that.equipSound)) return false;
|
||||
if (!this.equipSound.equals(that.equipSound)) return false;
|
||||
if (!Objects.equals(this.assetId, that.assetId)) return false;
|
||||
if (!Objects.equals(this.cameraOverlay, that.cameraOverlay)) return false;
|
||||
return Objects.equals(this.allowedEntities, that.allowedEntities);
|
||||
if (!Objects.equals(this.allowedEntities, that.allowedEntities)) return false;
|
||||
return this.shearingSound.equals(that.shearingSound);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(this.slot, this.equipSound, this.assetId, this.cameraOverlay, this.allowedEntities, this.dispensable, this.swappable, this.damageOnHurt);
|
||||
return Objects.hash(this.slot, this.equipSound, this.assetId, this.cameraOverlay, this.allowedEntities, this.dispensable, this.swappable, this.damageOnHurt, this.equipOnInteract, this.canBeSheared, this.shearingSound);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ItemEquippable{slot=" + this.slot + ", equipSound=" + this.equipSound + ", model=" + this.assetId + ", cameraOverlay=" + this.cameraOverlay + ", allowedEntities=" + this.allowedEntities + ", dispensable=" + this.dispensable + ", swappable=" + this.swappable + ", damageOnHurt=" + this.damageOnHurt + '}';
|
||||
return "ItemEquippable{slot=" + this.slot + ", equipSound=" + this.equipSound + ", assetId=" + this.assetId + ", cameraOverlay=" + this.cameraOverlay + ", allowedEntities=" + this.allowedEntities + ", dispensable=" + this.dispensable + ", swappable=" + this.swappable + ", damageOnHurt=" + this.damageOnHurt + ", equipOnInteract=" + this.equipOnInteract + ", canBeSheared=" + this.canBeSheared + ", shearingSound=" + this.shearingSound + '}';
|
||||
}
|
||||
}
|
||||
+74
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin.item;
|
||||
|
||||
import com.github.retrooper.packetevents.manager.server.ServerVersion;
|
||||
import com.github.retrooper.packetevents.protocol.item.instrument.Instrument;
|
||||
import com.github.retrooper.packetevents.protocol.item.instrument.Instruments;
|
||||
import com.github.retrooper.packetevents.protocol.mapper.MaybeMappedEntity;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class ItemInstrument {
|
||||
|
||||
private MaybeMappedEntity<Instrument> instrument;
|
||||
|
||||
public ItemInstrument(MaybeMappedEntity<Instrument> instrument) {
|
||||
this.instrument = instrument;
|
||||
}
|
||||
|
||||
public static ItemInstrument read(PacketWrapper<?> wrapper) {
|
||||
MaybeMappedEntity<Instrument> instrument;
|
||||
if (wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5)) {
|
||||
instrument = MaybeMappedEntity.read(wrapper, Instruments.getRegistry(), Instrument::read);
|
||||
} else {
|
||||
instrument = new MaybeMappedEntity<>(Instrument.read(wrapper));
|
||||
}
|
||||
return new ItemInstrument(instrument);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, ItemInstrument instrument) {
|
||||
if (wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5)) {
|
||||
MaybeMappedEntity.write(wrapper, instrument.instrument, Instrument::write);
|
||||
} else {
|
||||
Instrument.write(wrapper, instrument.instrument.getValueOrThrow());
|
||||
}
|
||||
}
|
||||
|
||||
public MaybeMappedEntity<Instrument> getInstrument() {
|
||||
return this.instrument;
|
||||
}
|
||||
|
||||
public void setInstrument(MaybeMappedEntity<Instrument> instrument) {
|
||||
this.instrument = instrument;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof ItemInstrument)) return false;
|
||||
ItemInstrument that = (ItemInstrument) obj;
|
||||
return this.instrument.equals(that.instrument);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.instrument);
|
||||
}
|
||||
}
|
||||
+69
-40
@@ -18,20 +18,35 @@
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin.item;
|
||||
|
||||
import com.github.retrooper.packetevents.manager.server.ServerVersion;
|
||||
import com.github.retrooper.packetevents.protocol.item.jukebox.IJukeboxSong;
|
||||
import com.github.retrooper.packetevents.protocol.item.jukebox.JukeboxSong;
|
||||
import com.github.retrooper.packetevents.protocol.item.jukebox.JukeboxSongs;
|
||||
import com.github.retrooper.packetevents.protocol.mapper.MaybeMappedEntity;
|
||||
import com.github.retrooper.packetevents.resources.ResourceLocation;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class ItemJukeboxPlayable {
|
||||
|
||||
private @Nullable IJukeboxSong song;
|
||||
private @Nullable ResourceLocation songKey;
|
||||
private MaybeMappedEntity<IJukeboxSong> song;
|
||||
/**
|
||||
* Removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
private boolean showInTooltip;
|
||||
|
||||
public ItemJukeboxPlayable(MaybeMappedEntity<IJukeboxSong> song) {
|
||||
this(song, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link #showInTooltip} has been removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public ItemJukeboxPlayable(
|
||||
@Nullable JukeboxSong song,
|
||||
@Nullable ResourceLocation songKey,
|
||||
@@ -40,85 +55,99 @@ public class ItemJukeboxPlayable {
|
||||
this((IJukeboxSong) song, songKey, showInTooltip);
|
||||
}
|
||||
|
||||
/**
|
||||
* use {@link #ItemJukeboxPlayable(MaybeMappedEntity, boolean)}
|
||||
*/
|
||||
@Deprecated
|
||||
public ItemJukeboxPlayable(
|
||||
@Nullable IJukeboxSong song,
|
||||
@Nullable ResourceLocation songKey,
|
||||
boolean showInTooltip
|
||||
) {
|
||||
if ((song == null) == (songKey == null)) {
|
||||
throw new IllegalStateException("Illegal state of both song and "
|
||||
+ "song key combined: " + song + " / " + songKey);
|
||||
}
|
||||
this(new MaybeMappedEntity<>(song, songKey), showInTooltip);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link #showInTooltip} has been removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public ItemJukeboxPlayable(
|
||||
MaybeMappedEntity<IJukeboxSong> song,
|
||||
boolean showInTooltip
|
||||
) {
|
||||
this.song = song;
|
||||
this.songKey = songKey;
|
||||
this.showInTooltip = showInTooltip;
|
||||
}
|
||||
|
||||
public static ItemJukeboxPlayable read(PacketWrapper<?> wrapper) {
|
||||
IJukeboxSong song;
|
||||
ResourceLocation songKey;
|
||||
if (wrapper.readBoolean()) {
|
||||
song = IJukeboxSong.read(wrapper);
|
||||
songKey = null;
|
||||
} else {
|
||||
song = null;
|
||||
songKey = wrapper.readIdentifier();
|
||||
}
|
||||
boolean showInTooltip = wrapper.readBoolean();
|
||||
return new ItemJukeboxPlayable(song, songKey, showInTooltip);
|
||||
MaybeMappedEntity<IJukeboxSong> song = MaybeMappedEntity.read(wrapper, JukeboxSongs.getRegistry(), IJukeboxSong::read);
|
||||
boolean showInTooltip = wrapper.getServerVersion().isNewerThanOrEquals(ServerVersion.V_1_21_5) || wrapper.readBoolean();
|
||||
return new ItemJukeboxPlayable(song, showInTooltip);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, ItemJukeboxPlayable jukeboxPlayable) {
|
||||
if (jukeboxPlayable.song != null) {
|
||||
wrapper.writeBoolean(true);
|
||||
IJukeboxSong.write(wrapper, jukeboxPlayable.song);
|
||||
} else {
|
||||
assert jukeboxPlayable.songKey != null;
|
||||
wrapper.writeBoolean(false);
|
||||
wrapper.writeIdentifier(jukeboxPlayable.songKey);
|
||||
MaybeMappedEntity.write(wrapper, jukeboxPlayable.song, IJukeboxSong::write);
|
||||
if (wrapper.getServerVersion().isOlderThan(ServerVersion.V_1_21_5)) {
|
||||
wrapper.writeBoolean(jukeboxPlayable.showInTooltip);
|
||||
}
|
||||
wrapper.writeBoolean(jukeboxPlayable.showInTooltip);
|
||||
}
|
||||
|
||||
public @Nullable IJukeboxSong getJukeboxSong() {
|
||||
public MaybeMappedEntity<IJukeboxSong> getSongHolder() {
|
||||
return this.song;
|
||||
}
|
||||
|
||||
public void setSongHolder(MaybeMappedEntity<IJukeboxSong> songHolder) {
|
||||
this.song = songHolder;
|
||||
}
|
||||
|
||||
public @Nullable IJukeboxSong getJukeboxSong() {
|
||||
return this.song.getValue();
|
||||
}
|
||||
|
||||
public void setJukeboxSong(@Nullable IJukeboxSong song) {
|
||||
this.song = new MaybeMappedEntity<>(song);
|
||||
}
|
||||
|
||||
public void setJukeboxSong(@Nullable JukeboxSong song) {
|
||||
this.song = song;
|
||||
this.songKey = null;
|
||||
this.setJukeboxSong((IJukeboxSong) song);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public @Nullable JukeboxSong getSong() {
|
||||
if (this.song == null) {
|
||||
IJukeboxSong song = this.getJukeboxSong();
|
||||
if (song == null) {
|
||||
return null;
|
||||
} else if (this.song instanceof JukeboxSong) {
|
||||
return (JukeboxSong) this.song;
|
||||
} else if (song instanceof JukeboxSong) {
|
||||
return (JukeboxSong) song;
|
||||
}
|
||||
return (JukeboxSong) this.song.copy(null);
|
||||
return (JukeboxSong) song.copy(null);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void setSong(JukeboxSong song) {
|
||||
this.song = song;
|
||||
this.songKey = null;
|
||||
this.setJukeboxSong((IJukeboxSong) song);
|
||||
}
|
||||
|
||||
public @Nullable ResourceLocation getSongKey() {
|
||||
return this.songKey;
|
||||
return this.song.getName();
|
||||
}
|
||||
|
||||
public void setSongKey(ResourceLocation songKey) {
|
||||
this.song = null;
|
||||
this.songKey = songKey;
|
||||
this.song = new MaybeMappedEntity<>(songKey);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public boolean isShowInTooltip() {
|
||||
return this.showInTooltip;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removed in 1.21.5
|
||||
*/
|
||||
@ApiStatus.Obsolete
|
||||
public void setShowInTooltip(boolean showInTooltip) {
|
||||
this.showInTooltip = showInTooltip;
|
||||
}
|
||||
@@ -130,11 +159,11 @@ public class ItemJukeboxPlayable {
|
||||
ItemJukeboxPlayable that = (ItemJukeboxPlayable) obj;
|
||||
if (this.showInTooltip != that.showInTooltip) return false;
|
||||
if (!Objects.equals(this.song, that.song)) return false;
|
||||
return Objects.equals(this.songKey, that.songKey);
|
||||
return Objects.equals(this.song, that.song);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(this.song, this.songKey, this.showInTooltip);
|
||||
return Objects.hash(this.song, this.song, this.showInTooltip);
|
||||
}
|
||||
}
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin.item;
|
||||
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class ItemPotionDurationScale {
|
||||
|
||||
private float scale;
|
||||
|
||||
public ItemPotionDurationScale(float scale) {
|
||||
this.scale = scale;
|
||||
}
|
||||
|
||||
public static ItemPotionDurationScale read(PacketWrapper<?> wrapper) {
|
||||
float scale = wrapper.readFloat();
|
||||
return new ItemPotionDurationScale(scale);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, ItemPotionDurationScale scale) {
|
||||
wrapper.writeFloat(scale.scale);
|
||||
}
|
||||
|
||||
public float getScale() {
|
||||
return this.scale;
|
||||
}
|
||||
|
||||
public void setScale(float scale) {
|
||||
this.scale = scale;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof ItemPotionDurationScale)) return false;
|
||||
ItemPotionDurationScale that = (ItemPotionDurationScale) obj;
|
||||
return Float.compare(that.scale, this.scale) == 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.scale);
|
||||
}
|
||||
}
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* This file is part of packetevents - https://github.com/retrooper/packetevents
|
||||
* Copyright (C) 2025 retrooper and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.github.retrooper.packetevents.protocol.component.builtin.item;
|
||||
|
||||
import com.github.retrooper.packetevents.resources.ResourceLocation;
|
||||
import com.github.retrooper.packetevents.wrapper.PacketWrapper;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class ItemProvidesBannerPatterns {
|
||||
|
||||
private ResourceLocation tagKey;
|
||||
|
||||
public ItemProvidesBannerPatterns(ResourceLocation tagKey) {
|
||||
this.tagKey = tagKey;
|
||||
}
|
||||
|
||||
public static ItemProvidesBannerPatterns read(PacketWrapper<?> wrapper) {
|
||||
ResourceLocation tagKey = wrapper.readIdentifier();
|
||||
return new ItemProvidesBannerPatterns(tagKey);
|
||||
}
|
||||
|
||||
public static void write(PacketWrapper<?> wrapper, ItemProvidesBannerPatterns patterns) {
|
||||
wrapper.writeIdentifier(patterns.tagKey);
|
||||
}
|
||||
|
||||
public ResourceLocation getTagKey() {
|
||||
return this.tagKey;
|
||||
}
|
||||
|
||||
public void setTagKey(ResourceLocation tagKey) {
|
||||
this.tagKey = tagKey;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof ItemProvidesBannerPatterns)) return false;
|
||||
ItemProvidesBannerPatterns that = (ItemProvidesBannerPatterns) obj;
|
||||
return this.tagKey.equals(that.tagKey);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(this.tagKey);
|
||||
}
|
||||
}
|
||||
Loaded 100 of 627 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user