Compare commits
899
Commits
1.2
...
v1.8-pre-13
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f44a5b3599 | ||
|
|
8ae21853c9 | ||
|
|
bd5e8b8ed5 | ||
|
|
a0dc82aba4 | ||
|
|
bb0f70cb44 | ||
|
|
e680d2b8f7 | ||
|
|
9dacbe2f36 | ||
|
|
74dde71db1 | ||
|
|
f1bc3d6f4a | ||
|
|
0fa893f949 | ||
|
|
2699a1e8f9 | ||
|
|
78b2eb07f5 | ||
|
|
49c1287664 | ||
|
|
83b3a10069 | ||
|
|
8aed1fda53 | ||
|
|
5f40eec0d3 | ||
|
|
104b894f50 | ||
|
|
bcba33a7cb | ||
|
|
4275c39d8a | ||
|
|
ae3adefd82 | ||
|
|
6e28602b73 | ||
|
|
584d3edb13 | ||
|
|
978ce4629a | ||
|
|
33cfa93f84 | ||
|
|
d5a29365b4 | ||
|
|
e12870b542 | ||
|
|
75301b188a | ||
|
|
be91a955dc | ||
|
|
8eb6ae03eb | ||
|
|
7bf4c081b3 | ||
|
|
55b6f2cbce | ||
|
|
e97dcf2ae3 | ||
|
|
ddcb92d04c | ||
|
|
4413aca711 | ||
|
|
c4307fa777 | ||
|
|
f4ada314ba | ||
|
|
dbbc40879a | ||
|
|
8d3f86722c | ||
|
|
09466af902 | ||
|
|
851d19f57d | ||
|
|
a4ede8dfcf | ||
|
|
1c48790a03 | ||
|
|
26bc3274fe | ||
|
|
805e2ad335 | ||
|
|
8b6c6d7b35 | ||
|
|
7bec3ae062 | ||
|
|
defddefb48 | ||
|
|
5201b18fe7 | ||
|
|
c449e8ced1 | ||
|
|
f22d593173 | ||
|
|
5a3ce13d93 | ||
|
|
ecd0d63dc2 | ||
|
|
066791b283 | ||
|
|
f05bf26293 | ||
|
|
75391bebde | ||
|
|
d413f9e41b | ||
|
|
efdc66739f | ||
|
|
adf652978f | ||
|
|
29e8e9020d | ||
|
|
64da1a54fa | ||
|
|
37740d072f | ||
|
|
6496f1402a | ||
|
|
e661ee75d7 | ||
|
|
dbd9df8c71 | ||
|
|
bb8027bcaf | ||
|
|
c7096d8b35 | ||
|
|
36b80763e3 | ||
|
|
bc861089b0 | ||
|
|
e5a43a8826 | ||
|
|
1e1b609eb7 | ||
|
|
957c8876cc | ||
|
|
2902ef8ba4 | ||
|
|
de07adb46a | ||
|
|
f3dbb6dd4c | ||
|
|
b954e68f29 | ||
|
|
8e09c54143 | ||
|
|
5e88678c52 | ||
|
|
60ad9f476d | ||
|
|
5b4579c67c | ||
|
|
d502de76dd | ||
|
|
eb5e21eb1b | ||
|
|
d747974950 | ||
|
|
ef8fe9161f | ||
|
|
50ede8bf24 | ||
|
|
81f90a955c | ||
|
|
0252dbf1b8 | ||
|
|
cd230ca35d | ||
|
|
4852e4bfca | ||
|
|
0ed112b6fc | ||
|
|
3db6390efb | ||
|
|
57aa65cb76 | ||
|
|
746be8a0cf | ||
|
|
0ea484bdb1 | ||
|
|
072dbfbbb4 | ||
|
|
58faab9f54 | ||
|
|
16d9a0c6a6 | ||
|
|
c2f55aa048 | ||
|
|
bcb8d0e785 | ||
|
|
a881496e2b | ||
|
|
e4913cb841 | ||
|
|
781278a2c5 | ||
|
|
f1bbcd61ed | ||
|
|
42bdc1f1ca | ||
|
|
f826363d01 | ||
|
|
0710f214c5 | ||
|
|
3c4298dcea | ||
|
|
0aeff7cab8 | ||
|
|
be340a9812 | ||
|
|
7122f1194c | ||
|
|
e8df865b3c | ||
|
|
9e38883dcd | ||
|
|
1d955cac6e | ||
|
|
106b7c6d75 | ||
|
|
e70609bbc2 | ||
|
|
e1e0735688 | ||
|
|
51a417cebd | ||
|
|
c98c4e7d38 | ||
|
|
042b55af62 | ||
|
|
ab8885eb6e | ||
|
|
069980d567 | ||
|
|
e6e3835846 | ||
|
|
bdb83dfd86 | ||
|
|
628730d484 | ||
|
|
7aefa35623 | ||
|
|
8964a0ac5d | ||
|
|
128ff6c60b | ||
|
|
1bc2bbc905 | ||
|
|
3f9977fd1c | ||
|
|
6f5bc43179 | ||
|
|
89cba54262 | ||
|
|
081c2fece1 | ||
|
|
0b9f646650 | ||
|
|
07ca8ac282 | ||
|
|
cb798d6fd0 | ||
|
|
5b06f2005c | ||
|
|
c07960814c | ||
|
|
a1b75243f3 | ||
|
|
9f9ca79f90 | ||
|
|
241f5ed707 | ||
|
|
276653975d | ||
|
|
ff985e4eee | ||
|
|
65c28b4c90 | ||
|
|
e994c34689 | ||
|
|
0eed580e72 | ||
|
|
88ccbdbbe7 | ||
|
|
4604981e7d | ||
|
|
bf990c0a20 | ||
|
|
cfebc47853 | ||
|
|
4a72e70506 | ||
|
|
edc07a38ae | ||
|
|
a4daa60a7f | ||
|
|
e3f7b6888c | ||
|
|
62bb1a501b | ||
|
|
92fab840c5 | ||
|
|
515a4a4f8c | ||
|
|
7518b9335e | ||
|
|
6221ff0b8b | ||
|
|
bacc1cd878 | ||
|
|
5144bd6199 | ||
|
|
a80770b8f7 | ||
|
|
1caca9fd96 | ||
|
|
59aa347e4e | ||
|
|
a22ce57287 | ||
|
|
bac63c57e7 | ||
|
|
78171c583d | ||
|
|
3821c6e98a | ||
|
|
e0c71e7c86 | ||
|
|
d9d054c0cd | ||
|
|
82304e4f45 | ||
|
|
cbc510f5a4 | ||
|
|
58040a338b | ||
|
|
9e5cba423d | ||
|
|
19cdd85b65 | ||
|
|
a6872ffc3c | ||
|
|
92ad799276 | ||
|
|
28770edcdd | ||
|
|
0f5180ad07 | ||
|
|
b2c126ecf9 | ||
|
|
aab7266bcb | ||
|
|
dc5eab1980 | ||
|
|
ddfc803603 | ||
|
|
5de43429a3 | ||
|
|
513421f3d0 | ||
|
|
04ca446d44 | ||
|
|
d8cfd826c0 | ||
|
|
30689a74bd | ||
|
|
957adbb3a2 | ||
|
|
e59ff04f2b | ||
|
|
3511099f78 | ||
|
|
7dc6f89585 | ||
|
|
e899b0cebb | ||
|
|
40ba25d011 | ||
|
|
43e5e0200a | ||
|
|
7906ac7fa9 | ||
|
|
706f5331b6 | ||
|
|
3e13ea6aaa | ||
|
|
fb13834048 | ||
|
|
3e8bd7f649 | ||
|
|
dfc898e0bf | ||
|
|
38fc0cf4be | ||
|
|
7204b85664 | ||
|
|
c0642a69a1 | ||
|
|
251e01f6e7 | ||
|
|
612a7b50cf | ||
|
|
c4d04d10d7 | ||
|
|
e87bfe0ef9 | ||
|
|
6d87a03412 | ||
|
|
13bea01eac | ||
|
|
9a8126cc1e | ||
|
|
45f705e351 | ||
|
|
1c3577a5e7 | ||
|
|
a2aedf680a | ||
|
|
14cfb6b8c5 | ||
|
|
5e98e8a192 | ||
|
|
bb65610e74 | ||
|
|
19ccfb87e3 | ||
|
|
514298b942 | ||
|
|
267480b563 | ||
|
|
a50a5f8f89 | ||
|
|
f06cd69b27 | ||
|
|
c0bf7f7069 | ||
|
|
d884c5324d | ||
|
|
16caeeee89 | ||
|
|
17e5d84907 | ||
|
|
fe4037b850 | ||
|
|
564f65d2d2 | ||
|
|
2a944d9376 | ||
|
|
3dc1bbc671 | ||
|
|
1a141b114e | ||
|
|
f9e7589d87 | ||
|
|
f77ab58b3b | ||
|
|
a3e744d883 | ||
|
|
8680f0f43b | ||
|
|
a981caa386 | ||
|
|
06644f5fe6 | ||
|
|
bcb79a0ac5 | ||
|
|
b6c48d95db | ||
|
|
f28092bccb | ||
|
|
a566b6f8cb | ||
|
|
ba7e178cb1 | ||
|
|
b88ac0191e | ||
|
|
f864eeb646 | ||
|
|
cc2f810be3 | ||
|
|
d41da16c56 | ||
|
|
9d3390b1bb | ||
|
|
3fe96333e1 | ||
|
|
a17c782c2e | ||
|
|
2f9a2ce435 | ||
|
|
d78776be6f | ||
|
|
e23d1a87f6 | ||
|
|
b27f86c073 | ||
|
|
2a5f5448a4 | ||
|
|
c84472270e | ||
|
|
e3b667d5b2 | ||
|
|
7079c50deb | ||
|
|
b3e07b9188 | ||
|
|
41427d8698 | ||
|
|
6e2177e27c | ||
|
|
25bba6e306 | ||
|
|
64c0c79edd | ||
|
|
9f6e79cb16 | ||
|
|
917959743e | ||
|
|
577660b58c | ||
|
|
4377d85a05 | ||
|
|
fb8fcf7d50 | ||
|
|
faf8e4664c | ||
|
|
7e52b8e979 | ||
|
|
55ab2fa043 | ||
|
|
560a1b5e2f | ||
|
|
db61b202c0 | ||
|
|
ebc697dd89 | ||
|
|
784d99c03d | ||
|
|
d48ab480c9 | ||
|
|
052f1108c3 | ||
|
|
b42f5b68ca | ||
|
|
3926c48114 | ||
|
|
0a5f2d2b8e | ||
|
|
57f80b5196 | ||
|
|
7ac3b7e65b | ||
|
|
4ce2f88d4a | ||
|
|
374025f5bf | ||
|
|
450da1ce3f | ||
|
|
4a5cfd141a | ||
|
|
56ea329b5c | ||
|
|
3104cda55e | ||
|
|
111b28ba7e | ||
|
|
7754a6e183 | ||
|
|
2d2063cac2 | ||
|
|
494edfa095 | ||
|
|
e3a9d4e6de | ||
|
|
c8f766735a | ||
|
|
83899c8fac | ||
|
|
99d56a520e | ||
|
|
c1b2caad8b | ||
|
|
53cd0feba3 | ||
|
|
e83945d875 | ||
|
|
31def9a711 | ||
|
|
b4514dca63 | ||
|
|
add5f9853d | ||
|
|
419c08780f | ||
|
|
d39b50b02c | ||
|
|
2d8b2ae523 | ||
|
|
3e5366f374 | ||
|
|
2b10325f7f | ||
|
|
4c5fdf6dce | ||
|
|
8a8616c124 | ||
|
|
8095e506e4 | ||
|
|
e067208755 | ||
|
|
f9bf042178 | ||
|
|
23db4a6506 | ||
|
|
2e0468ed74 | ||
|
|
e932fb5707 | ||
|
|
337551119b | ||
|
|
7ec7336b9a | ||
|
|
a136729532 | ||
|
|
2da41d03ef | ||
|
|
3c65754fca | ||
|
|
688931aa7e | ||
|
|
e5338caa29 | ||
|
|
b45bc73396 | ||
|
|
918d5b89ef | ||
|
|
9f06d583ab | ||
|
|
1c87cf7982 | ||
|
|
75f7eaf74f | ||
|
|
a4f4163412 | ||
|
|
ef529b7949 | ||
|
|
6e52acb677 | ||
|
|
826695a677 | ||
|
|
e403469e52 | ||
|
|
084acb8894 | ||
|
|
948e260460 | ||
|
|
f4efdea4b2 | ||
|
|
1cb7730c3c | ||
|
|
5b558b50e2 | ||
|
|
00986f2341 | ||
|
|
b83e8887ff | ||
|
|
7bfadfa233 | ||
|
|
a3f75f1237 | ||
|
|
1e21d3f6ea | ||
|
|
73d0c6ea7d | ||
|
|
278b27da6b | ||
|
|
fbb0692f80 | ||
|
|
f4307ab524 | ||
|
|
cafda14c89 | ||
|
|
2e7e81be9f | ||
|
|
83b5697d40 | ||
|
|
e0a1c39e54 | ||
|
|
6608203ddc | ||
|
|
1f811ba90e | ||
|
|
70f33f56e8 | ||
|
|
39c2a157c4 | ||
|
|
761352cbbc | ||
|
|
44016e1a03 | ||
|
|
a2233c434a | ||
|
|
fb4863cbe9 | ||
|
|
e60d50a957 | ||
|
|
c53d69d03c | ||
|
|
9e294d7185 | ||
|
|
e9cd983131 | ||
|
|
e6798d4901 | ||
|
|
1c0e8cdd91 | ||
|
|
a3f9fc9cb3 | ||
|
|
808bbabff1 | ||
|
|
4a5e579256 | ||
|
|
7c74d22700 | ||
|
|
cf11930f05 | ||
|
|
f814d20cbb | ||
|
|
6313fca6fa | ||
|
|
f0bcfc62c8 | ||
|
|
cf930c6013 | ||
|
|
052a65f6ef | ||
|
|
4078418376 | ||
|
|
68e8d4f788 | ||
|
|
be6e0ce222 | ||
|
|
67dd097a0f | ||
|
|
ed9007da44 | ||
|
|
81632cdf6d | ||
|
|
727e02a235 | ||
|
|
39e105c69c | ||
|
|
1a2145b413 | ||
|
|
05a981de6e | ||
|
|
79c07642a2 | ||
|
|
e2352fe3bf | ||
|
|
2d9ac56f2e | ||
|
|
8e1d70b6be | ||
|
|
7c6a675173 | ||
|
|
feeff01654 | ||
|
|
0e53005867 | ||
|
|
98b4ee2bac | ||
|
|
efc2dc1c54 | ||
|
|
827c974908 | ||
|
|
05b9c8efca | ||
|
|
42a9745196 | ||
|
|
5a283b7ffa | ||
|
|
59d25df76b | ||
|
|
c42a00ddcf | ||
|
|
b3e06caf7c | ||
|
|
a0b84c0552 | ||
|
|
e8be5eb8ba | ||
|
|
2531988a59 | ||
|
|
7204b06870 | ||
|
|
6289543ea5 | ||
|
|
6a1ce5e234 | ||
|
|
bd1e4e7e6d | ||
|
|
feda5b96b6 | ||
|
|
809396ff21 | ||
|
|
2428487eb1 | ||
|
|
df0c769111 | ||
|
|
5e0cd75bb0 | ||
|
|
b21e6b4a67 | ||
|
|
bfc3aa7ad8 | ||
|
|
72458ddfd2 | ||
|
|
a8a04b137b | ||
|
|
4e11df1fc7 | ||
|
|
c3ab35bd6b | ||
|
|
af1025da1f | ||
|
|
f2ce9eacb1 | ||
|
|
27307e034b | ||
|
|
808357735f | ||
|
|
ece8b6d395 | ||
|
|
8643e14900 | ||
|
|
cbfd52d926 | ||
|
|
e266e43d19 | ||
|
|
c9d58e08c9 | ||
|
|
24eda2b3a5 | ||
|
|
38c4f3234d | ||
|
|
e94b6f24dc | ||
|
|
85dab8eb7a | ||
|
|
5fb8634880 | ||
|
|
e551421867 | ||
|
|
3dfb1ce0b5 | ||
|
|
aca321c332 | ||
|
|
e0f4891a72 | ||
|
|
08b207d80a | ||
|
|
6121349a6f | ||
|
|
2b58a9ad97 | ||
|
|
8e922a7676 | ||
|
|
7967b6851f | ||
|
|
18b37abf5b | ||
|
|
53b713f574 | ||
|
|
655f162272 | ||
|
|
686c50a7bb | ||
|
|
a88e95e116 | ||
|
|
7c583bf8ec | ||
|
|
c3911483a5 | ||
|
|
f37d7f4040 | ||
|
|
c39c9691a8 | ||
|
|
a1c591a616 | ||
|
|
999e21bf77 | ||
|
|
c8e5a37472 | ||
|
|
c6fffca506 | ||
|
|
f1206a1fc6 | ||
|
|
29a4280b50 | ||
|
|
552f63a27f | ||
|
|
612608181d | ||
|
|
8e652f0c44 | ||
|
|
4a3e89d713 | ||
|
|
3dd6d1e0b9 | ||
|
|
f42e1ad71d | ||
|
|
b44f36185a | ||
|
|
1621adad02 | ||
|
|
d2682242ae | ||
|
|
0b26fe3266 | ||
|
|
0354ddf765 | ||
|
|
82e0d01c29 | ||
|
|
57b68f185c | ||
|
|
8f9b8c0433 | ||
|
|
27ced0fc36 | ||
|
|
1d383a7d37 | ||
|
|
ae81019fd8 | ||
|
|
d05019adac | ||
|
|
1d45ec916c | ||
|
|
7328fc9381 | ||
|
|
89f21b927f | ||
|
|
04c33929cd | ||
|
|
fa2aab5e74 | ||
|
|
ebc81c0986 | ||
|
|
c6348e0dc9 | ||
|
|
f84d3000f4 | ||
|
|
7ddfc681cc | ||
|
|
cdb67c80c0 | ||
|
|
ed78c9d746 | ||
|
|
b7128d5f33 | ||
|
|
ba0b32ffdb | ||
|
|
3b420a4c28 | ||
|
|
5abc9c7154 | ||
|
|
c5f377476c | ||
|
|
105ea434da | ||
|
|
f0196bdab9 | ||
|
|
982d1ee9a0 | ||
|
|
a7bbb20f60 | ||
|
|
2ca79017e2 | ||
|
|
c4a3d26d96 | ||
|
|
93292fb2f2 | ||
|
|
3a9be091ea | ||
|
|
92f3944049 | ||
|
|
27f90655f1 | ||
|
|
4b868392e6 | ||
|
|
ebb1ba990d | ||
|
|
b4bb72e236 | ||
|
|
e876ebe078 | ||
|
|
d6af873b9d | ||
|
|
c10d309180 | ||
|
|
c33ab2c52c | ||
|
|
ec6cef3526 | ||
|
|
c61738bbab | ||
|
|
00990a49f9 | ||
|
|
72a199ce48 | ||
|
|
ac585f7c81 | ||
|
|
a8b286c6fc | ||
|
|
364747986b | ||
|
|
b51c3ad20a | ||
|
|
df8c77291d | ||
|
|
9dde0e54fe | ||
|
|
72f1b2bf02 | ||
|
|
332782e99c | ||
|
|
9f7e49b453 | ||
|
|
e17f53ca3c | ||
|
|
5fc1abaff2 | ||
|
|
a9ad25d3fc | ||
|
|
bf3c0cda46 | ||
|
|
e9680c287d | ||
|
|
e05dda9ea6 | ||
|
|
7db442682e | ||
|
|
61911ac09a | ||
|
|
381dc28831 | ||
|
|
1686d38f0b | ||
|
|
509b93968d | ||
|
|
1458331e3f | ||
|
|
d5777a55f0 | ||
|
|
d7c4d2c425 | ||
|
|
a268687cea | ||
|
|
d679e43058 | ||
|
|
1f609f8732 | ||
|
|
30e9d38bf2 | ||
|
|
922342345d | ||
|
|
80c8c5453b | ||
|
|
ba72ec37c6 | ||
|
|
9bfb696c9d | ||
|
|
4a9848f51d | ||
|
|
383eacc814 | ||
|
|
860b80e2c2 | ||
|
|
0259bc8d9d | ||
|
|
37238e1226 | ||
|
|
c51880941b | ||
|
|
451bbe7597 | ||
|
|
d99e20d95e | ||
|
|
5eca22a9df | ||
|
|
c4d6b26986 | ||
|
|
197acc4d2f | ||
|
|
da5a5cf15a | ||
|
|
0797df24d2 | ||
|
|
7fca4ac8d6 | ||
|
|
0516513c67 | ||
|
|
4603794436 | ||
|
|
a5bbe4047b | ||
|
|
770a2d3287 | ||
|
|
3bd4b82d94 | ||
|
|
218b2d7782 | ||
|
|
76a08e6c12 | ||
|
|
4d28a58dcb | ||
|
|
9347e7a133 | ||
|
|
33ed5ff904 | ||
|
|
291994d388 | ||
|
|
f6ea9675bf | ||
|
|
cc303f56a4 | ||
|
|
290bd0a8fe | ||
|
|
a8573cc8e1 | ||
|
|
814bd941c0 | ||
|
|
d3f6d32848 | ||
|
|
5e1b82ea8a | ||
|
|
e49cae5d67 | ||
|
|
8168bb2085 | ||
|
|
621a7c98b9 | ||
|
|
28da2aafc4 | ||
|
|
e89e6fac28 | ||
|
|
a5e067af9e | ||
|
|
04de7fd5ea | ||
|
|
815428f35b | ||
|
|
833f569150 | ||
|
|
6b227d55aa | ||
|
|
57a6c26c07 | ||
|
|
b2da168f6a | ||
|
|
4c1e14af57 | ||
|
|
5f9e82617f | ||
|
|
9868facdde | ||
|
|
d45f8bddac | ||
|
|
e4b086e7e5 | ||
|
|
7afe3c63cd | ||
|
|
5103acf414 | ||
|
|
70b763b5a3 | ||
|
|
e1370b803f | ||
|
|
ac3ca0ddf7 | ||
|
|
15bec5525a | ||
|
|
0e8dcb6a40 | ||
|
|
836efcfa03 | ||
|
|
774e6decf3 | ||
|
|
839265e0b9 | ||
|
|
32c94c85f1 | ||
|
|
a36df67f6f | ||
|
|
cdb46f476c | ||
|
|
96e5e7393e | ||
|
|
130001a44c | ||
|
|
1328ea81e8 | ||
|
|
a42153cff9 | ||
|
|
79929f5700 | ||
|
|
8c3726c165 | ||
|
|
51a58f79a5 | ||
|
|
8691304925 | ||
|
|
9fef95d96e | ||
|
|
4d42a23510 | ||
|
|
787df36fe0 | ||
|
|
a59ea40e12 | ||
|
|
fdb3a23acc | ||
|
|
60d24ac3c1 | ||
|
|
7634540bd7 | ||
|
|
0a475e4242 | ||
|
|
ff3b66b22e | ||
|
|
8be5f5bfa6 | ||
|
|
8d887335e2 | ||
|
|
553f429a53 | ||
|
|
a4a8b36665 | ||
|
|
49d46b79df | ||
|
|
08a2b92bcf | ||
|
|
f32dafc3ee | ||
|
|
84e391ffc8 | ||
|
|
26a369af89 | ||
|
|
56c752b487 | ||
|
|
890fcadac2 | ||
|
|
27f09f6627 | ||
|
|
e5b89271ee | ||
|
|
48ef0e7852 | ||
|
|
192851b03f | ||
|
|
dd30876e70 | ||
|
|
ce2603549b | ||
|
|
c645124e55 | ||
|
|
3c3a00b7bb | ||
|
|
d34e152b98 | ||
|
|
d5454b918a | ||
|
|
427a0fff4a | ||
|
|
7fc446321d | ||
|
|
3f85f4998b | ||
|
|
4799fb67c4 | ||
|
|
5ed9038f7b | ||
|
|
8c1cd4b824 | ||
|
|
50a09de212 | ||
|
|
e66710f5ed | ||
|
|
33131f4fcd | ||
|
|
9834787279 | ||
|
|
227b569138 | ||
|
|
ad1a8a3dba | ||
|
|
262c470031 | ||
|
|
4c9b9be23f | ||
|
|
d1c04d39d2 | ||
|
|
afbe7b44b6 | ||
|
|
f76f1687fb | ||
|
|
8eb4015cab | ||
|
|
3ec44f72da | ||
|
|
3797c45d98 | ||
|
|
94b7523774 | ||
|
|
6f0de9f01c | ||
|
|
16cc63447f | ||
|
|
bb6661b4eb | ||
|
|
63a5005257 | ||
|
|
8b4fdd4773 | ||
|
|
333bea795f | ||
|
|
3ee972a4ff | ||
|
|
94a1f67975 | ||
|
|
e00b55842d | ||
|
|
ba1a4afa79 | ||
|
|
d2925592fc | ||
|
|
d97c1a03ee | ||
|
|
a1d48d3b20 | ||
|
|
4ce0463465 | ||
|
|
6725caad36 | ||
|
|
17e9d667a8 | ||
|
|
92d85822f3 | ||
|
|
bdeb421ca3 | ||
|
|
b5a5aa4748 | ||
|
|
096d8ab807 | ||
|
|
da7d2c7929 | ||
|
|
ead6156bfa | ||
|
|
4220b2d7b3 | ||
|
|
e7c598d29e | ||
|
|
1677383049 | ||
|
|
23ec389798 | ||
|
|
0ceaf9a3b2 | ||
|
|
5fbb775ab4 | ||
|
|
8914842e71 | ||
|
|
3e912f5282 | ||
|
|
360562e80e | ||
|
|
8ffc8836d6 | ||
|
|
2f629ac77f | ||
|
|
f1ead98a46 | ||
|
|
c3747cfebd | ||
|
|
21d6970b0d | ||
|
|
d9072d54d0 | ||
|
|
a963980f9d | ||
|
|
45f8ce1a44 | ||
|
|
eb981ef06a | ||
|
|
56030945e9 | ||
|
|
d4e52967ca | ||
|
|
4b3a998ae2 | ||
|
|
b0dd3dae9b | ||
|
|
372a802c98 | ||
|
|
16f2f29bf2 | ||
|
|
e0aba994b6 | ||
|
|
6aea77cdbc | ||
|
|
07d96cd486 | ||
|
|
9b21a4d07a | ||
|
|
dea483d362 | ||
|
|
636e246c70 | ||
|
|
0d5c7b5250 | ||
|
|
1b5f066eb0 | ||
|
|
ffe224c4bf | ||
|
|
792fe16124 | ||
|
|
3c92108c44 | ||
|
|
3b71327245 | ||
|
|
6d70978285 | ||
|
|
953ad680ee | ||
|
|
765f2fad92 | ||
|
|
bede734af7 | ||
|
|
31853376d6 | ||
|
|
3a100ce325 | ||
|
|
bbb2ef0668 | ||
|
|
9f697673c0 | ||
|
|
b1deb8629b | ||
|
|
70d0400c67 | ||
|
|
b0c08ce813 | ||
|
|
3af91fcac9 | ||
|
|
d1c2fe4169 | ||
|
|
1900d37c94 | ||
|
|
5d17a2a613 | ||
|
|
4a93603614 | ||
|
|
9a1a59f15f | ||
|
|
0c350a3f27 | ||
|
|
c3d75f1e8d | ||
|
|
b847e53221 | ||
|
|
c9570b0ad7 | ||
|
|
ee5caaa81c | ||
|
|
a81976b5a5 | ||
|
|
fd32638787 | ||
|
|
816cd945f8 | ||
|
|
07f1f5f426 | ||
|
|
8ac124a19e | ||
|
|
e90116291f | ||
|
|
2dbb3f08cb | ||
|
|
71c333af5d | ||
|
|
925eca89d4 | ||
|
|
a712245ebe | ||
|
|
8c15df942d | ||
|
|
6ce4fbd7fc | ||
|
|
3e4fc70442 | ||
|
|
fc91416ab7 | ||
|
|
0f6ee71733 | ||
|
|
4dafa959c1 | ||
|
|
66a6c2d8f9 | ||
|
|
b2654e11a3 | ||
|
|
e2cfdda9cf | ||
|
|
b5085a8959 | ||
|
|
dccf01220c | ||
|
|
12dc5b69c0 | ||
|
|
0423b5f335 | ||
|
|
a4c37da10e | ||
|
|
de49279aab | ||
|
|
f651ffddf5 | ||
|
|
ee959b68dc | ||
|
|
b1d1201083 | ||
|
|
faff8fadc8 | ||
|
|
85a0f55b20 | ||
|
|
cf2e571d80 | ||
|
|
68596469eb | ||
|
|
181eda6ae4 | ||
|
|
31ed9c0e4c | ||
|
|
2916fb7112 | ||
|
|
1ca1a960b5 | ||
|
|
6c6a1c9465 | ||
|
|
0be7a21bab | ||
|
|
ca51988694 | ||
|
|
9184d54cb7 | ||
|
|
ca43582e4f | ||
|
|
a1552990bf | ||
|
|
99c9f50dfb | ||
|
|
565e14ecf3 | ||
|
|
521a8e0777 | ||
|
|
0141db4a64 | ||
|
|
9ed9db88b7 | ||
|
|
f52a05b477 | ||
|
|
8936204849 | ||
|
|
50efff2819 | ||
|
|
af325f9a62 | ||
|
|
fe29188e3f | ||
|
|
b753a98971 | ||
|
|
c73d88a7e2 | ||
|
|
bd872bc271 | ||
|
|
c0c03a0629 | ||
|
|
18f3f135c8 | ||
|
|
0304d0ac5a | ||
|
|
643fa1ad18 | ||
|
|
5c65874749 | ||
|
|
5a4db46427 | ||
|
|
305d376128 | ||
|
|
4308936c1a | ||
|
|
87b0ac9295 | ||
|
|
3dee3b2a0e | ||
|
|
c2f0e30511 | ||
|
|
a824a70cc6 | ||
|
|
07692f87f2 | ||
|
|
7f94b254a2 | ||
|
|
ceb3581c28 | ||
|
|
c3bf5d75d3 | ||
|
|
297d261ca9 | ||
|
|
89a67e7ee4 | ||
|
|
0d6d34a93b | ||
|
|
cb89a42184 | ||
|
|
6837b1d803 | ||
|
|
8967babc37 | ||
|
|
a4f93cfe8d | ||
|
|
5dde0b56f8 | ||
|
|
43dee3dfeb | ||
|
|
937dbc5c03 | ||
|
|
78e17c2abb | ||
|
|
4653dbcaba | ||
|
|
057e1b960a | ||
|
|
5feaabad92 | ||
|
|
2c395d4313 | ||
|
|
6af68cfc7a | ||
|
|
66f2c371ec | ||
|
|
c5bcf50d66 | ||
|
|
86625694fc | ||
|
|
dcaae8a15a | ||
|
|
1996399cde | ||
|
|
62d3fdd276 | ||
|
|
7740cf6eae | ||
|
|
5bbaa5d7c2 | ||
|
|
70cb1ad0fb | ||
|
|
fcfc404120 | ||
|
|
2f855874a6 | ||
|
|
26d5542864 | ||
|
|
ee5e0ef3a7 | ||
|
|
51e5cf5c55 | ||
|
|
3c09b8c3a7 | ||
|
|
6e25876230 | ||
|
|
c5a3e57974 | ||
|
|
508fb5f1e2 | ||
|
|
e9b6f5ab0f | ||
|
|
efb79cc7d2 | ||
|
|
901084f1f6 | ||
|
|
acb4ca7619 | ||
|
|
691684c828 | ||
|
|
06482124ce | ||
|
|
d61fda966f | ||
|
|
63df6cdf80 | ||
|
|
3365fb569f | ||
|
|
f9c48e488e | ||
|
|
0c81e0fd54 | ||
|
|
0cddca1847 | ||
|
|
23574cd075 | ||
|
|
cc7897752d | ||
|
|
dc4dc80bdc | ||
|
|
808a7b69d8 | ||
|
|
5b3b6ff509 | ||
|
|
b923e86a91 | ||
|
|
2c078dd1d4 | ||
|
|
feb80c38b8 | ||
|
|
b525407ad5 | ||
|
|
b660673743 | ||
|
|
ba6e7c03fb | ||
|
|
50e4b46018 | ||
|
|
a837bf38b1 | ||
|
|
6fb102edf9 | ||
|
|
e45ed75e91 | ||
|
|
ef6b6b9466 | ||
|
|
f6df333304 | ||
|
|
83aee85f48 | ||
|
|
73c5a0dfad | ||
|
|
555c2b86c7 | ||
|
|
b5fd4b68bf | ||
|
|
3baaa64754 | ||
|
|
e142d95abc | ||
|
|
6ac93a97df | ||
|
|
7db7e44bfc | ||
|
|
4792bda57b | ||
|
|
cd009e7080 | ||
|
|
bcc967d72d | ||
|
|
913cbf94f4 | ||
|
|
1941d2c34d | ||
|
|
36140fb42b | ||
|
|
91e2668998 | ||
|
|
b6f625b498 | ||
|
|
0c176aabd2 | ||
|
|
39ec5958e1 | ||
|
|
6467fece64 | ||
|
|
c6a8d5ad84 | ||
|
|
42b1f2b1a9 | ||
|
|
208823466c | ||
|
|
0c67bfb999 | ||
|
|
d64e92d84a | ||
|
|
29ec5f6638 |
No files matched your search
@@ -0,0 +1,5 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: retrooper
|
||||
custom: ['https://paypal.me/retrooperdev']
|
||||
@@ -0,0 +1,41 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Report a bug to help us fix
|
||||
title: "[BUG REPORT]"
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
*Example:*
|
||||
1. Login on the 1.16.4 minecraft client.
|
||||
2. Join the server while it is still starting up.
|
||||
3. ....
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**About your server (please complete the following information):**
|
||||
- Spigot: [eg. Paper or Tuinity]
|
||||
We only accept reports that are reproducible
|
||||
on one of the supported spigots.
|
||||
|
||||
- Server Version: [eg. 1.16.4]
|
||||
Feel free to report bugs for versions newer than 1.7.10, even if we
|
||||
don’t support them yet, but be aware that we might have already
|
||||
found the bug and fixed it in a dev build, just before you reported it.
|
||||
Please don’t get frustrated in such cases.
|
||||
|
||||
- Plugins List if possible: [eg. ViaVersion, ProtocolLib, HolographicDisplays]
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
@@ -0,0 +1,21 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: FEATURE REQUEST
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered to solve your solution without
|
||||
us adding this as a feature?**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
@@ -0,0 +1,67 @@
|
||||
# For most projects, this workflow file will not need changing; you simply need
|
||||
# to commit it to your repository.
|
||||
#
|
||||
# You may wish to alter this file to override the set of languages analyzed,
|
||||
# or to provide custom queries or build logic.
|
||||
#
|
||||
# ******** NOTE ********
|
||||
# We have attempted to detect the languages in your repository. Please check
|
||||
# the `language` matrix defined below to confirm you have the correct set of
|
||||
# supported CodeQL languages.
|
||||
#
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master, dev ]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [ master, dev ]
|
||||
schedule:
|
||||
- cron: '39 0 * * 0'
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'java' ]
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
|
||||
# Learn more:
|
||||
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
#- run: |
|
||||
# make bootstrap
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
||||
+113
@@ -0,0 +1,113 @@
|
||||
#
|
||||
# JetBrains
|
||||
#
|
||||
|
||||
# User-specific stuff
|
||||
.idea/**/workspace.xml
|
||||
.idea/**/tasks.xml
|
||||
.idea/**/usage.statistics.xml
|
||||
.idea/**/dictionaries
|
||||
.idea/**/shelf
|
||||
|
||||
# Generated files
|
||||
.idea/**/contentModel.xml
|
||||
|
||||
# Sensitive or high-churn files
|
||||
.idea/**/dataSources/
|
||||
.idea/**/dataSources.ids
|
||||
.idea/**/dataSources.local.xml
|
||||
.idea/**/sqlDataSources.xml
|
||||
.idea/**/dynamic.xml
|
||||
.idea/**/uiDesigner.xml
|
||||
.idea/**/dbnavigator.xml
|
||||
|
||||
# Gradle
|
||||
.idea/**/gradle.xml
|
||||
.idea/**/libraries
|
||||
|
||||
# Gradle and Maven with auto-import
|
||||
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||
# since they will be recreated, and may cause churn. Uncomment if using
|
||||
# auto-import.
|
||||
# .idea/artifacts
|
||||
# .idea/compiler.xml
|
||||
# .idea/jarRepositories.xml
|
||||
# .idea/modules.xml
|
||||
# .idea/*.iml
|
||||
# .idea/modules
|
||||
# *.iml
|
||||
# *.ipr
|
||||
|
||||
# CMake
|
||||
cmake-build-*/
|
||||
|
||||
# Mongo Explorer plugin
|
||||
.idea/**/mongoSettings.xml
|
||||
|
||||
# File-based project format
|
||||
*.iws
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Cursive Clojure plugin
|
||||
.idea/replstate.xml
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
|
||||
# Editor-based Rest Client
|
||||
.idea/httpRequests
|
||||
|
||||
# Android studio 3.1+ serialized cache file
|
||||
.idea/caches/build_file_checksums.ser
|
||||
|
||||
|
||||
#
|
||||
# Java
|
||||
#
|
||||
|
||||
# Compiled class file
|
||||
*.class
|
||||
|
||||
# Log file
|
||||
*.log
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
|
||||
#
|
||||
# Maven
|
||||
#
|
||||
target/
|
||||
pom.xml.tag
|
||||
pom.xml.releaseBackup
|
||||
pom.xml.versionsBackup
|
||||
pom.xml.next
|
||||
release.properties
|
||||
dependency-reduced-pom.xml
|
||||
buildNumber.properties
|
||||
.mvn/timing.properties
|
||||
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
|
||||
.mvn/wrapper/maven-wrapper.jar
|
||||
@@ -1,674 +1,21 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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 <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2020 retrooper
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -1,68 +1,23 @@
|
||||
# packetevents by purplex
|
||||
# packetevents
|
||||
|
||||
PacketListener coded by purplex.
|
||||
[](https://github.com/retrooper/packetevents/blob/dev/LICENSE)
|
||||
[](https://jitpack.io/#retrooper/packetevents)
|
||||
|
||||
Licensed with the GPL3 license.
|
||||
PacketEvents is an open-source Packet API. It has many cross-version packet-wrappers. You can process incoming and outgoing packets on the server. You can even send packets with our packet-wrappers. We are here to save you a ton of time.
|
||||
|
||||
[](https://www.gnu.org/licenses/gpl-3.0)
|
||||
### Resources
|
||||
* [SpigotMC](https://www.spigotmc.org/resources/packetevents-api.80279/)
|
||||
* [JavaDoc](https://retrooper.github.io/packetevents)
|
||||
|
||||
Coding help discord server: https://discord.gg/ZWTkg4v
|
||||
|
||||
How to use with **Gradle, Maven, sbt and leiningen**.
|
||||
|
||||
The lastest stable version is displayed below.
|
||||
|
||||
[](https://jitpack.io/#purplexdev/packetevents)
|
||||
|
||||
# Gradle
|
||||
|
||||
```gradle
|
||||
allprojects {
|
||||
repositories {
|
||||
...
|
||||
maven { url 'https://jitpack.io' }
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'com.github.purplexdev:packetevents:1.1.9'
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
# Maven
|
||||
|
||||
```xml
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>jitpack.io</id>
|
||||
<url>https://jitpack.io</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.github.purplexdev</groupId>
|
||||
<artifactId>packetevents</artifactId>
|
||||
<version>1.1.9</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
```
|
||||
|
||||
# sbt
|
||||
|
||||
```
|
||||
resolvers += "jitpack" at "https://jitpack.io"
|
||||
|
||||
libraryDependencies += "com.github.purplexdev" % "packetevents" % "1.1.9"
|
||||
```
|
||||
|
||||
# leiningen
|
||||
```
|
||||
:repositories [["jitpack" "https://jitpack.io"]]
|
||||
|
||||
:dependencies [[com.github.purplexdev/packetevents "1.1.9"]]
|
||||
```
|
||||
### Setup
|
||||
[Learn more](https://github.com/retrooper/packetevents/wiki/1.-Setup)
|
||||
|
||||
### Discord
|
||||
[Learn more](https://discord.me/packetevents)
|
||||
|
||||
### Contributing/Forking
|
||||
[Learn more](https://github.com/retrooper/packetevents/wiki/2.-Contributing-and-Forking)\
|
||||
Our discord server has a role for contributors and forkers.
|
||||
|
||||
### Sponsorships
|
||||
[](https://www.ej-technologies.com/products/jprofiler/overview.html)
|
||||
@@ -1,39 +1,55 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>me.purplex</groupId>
|
||||
<groupId>io.github.retrooper</groupId>
|
||||
<artifactId>packetevents</artifactId>
|
||||
<version>1.2</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>packetevents</name>
|
||||
<properties>
|
||||
<java.version>1.8</java.version>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<version>1.8-pre-13</version>
|
||||
<build>
|
||||
<defaultGoal>clean package</defaultGoal>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.7.0</version>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
</configuration>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>3.2.4</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<minimizeJar>true</minimizeJar>
|
||||
<createDependencyReducedPom>false</createDependencyReducedPom>
|
||||
<createTestSourcesJar>false</createTestSourcesJar>
|
||||
<shadedArtifactAttached>false</shadedArtifactAttached>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.7.0</version>
|
||||
<configuration>
|
||||
<source>${java.version}</source>
|
||||
<target>${java.version}</target>
|
||||
<source>8</source>
|
||||
<target>8</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<!--
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-javadocs</id>
|
||||
<goals>
|
||||
<goal>jar</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
-->
|
||||
</plugins>
|
||||
<resources>
|
||||
<resource>
|
||||
@@ -42,6 +58,13 @@
|
||||
</resource>
|
||||
</resources>
|
||||
</build>
|
||||
<packaging>jar</packaging>
|
||||
<name>packetevents</name>
|
||||
|
||||
<properties>
|
||||
<java.version>1.8</java.version>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
@@ -56,137 +79,99 @@
|
||||
<id>funkemunky-releases</id>
|
||||
<url>https://nexus.funkemunky.cc/content/repositories/releases/</url>
|
||||
</repository>
|
||||
|
||||
<repository>
|
||||
<id>viaversion-repo</id>
|
||||
<url>https://repo.viaversion.com</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>sonotype</id>
|
||||
<url>https://oss.sonatype.org/content/repositories/releases/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.14.1</artifactId>
|
||||
<version>1.14.1</version>
|
||||
<scope>provided</scope>
|
||||
<groupId>org.jetbrains</groupId>
|
||||
<artifactId>annotations</artifactId>
|
||||
<version>20.1.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.15.1</artifactId>
|
||||
<version>1.15.1</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.14.3</artifactId>
|
||||
<version>1.14.3</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.14.2</artifactId>
|
||||
<version>1.14.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.15</artifactId>
|
||||
<version>1.15</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.15.2</artifactId>
|
||||
<version>1.15.2</version>
|
||||
<artifactId>1.16.2</artifactId>
|
||||
<version>1.16.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.13.2</artifactId>
|
||||
<version>1.13.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.7.10</artifactId>
|
||||
<version>1.7.10</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.8</artifactId>
|
||||
<version>1.8</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.8.3</artifactId>
|
||||
<version>1.8.3</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.8.8</artifactId>
|
||||
<version>1.8.8</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.9</artifactId>
|
||||
<version>1.9</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.9.4</artifactId>
|
||||
<version>1.9.4</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.10.2</artifactId>
|
||||
<version>1.10.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.11.1</artifactId>
|
||||
<version>1.11.1</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.11.2</artifactId>
|
||||
<version>1.11.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.12.1</artifactId>
|
||||
<version>1.12.1</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.12.2</artifactId>
|
||||
<version>1.12.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.13</artifactId>
|
||||
<version>1.13</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.14</artifactId>
|
||||
<version>1.14</version>
|
||||
<artifactId>1.12.2</artifactId>
|
||||
<version>1.12.2</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.9.4</artifactId>
|
||||
<version>1.9.4</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.9</artifactId>
|
||||
<version>1.9</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.8.8</artifactId>
|
||||
<version>1.8.8</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.7.10</artifactId>
|
||||
<version>1.7.10</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>us.myles</groupId>
|
||||
<artifactId>viaversion</artifactId>
|
||||
<version>3.2.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.ProtocolSupport</groupId>
|
||||
<artifactId>ProtocolSupport</artifactId>
|
||||
<version>3d24efeda6</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<!--Spigot API-->
|
||||
<dependency>
|
||||
<groupId>org.spigotmc</groupId>
|
||||
<artifactId>spigot-api</artifactId>
|
||||
<version>1.8-R0.1-SNAPSHOT</version>
|
||||
<version>1.8.8-R0.1-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
@@ -0,0 +1,323 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents;
|
||||
|
||||
import io.github.retrooper.packetevents.event.impl.PostPlayerInjectEvent;
|
||||
import io.github.retrooper.packetevents.event.manager.EventManager;
|
||||
import io.github.retrooper.packetevents.event.manager.PEEventManager;
|
||||
import io.github.retrooper.packetevents.exceptions.PacketEventsLoadFailureException;
|
||||
import io.github.retrooper.packetevents.injector.GlobalChannelInjector;
|
||||
import io.github.retrooper.packetevents.packettype.PacketType;
|
||||
import io.github.retrooper.packetevents.packettype.PacketTypeClasses;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.processor.BukkitEventProcessorInternal;
|
||||
import io.github.retrooper.packetevents.processor.PacketProcessorInternal;
|
||||
import io.github.retrooper.packetevents.settings.PacketEventsSettings;
|
||||
import io.github.retrooper.packetevents.updatechecker.UpdateChecker;
|
||||
import io.github.retrooper.packetevents.utils.entityfinder.EntityFinderUtils;
|
||||
import io.github.retrooper.packetevents.utils.netty.bytebuf.ByteBufUtil;
|
||||
import io.github.retrooper.packetevents.utils.netty.bytebuf.ByteBufUtil_7;
|
||||
import io.github.retrooper.packetevents.utils.netty.bytebuf.ByteBufUtil_8;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import io.github.retrooper.packetevents.utils.player.PlayerUtils;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerUtils;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerVersion;
|
||||
import io.github.retrooper.packetevents.utils.version.PEVersion;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.ServicePriority;
|
||||
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
public final class PacketEvents implements Listener, EventManager {
|
||||
public static String handlerName;
|
||||
//TODO finish unfinished wrappers
|
||||
private static PacketEvents instance;
|
||||
private static Plugin plugin;
|
||||
private final PEVersion version = new PEVersion(1, 7, 9, 13);
|
||||
private final EventManager eventManager = new PEEventManager();
|
||||
private final PlayerUtils playerUtils = new PlayerUtils();
|
||||
private final ServerUtils serverUtils = new ServerUtils();
|
||||
private final UpdateChecker updateChecker = new UpdateChecker();
|
||||
public final PacketProcessorInternal packetProcessorInternal = new PacketProcessorInternal();
|
||||
public final BukkitEventProcessorInternal bukkitEventProcessorInternal = new BukkitEventProcessorInternal();
|
||||
public final GlobalChannelInjector injector = new GlobalChannelInjector();
|
||||
private volatile boolean loading, loaded;
|
||||
private final AtomicBoolean injectorReady = new AtomicBoolean(false);
|
||||
private boolean initialized, initializing, terminating;
|
||||
private PacketEventsSettings settings = new PacketEventsSettings();
|
||||
private ByteBufUtil byteBufUtil;
|
||||
|
||||
public static PacketEvents create(final Plugin plugin) {
|
||||
if (Bukkit.isPrimaryThread()) {
|
||||
//We are on the main thread
|
||||
if (!Bukkit.getServicesManager().isProvidedFor(PacketEvents.class)) {
|
||||
//We can register in the service manager.
|
||||
instance = new PacketEvents();
|
||||
Bukkit.getServicesManager().register(PacketEvents.class, instance,
|
||||
plugin, ServicePriority.Normal);
|
||||
PacketEvents.plugin = plugin;
|
||||
return instance;
|
||||
} else {
|
||||
//We have already registered. Let us load what was registered.
|
||||
return instance = Bukkit.getServicesManager().load(PacketEvents.class);
|
||||
}
|
||||
} else {
|
||||
//We are off thread, we cannot use the service manager.
|
||||
if (instance == null) {
|
||||
PacketEvents.plugin = plugin;
|
||||
instance = new PacketEvents();
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
}
|
||||
|
||||
public static PacketEvents get() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static PacketEvents getAPI() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
public void load() {
|
||||
if (!loaded && !loading) {
|
||||
loading = true;
|
||||
ServerVersion version = ServerVersion.getVersion();
|
||||
WrappedPacket.version = version;
|
||||
NMSUtils.version = version;
|
||||
EntityFinderUtils.version = version;
|
||||
handlerName = "pe-" + plugin.getName();
|
||||
try {
|
||||
NMSUtils.load();
|
||||
|
||||
PacketTypeClasses.load();
|
||||
|
||||
PacketType.load();
|
||||
|
||||
EntityFinderUtils.load();
|
||||
} catch (Exception ex) {
|
||||
loading = false;
|
||||
throw new PacketEventsLoadFailureException(ex);
|
||||
}
|
||||
|
||||
byteBufUtil = NMSUtils.legacyNettyImportMode ? new ByteBufUtil_7() : new ByteBufUtil_8();
|
||||
|
||||
if (!injectorReady.get()) {
|
||||
injector.load();
|
||||
try {
|
||||
injector.inject();
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
injectorReady.set(true);
|
||||
}
|
||||
|
||||
loaded = true;
|
||||
loading = false;
|
||||
}
|
||||
}
|
||||
|
||||
public void loadAsyncNewThread() {
|
||||
new Thread(this::load).start();
|
||||
}
|
||||
|
||||
public void loadAsync(ExecutorService executorService) {
|
||||
executorService.execute(this::load);
|
||||
}
|
||||
|
||||
public void loadSettings(PacketEventsSettings settings) {
|
||||
this.settings = settings;
|
||||
}
|
||||
|
||||
public void init() {
|
||||
init(getSettings());
|
||||
}
|
||||
|
||||
public void init(PacketEventsSettings packetEventsSettings) {
|
||||
//Load if we haven't loaded already
|
||||
load();
|
||||
if (!initialized && !initializing) {
|
||||
initializing = true;
|
||||
settings = packetEventsSettings;
|
||||
settings.lock();
|
||||
|
||||
if (settings.shouldCheckForUpdates()) {
|
||||
handleUpdateCheck();
|
||||
}
|
||||
|
||||
//We may not continue until the injector has been initialized!
|
||||
while (!injectorReady.get()) {
|
||||
;
|
||||
}
|
||||
|
||||
Bukkit.getPluginManager().registerEvents(bukkitEventProcessorInternal, plugin);
|
||||
for (final Player p : Bukkit.getOnlinePlayers()) {
|
||||
try {
|
||||
injector.injectPlayer(p);
|
||||
PacketEvents.get().getEventManager().callEvent(new PostPlayerInjectEvent(p, false));
|
||||
} catch (Exception ex) {
|
||||
p.kickPlayer("Failed to inject... Please rejoin!");
|
||||
}
|
||||
}
|
||||
|
||||
initialized = true;
|
||||
initializing = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void init(Plugin plugin) {
|
||||
init(plugin, settings);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void init(Plugin pl, PacketEventsSettings packetEventsSettings) {
|
||||
init(packetEventsSettings);
|
||||
}
|
||||
|
||||
public void terminate() {
|
||||
if (initialized && !terminating) {
|
||||
for (Player p : Bukkit.getOnlinePlayers()) {
|
||||
injector.ejectPlayer(p);
|
||||
}
|
||||
injector.eject();
|
||||
|
||||
getEventManager().unregisterAllListeners();
|
||||
initialized = false;
|
||||
terminating = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Use {@link #terminate()}. This is deprecated
|
||||
*
|
||||
* @deprecated "Stop" might be misleading and "terminate" sounds better I guess...
|
||||
*/
|
||||
@Deprecated
|
||||
public void stop() {
|
||||
terminate();
|
||||
}
|
||||
|
||||
public boolean isLoading() {
|
||||
return loading;
|
||||
}
|
||||
|
||||
public boolean hasLoaded() {
|
||||
return loaded;
|
||||
}
|
||||
|
||||
public boolean isTerminating() {
|
||||
return terminating;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public boolean isStopping() {
|
||||
return isTerminating();
|
||||
}
|
||||
|
||||
public boolean isInitializing() {
|
||||
return initializing;
|
||||
}
|
||||
|
||||
public boolean isInitialized() {
|
||||
return initialized;
|
||||
}
|
||||
|
||||
public Plugin getPlugin() {
|
||||
return plugin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the PacketEvents settings.
|
||||
*
|
||||
* @return Configure some settings for the API
|
||||
*/
|
||||
public PacketEventsSettings getSettings() {
|
||||
return settings;
|
||||
}
|
||||
|
||||
public PEVersion getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
public EventManager getEventManager() {
|
||||
return eventManager;
|
||||
}
|
||||
|
||||
public PlayerUtils getPlayerUtils() {
|
||||
return playerUtils;
|
||||
}
|
||||
|
||||
public ServerUtils getServerUtils() {
|
||||
return serverUtils;
|
||||
}
|
||||
|
||||
public ByteBufUtil getByteBufUtil() {
|
||||
return byteBufUtil;
|
||||
}
|
||||
|
||||
public UpdateChecker getUpdateChecker() {
|
||||
return updateChecker;
|
||||
}
|
||||
|
||||
private void handleUpdateCheck() {
|
||||
Thread thread = new Thread(() -> {
|
||||
PacketEvents.get().getPlugin().getLogger().info("[PacketEvents] Checking for an update, please wait...");
|
||||
UpdateChecker.UpdateCheckerStatus status = updateChecker.checkForUpdate();
|
||||
int seconds = 5;
|
||||
for (int i = 0; i < 5; i++) {
|
||||
if (status == UpdateChecker.UpdateCheckerStatus.FAILED) {
|
||||
PacketEvents.get().getPlugin().getLogger().severe("[PacketEvents] Checking for an update again in " + seconds + " seconds...");
|
||||
try {
|
||||
Thread.sleep(seconds * 1000L);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
seconds *= 2;
|
||||
|
||||
status = updateChecker.checkForUpdate();
|
||||
|
||||
if (i == 4) {
|
||||
PacketEvents.get().getPlugin().getLogger().severe("[PacketEvents] PacketEvents failed to check for an update. No longer retrying.");
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}, "PacketEvents-update-check-thread");
|
||||
thread.start();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents;
|
||||
|
||||
import io.github.retrooper.packetevents.settings.PacketEventsSettings;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerVersion;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
public class PacketEventsPlugin extends JavaPlugin {
|
||||
@Override
|
||||
public void onLoad() {
|
||||
//Return value of create is your PacketEvents instance.
|
||||
PacketEvents instance = PacketEvents.create(this);
|
||||
PacketEventsSettings settings = instance.getSettings();
|
||||
settings
|
||||
.fallbackServerVersion(ServerVersion.v_1_7_10)
|
||||
.compatInjector(false)
|
||||
.checkForUpdates(false);
|
||||
PacketEvents.get().loadAsyncNewThread();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
//Other way to access your instance...
|
||||
PacketEvents.get().init();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
PacketEvents.get().terminate();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event;
|
||||
|
||||
|
||||
import io.github.retrooper.packetevents.event.eventtypes.CallableEvent;
|
||||
|
||||
/**
|
||||
* An event in both of PacketEvents' event systems.
|
||||
*
|
||||
* @author retrooper
|
||||
* @since 1.2.6
|
||||
*/
|
||||
public abstract class PacketEvent implements CallableEvent {
|
||||
private long timestamp = System.currentTimeMillis();
|
||||
|
||||
/**
|
||||
* Timestamp of when the PacketEvent was created.
|
||||
* Basically timestamp of the packet.
|
||||
*
|
||||
* @return Packet timestamp in milliseconds.
|
||||
*/
|
||||
public long getTimestamp() {
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter for the timestamp.
|
||||
*
|
||||
* @param timestamp Packet timestamp in milliseconds.
|
||||
*/
|
||||
public void setTimestamp(final long timestamp) {
|
||||
this.timestamp = timestamp;
|
||||
}
|
||||
|
||||
public void callPacketEventExternal(final PacketListenerAbstract listener) {
|
||||
listener.onPacketEventExternal(this);
|
||||
}
|
||||
|
||||
public boolean isInbuilt() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event;
|
||||
|
||||
/**
|
||||
* The legacy Packet listener.
|
||||
* Implement this interface in your listener if you are using the legacy event system.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see PacketListenerAbstract
|
||||
* @since 1.2.6
|
||||
* @deprecated There is a new and better listener for the new event system.
|
||||
*/
|
||||
@Deprecated
|
||||
public interface PacketListener {
|
||||
}
|
||||
@@ -0,0 +1,177 @@
|
||||
package io.github.retrooper.packetevents.event;
|
||||
|
||||
import io.github.retrooper.packetevents.event.impl.*;
|
||||
import io.github.retrooper.packetevents.event.priority.PacketEventPriority;
|
||||
import io.github.retrooper.packetevents.utils.immutableset.ImmutableSetCustom;
|
||||
|
||||
/**
|
||||
* Abstract packet listener.
|
||||
* @author retrooper
|
||||
* @since 1.8
|
||||
*/
|
||||
public abstract class PacketListenerAbstract {
|
||||
private final PacketEventPriority priority;
|
||||
public ImmutableSetCustom<Byte> serverSidedStatusAllowance;
|
||||
public ImmutableSetCustom<Byte> serverSidedLoginAllowance;
|
||||
public ImmutableSetCustom<Byte> serverSidedPlayAllowance;
|
||||
|
||||
public ImmutableSetCustom<Byte> clientSidedStatusAllowance;
|
||||
public ImmutableSetCustom<Byte> clientSidedHandshakeAllowance;
|
||||
public ImmutableSetCustom<Byte> clientSidedLoginAllowance;
|
||||
public ImmutableSetCustom<Byte> clientSidedPlayAllowance;
|
||||
|
||||
public PacketListenerAbstract(final PacketEventPriority priority) {
|
||||
this.priority = priority;
|
||||
this.serverSidedStatusAllowance = null;
|
||||
this.serverSidedLoginAllowance = null;
|
||||
this.serverSidedPlayAllowance = null;
|
||||
|
||||
this.clientSidedStatusAllowance = null;
|
||||
this.clientSidedHandshakeAllowance = null;
|
||||
this.clientSidedLoginAllowance = null;
|
||||
this.clientSidedPlayAllowance = null;
|
||||
}
|
||||
|
||||
|
||||
public PacketListenerAbstract() {
|
||||
this(PacketEventPriority.NORMAL);
|
||||
}
|
||||
|
||||
public final PacketEventPriority getPriority() {
|
||||
return priority;
|
||||
}
|
||||
|
||||
public void onPacketStatusReceive(PacketStatusReceiveEvent event) {
|
||||
}
|
||||
|
||||
public void onPacketStatusSend(PacketStatusSendEvent event) {
|
||||
}
|
||||
|
||||
public void onPacketHandshakeReceive(PacketHandshakeReceiveEvent event) {
|
||||
}
|
||||
|
||||
public void onPacketLoginReceive(PacketLoginReceiveEvent event) {
|
||||
}
|
||||
|
||||
public void onPacketLoginSend(PacketLoginSendEvent event) {
|
||||
}
|
||||
|
||||
public void onPacketPlayReceive(PacketPlayReceiveEvent event) {
|
||||
}
|
||||
|
||||
public void onPacketPlaySend(PacketPlaySendEvent event) {
|
||||
}
|
||||
|
||||
public void onPostPacketPlayReceive(PostPacketPlayReceiveEvent event) {
|
||||
}
|
||||
|
||||
public void onPostPacketPlaySend(PostPacketPlaySendEvent event) {
|
||||
}
|
||||
|
||||
public void onPostPlayerInject(PostPlayerInjectEvent event) {
|
||||
}
|
||||
|
||||
public void onPlayerInject(PlayerInjectEvent event) {
|
||||
}
|
||||
|
||||
public void onPlayerEject(PlayerEjectEvent event) {
|
||||
}
|
||||
|
||||
public void onPacketEventExternal(PacketEvent event) {
|
||||
}
|
||||
|
||||
public final void addServerSidedStatusFilter(Byte... statusPacketIDs) {
|
||||
if (this.serverSidedStatusAllowance == null) {
|
||||
this.serverSidedStatusAllowance = new ImmutableSetCustom<>(statusPacketIDs);
|
||||
} else {
|
||||
this.serverSidedStatusAllowance.addAll(statusPacketIDs);
|
||||
}
|
||||
}
|
||||
|
||||
public final void addServerSidedLoginFilter(Byte... loginPacketIDs) {
|
||||
if (this.serverSidedLoginAllowance == null) {
|
||||
this.serverSidedLoginAllowance = new ImmutableSetCustom<>(loginPacketIDs);
|
||||
} else {
|
||||
this.serverSidedLoginAllowance.addAll(loginPacketIDs);
|
||||
}
|
||||
}
|
||||
|
||||
public final void addServerSidedPlayFilter(Byte... playPacketIDs) {
|
||||
if (this.serverSidedPlayAllowance == null) {
|
||||
this.serverSidedPlayAllowance = new ImmutableSetCustom<>(playPacketIDs);
|
||||
} else {
|
||||
this.serverSidedPlayAllowance.addAll(playPacketIDs);
|
||||
}
|
||||
}
|
||||
|
||||
public final void addClientSidedStatusFilter(Byte... statusPacketIDs) {
|
||||
if (this.clientSidedStatusAllowance == null) {
|
||||
this.clientSidedStatusAllowance = new ImmutableSetCustom<>(statusPacketIDs);
|
||||
} else {
|
||||
this.clientSidedStatusAllowance.addAll(statusPacketIDs);
|
||||
}
|
||||
}
|
||||
|
||||
public final void addClientSidedHandshakeFilter(Byte... handshakePacketIDs) {
|
||||
if (this.clientSidedHandshakeAllowance == null) {
|
||||
this.clientSidedHandshakeAllowance = new ImmutableSetCustom<>(handshakePacketIDs);
|
||||
} else {
|
||||
this.clientSidedHandshakeAllowance.addAll(handshakePacketIDs);
|
||||
}
|
||||
}
|
||||
|
||||
public final void addClientSidedLoginFilter(Byte... loginPacketIDs) {
|
||||
if (this.clientSidedLoginAllowance == null) {
|
||||
this.clientSidedLoginAllowance = new ImmutableSetCustom<>(loginPacketIDs);
|
||||
} else {
|
||||
this.clientSidedLoginAllowance.addAll(loginPacketIDs);
|
||||
}
|
||||
}
|
||||
|
||||
public final void addClientSidedPlayFilter(Byte... playPacketIDs) {
|
||||
if (this.clientSidedPlayAllowance == null) {
|
||||
this.clientSidedPlayAllowance = new ImmutableSetCustom<>(playPacketIDs);
|
||||
} else {
|
||||
this.clientSidedPlayAllowance.addAll(playPacketIDs);
|
||||
}
|
||||
}
|
||||
|
||||
public final void filterAll() {
|
||||
filterServerSidedStatus();
|
||||
filterServerSidedLogin();
|
||||
filterServerSidedPlay();
|
||||
|
||||
filterClientSidedStatus();
|
||||
filterClientSidedHandshake();
|
||||
filterClientSidedLogin();
|
||||
filterClientSidedPlay();
|
||||
}
|
||||
|
||||
public final void filterServerSidedStatus() {
|
||||
this.serverSidedStatusAllowance = new ImmutableSetCustom<>();
|
||||
}
|
||||
|
||||
public final void filterServerSidedLogin() {
|
||||
this.serverSidedLoginAllowance = new ImmutableSetCustom<>();
|
||||
}
|
||||
|
||||
public final void filterServerSidedPlay() {
|
||||
this.serverSidedPlayAllowance = new ImmutableSetCustom<>();
|
||||
}
|
||||
|
||||
public final void filterClientSidedStatus() {
|
||||
this.clientSidedStatusAllowance = new ImmutableSetCustom<>();
|
||||
}
|
||||
|
||||
public final void filterClientSidedHandshake() {
|
||||
this.clientSidedHandshakeAllowance = new ImmutableSetCustom<>();
|
||||
}
|
||||
|
||||
public final void filterClientSidedLogin() {
|
||||
this.clientSidedLoginAllowance = new ImmutableSetCustom<>();
|
||||
}
|
||||
|
||||
public final void filterClientSidedPlay() {
|
||||
this.clientSidedPlayAllowance = new ImmutableSetCustom<>();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event;
|
||||
|
||||
import io.github.retrooper.packetevents.event.priority.PacketEventPriority;
|
||||
|
||||
/**
|
||||
* Deprecated abstract PacketListener.
|
||||
* Please use {@link PacketListenerAbstract}, but this class will still work for a bit.
|
||||
*
|
||||
* @author retrooper
|
||||
* @since 1.7.7
|
||||
*/
|
||||
@Deprecated
|
||||
public abstract class PacketListenerDynamic extends PacketListenerAbstract {
|
||||
public PacketListenerDynamic(final PacketEventPriority priority) {
|
||||
super(priority);
|
||||
}
|
||||
|
||||
|
||||
public PacketListenerDynamic() {
|
||||
super(PacketEventPriority.NORMAL);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.annotation;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* This is what you override your event listener with on the old event system.
|
||||
* You can specify the event priority of the listener method.
|
||||
*
|
||||
* @author retrooper
|
||||
* @since 1.0
|
||||
* @deprecated Was used for the old event system, the new one doesn't need this anymore.
|
||||
*/
|
||||
@Target({ElementType.METHOD})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Deprecated
|
||||
public @interface PacketHandler {
|
||||
byte priority() default 2; //NORMAL priority value
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.eventtypes;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import io.github.retrooper.packetevents.event.PacketListenerAbstract;
|
||||
import io.github.retrooper.packetevents.event.impl.PacketPlayReceiveEvent;
|
||||
|
||||
/**
|
||||
* The {@link PacketEvent} implements this interface.
|
||||
* Every inbuilt event should implement the {@link #call(PacketListenerAbstract)} method.
|
||||
* If you are making a custom event, don't implement this.
|
||||
* The {@link PacketListenerAbstract#onPacketEventExternal(PacketEvent)} method is called for every event that is not in-built.
|
||||
* including custom events.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see PacketPlayReceiveEvent
|
||||
* @since 1.8
|
||||
*/
|
||||
public interface CallableEvent {
|
||||
void call(PacketListenerAbstract listener);
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.eventtypes;
|
||||
|
||||
import io.github.retrooper.packetevents.event.impl.PacketPlayReceiveEvent;
|
||||
|
||||
/**
|
||||
* Every event that supports cancellation should implement this interface.
|
||||
* PacketEvents' event system lets the highest priority listener be have the highest priority
|
||||
* in deciding whether the event will cancel.
|
||||
* This means an event with a lower priority than the higher priority one would not be able to decide.
|
||||
* Cancelling the event means the action assosiated with the event will be cancelled.
|
||||
* For example, cancelling the {@link PacketPlayReceiveEvent}
|
||||
* will prevent minecraft from processing the incoming packet.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see PacketPlayReceiveEvent
|
||||
* @since 1.7
|
||||
*/
|
||||
public interface CancellableEvent {
|
||||
|
||||
/**
|
||||
* This method returns if the event will be cancelled.
|
||||
*
|
||||
* @return Will the event be cancelled.
|
||||
*/
|
||||
boolean isCancelled();
|
||||
|
||||
/**
|
||||
* Cancel or proceed with the event.
|
||||
*
|
||||
* @param val Is the event cancelled
|
||||
*/
|
||||
void setCancelled(boolean val);
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
package io.github.retrooper.packetevents.event.eventtypes;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
|
||||
public abstract class CancellableNMSPacketEvent extends NMSPacketEvent implements CancellableEvent {
|
||||
private boolean cancelled;
|
||||
|
||||
public CancellableNMSPacketEvent(Object channel, NMSPacket packet) {
|
||||
super(channel, packet);
|
||||
}
|
||||
|
||||
public CancellableNMSPacketEvent(InetSocketAddress address, NMSPacket packet) {
|
||||
super(address, packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCancelled() {
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCancelled(boolean value) {
|
||||
cancelled = value;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.eventtypes;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import io.github.retrooper.packetevents.packettype.PacketType;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.utils.netty.channel.ChannelUtils;
|
||||
import io.github.retrooper.packetevents.utils.reflection.ClassUtil;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
|
||||
/**
|
||||
* The {@code NMSPacketEvent} abstract class represents an event that has to do with an actual packet.
|
||||
* Don't mix this up with {@link io.github.retrooper.packetevents.event.PacketEvent}.
|
||||
* The PacketEvent class represents an event that belongs to PacketEvent's packet system.
|
||||
*
|
||||
* @author retrooper
|
||||
* @since 1.8
|
||||
*/
|
||||
public abstract class NMSPacketEvent extends PacketEvent implements CallableEvent {
|
||||
private final InetSocketAddress socketAddress;
|
||||
protected NMSPacket packet;
|
||||
protected boolean cancelled;
|
||||
private final byte packetID;
|
||||
|
||||
public NMSPacketEvent(Object channel, NMSPacket packet) {
|
||||
this(ChannelUtils.getSocketAddress(channel), packet);//Call the constructor below
|
||||
}
|
||||
|
||||
public NMSPacketEvent(InetSocketAddress address, NMSPacket packet) {
|
||||
this.socketAddress = address;
|
||||
this.packet = packet;
|
||||
packetID = PacketType.packetIDMap.getOrDefault(packet.getRawNMSPacket().getClass(), PacketType.INVALID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the associated player's socket address.
|
||||
*
|
||||
* @return Socket address of the associated player.
|
||||
*/
|
||||
public final InetSocketAddress getSocketAddress() {
|
||||
return socketAddress;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the name of the packet.
|
||||
* To get the name of the packet we get the class of the packet and then the name of the class.
|
||||
* See also: {@link Class#getSimpleName()}
|
||||
* We cache the name after the first call to improve performance.
|
||||
* Java 8 does not cache the name.
|
||||
* It is not recommended to call this method unless you NEED it.
|
||||
* If you are comparing packet types, use the {@link PacketType} byte system.
|
||||
* You would only need the packet name if packet type system doesn't contain your desired packet yet.
|
||||
*
|
||||
* @return Name of the packet.
|
||||
*/
|
||||
@Deprecated
|
||||
public final String getPacketName() {
|
||||
return ClassUtil.getClassSimpleName(packet.getRawNMSPacket().getClass());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the NMS packet.
|
||||
*
|
||||
* @return Get NMS packet.
|
||||
*/
|
||||
public final NMSPacket getNMSPacket() {
|
||||
return packet;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the NMS Packet.
|
||||
*
|
||||
* @param packet NMS Object
|
||||
*/
|
||||
public final void setNMSPacket(NMSPacket packet) {
|
||||
this.packet = packet;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Packet ID.
|
||||
*
|
||||
* @return Packet ID.
|
||||
*/
|
||||
public byte getPacketId() {
|
||||
return packetID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInbuilt() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.eventtypes;
|
||||
|
||||
import io.github.retrooper.packetevents.event.impl.PacketPlayReceiveEvent;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
/**
|
||||
* Every event that has an associated player is recommended to implement this interface.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see PacketPlayReceiveEvent
|
||||
* @since 1.6.9
|
||||
*/
|
||||
public interface PlayerEvent {
|
||||
/**
|
||||
* Associated player.
|
||||
*
|
||||
* @return Player.
|
||||
*/
|
||||
Player getPlayer();
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
package io.github.retrooper.packetevents.event.impl;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketListenerAbstract;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.CancellableNMSPacketEvent;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
|
||||
/**
|
||||
* The {@code PacketHandshakeReceiveEvent} event is fired whenever the a HANDSHAKE packet is received from a client.
|
||||
* The {@code PacketHandshakeReceiveEvent} does not have to do with a bukkit player object due to the player object being null in this state.
|
||||
* Use the {@link #getSocketAddress()} to identify who sends the packet.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Handshaking">https://wiki.vg/Protocol#Handshaking</a>
|
||||
* @since 1.8
|
||||
*/
|
||||
public class PacketHandshakeReceiveEvent extends CancellableNMSPacketEvent {
|
||||
public PacketHandshakeReceiveEvent(final Object channel, final NMSPacket packet) {
|
||||
super(channel, packet);
|
||||
}
|
||||
|
||||
public PacketHandshakeReceiveEvent(final InetSocketAddress socketAddress, final NMSPacket packet) {
|
||||
super(socketAddress, packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void call(PacketListenerAbstract listener) {
|
||||
if (listener.clientSidedLoginAllowance == null || listener.clientSidedLoginAllowance.contains(getPacketId())) {
|
||||
listener.onPacketHandshakeReceive(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.impl;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketListenerAbstract;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.CancellableNMSPacketEvent;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
|
||||
/**
|
||||
* The {@code PacketLoginReceiveEvent} event is fired whenever the a LOGIN packet is received from a client.
|
||||
* The {@code PacketLoginReceiveEvent} does not have to do with a bukkit player object due to
|
||||
* the player object being null in this state.
|
||||
* Use the {@link #getSocketAddress()} to identify who sends the packet.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Login">https://wiki.vg/Protocol#Login</a>
|
||||
* @since 1.8
|
||||
*/
|
||||
public class PacketLoginReceiveEvent extends CancellableNMSPacketEvent {
|
||||
public PacketLoginReceiveEvent(final Object channel, final NMSPacket packet) {
|
||||
super(channel, packet);
|
||||
}
|
||||
|
||||
public PacketLoginReceiveEvent(final InetSocketAddress socketAddress, final NMSPacket packet) {
|
||||
super(socketAddress, packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void call(PacketListenerAbstract listener) {
|
||||
if (listener.clientSidedLoginAllowance == null || listener.clientSidedLoginAllowance.contains(getPacketId())) {
|
||||
listener.onPacketLoginReceive(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.impl;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketListenerAbstract;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.CancellableNMSPacketEvent;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
|
||||
/**
|
||||
* The {@code PacketLoginSendEvent} event is fired whenever the a LOGIN packet is being planned to be sent to the client.
|
||||
* The {@code PacketLoginSendEvent} does not have to do with a bukkit player object due to
|
||||
* the player object being null in this state.
|
||||
* Use the {@link #getSocketAddress()} to identify who sends the packet.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Login">https://wiki.vg/Protocol#Login</a>
|
||||
* @since 1.8
|
||||
*/
|
||||
public class PacketLoginSendEvent extends CancellableNMSPacketEvent {
|
||||
public PacketLoginSendEvent(Object channel, NMSPacket packet) {
|
||||
super(channel, packet);
|
||||
}
|
||||
|
||||
public PacketLoginSendEvent(InetSocketAddress address, NMSPacket packet) {
|
||||
super(address, packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void call(PacketListenerAbstract listener) {
|
||||
if (listener.serverSidedLoginAllowance == null || listener.serverSidedLoginAllowance.contains(getPacketId())) {
|
||||
listener.onPacketLoginSend(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.impl;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketListenerAbstract;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.CancellableNMSPacketEvent;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.PlayerEvent;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* The {@code PacketPlayReceiveEvent} event is fired whenever the a PLAY packet is
|
||||
* received from any connected client.
|
||||
* Cancelling this event will result in preventing minecraft from processing the incoming packet.
|
||||
* It would be as if the player never sent the packet from the server's view.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Play">https://wiki.vg/Protocol#Play</a>
|
||||
* @since 1.2.6
|
||||
*/
|
||||
public final class PacketPlayReceiveEvent extends CancellableNMSPacketEvent implements PlayerEvent {
|
||||
private final Player player;
|
||||
|
||||
public PacketPlayReceiveEvent(Player player, Object channel, NMSPacket packet) {
|
||||
super(channel, packet);
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the bukkit player object of the packet sender.
|
||||
* The player object might be null during early packets.
|
||||
*
|
||||
* @return Packet sender.
|
||||
*/
|
||||
@NotNull
|
||||
@Override
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void call(PacketListenerAbstract listener) {
|
||||
if (listener.clientSidedPlayAllowance == null || listener.clientSidedPlayAllowance.contains(getPacketId())) {
|
||||
listener.onPacketPlayReceive(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.impl;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketListenerAbstract;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.CancellableNMSPacketEvent;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.PlayerEvent;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* The {@code PacketPlaySendEvent} event is fired whenever the a PLAY packet is about to be sent.
|
||||
* Cancelling this event will result in preventing minecraft from sending the packet.
|
||||
* The player won't receive the packet if you cancel it.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Play">https://wiki.vg/Protocol#Play</a>
|
||||
* @since 1.2.6
|
||||
*/
|
||||
public final class PacketPlaySendEvent extends CancellableNMSPacketEvent implements PlayerEvent {
|
||||
private final Player player;
|
||||
|
||||
public PacketPlaySendEvent(final Player player, final Object channel, final NMSPacket packet) {
|
||||
super(channel, packet);
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the bukkit player object of the packet receiver.
|
||||
* The player object might be null during early packets.
|
||||
*
|
||||
* @return Packet receiver.
|
||||
*/
|
||||
@NotNull
|
||||
@Override
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void call(PacketListenerAbstract listener) {
|
||||
if (listener.serverSidedPlayAllowance == null || listener.serverSidedPlayAllowance.contains(getPacketId())) {
|
||||
listener.onPacketPlaySend(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.impl;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketListenerAbstract;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.CancellableNMSPacketEvent;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
|
||||
/**
|
||||
* The {@code PacketStatusReceiveEvent} event is fired whenever the server receives a STATUS packet from a client.
|
||||
* The {@code PacketStatusSendEvent} does not have to do with a bukkit player object due to
|
||||
* the player object being null in this state.
|
||||
* Use the {@link #getSocketAddress()} to identify who sends the packet.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Status">https://wiki.vg/Protocol#Status</a>
|
||||
* @since 1.8
|
||||
*/
|
||||
public class PacketStatusReceiveEvent extends CancellableNMSPacketEvent {
|
||||
public PacketStatusReceiveEvent(final Object channel, final NMSPacket packet) {
|
||||
super(channel, packet);
|
||||
}
|
||||
|
||||
public PacketStatusReceiveEvent(final InetSocketAddress socketAddress, final NMSPacket packet) {
|
||||
super(socketAddress, packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void call(PacketListenerAbstract listener) {
|
||||
if (listener.clientSidedStatusAllowance == null || listener.clientSidedStatusAllowance.contains(getPacketId())) {
|
||||
listener.onPacketStatusReceive(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.impl;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketListenerAbstract;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.CancellableEvent;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.CancellableNMSPacketEvent;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
|
||||
/**
|
||||
* The {@code PacketStatusSendEvent} event is fired whenever the server wants to send a STATUS packet to the client.
|
||||
* This class implements {@link CancellableEvent}.
|
||||
* The {@code PacketStatusSendEvent} does not have to do with a bukkit player object due to
|
||||
* the player object being null in this state.
|
||||
* Use the {@link #getSocketAddress()} to identify who sends the packet.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Status">https://wiki.vg/Protocol#Status</a>
|
||||
* @since 1.8
|
||||
*/
|
||||
public class PacketStatusSendEvent extends CancellableNMSPacketEvent {
|
||||
public PacketStatusSendEvent(Object channel, NMSPacket packet) {
|
||||
super(channel, packet);
|
||||
}
|
||||
|
||||
public PacketStatusSendEvent(InetSocketAddress address, NMSPacket packet) {
|
||||
super(address, packet);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void call(PacketListenerAbstract listener) {
|
||||
if (listener.serverSidedStatusAllowance == null || listener.serverSidedStatusAllowance.contains(getPacketId())) {
|
||||
listener.onPacketStatusSend(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.impl;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import io.github.retrooper.packetevents.event.PacketListenerAbstract;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.CancellableEvent;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.PlayerEvent;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* The {@code PlayerEjectEvent} event is fired whenever a player is ejected.
|
||||
* This class implements {@link CancellableEvent} and {@link PlayerEvent}.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://github.com/retrooper/packetevents/blob/dev/src/main/java/io/github/retrooper/packetevents/handler/PacketHandlerInternal.java">https://github.com/retrooper/packetevents/blob/dev/src/main/java/io/github/retrooper/packetevents/handler/PacketHandlerInternal.java</a>
|
||||
* @since 1.6.9
|
||||
*/
|
||||
public final class PlayerEjectEvent extends PacketEvent implements CancellableEvent, PlayerEvent {
|
||||
private final Player player;
|
||||
private boolean cancelled;
|
||||
|
||||
public PlayerEjectEvent(final Player player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCancelled() {
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCancelled(boolean value) {
|
||||
cancelled = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the bukkit player object of the player being ejected.
|
||||
* The player object is guaranteed to NOT be null.
|
||||
*
|
||||
* @return Ejected player.
|
||||
*/
|
||||
@NotNull
|
||||
@Override
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Is the event called async?
|
||||
* @deprecated Now always false
|
||||
*/
|
||||
@Deprecated
|
||||
public boolean isAsync() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void call(PacketListenerAbstract listener) {
|
||||
listener.onPlayerEject(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInbuilt() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.impl;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import io.github.retrooper.packetevents.event.PacketListenerAbstract;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.CancellableEvent;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.PlayerEvent;
|
||||
import io.github.retrooper.packetevents.utils.netty.channel.ChannelUtils;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
|
||||
/**
|
||||
* The {@code PlayerInjectEvent} event is fired whenever a player is injected.
|
||||
* A player is injected by PacketEvents whenever they join the server.
|
||||
* This class implements {@link CancellableEvent} and {@link PlayerEvent}.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://github.com/retrooper/packetevents/blob/dev/src/main/java/io/github/retrooper/packetevents/handler/PacketHandlerInternal.java">https://github.com/retrooper/packetevents/blob/dev/src/main/java/io/github/retrooper/packetevents/handler/PacketHandlerInternal.java</a>
|
||||
* @since 1.6.9
|
||||
*/
|
||||
public final class PlayerInjectEvent extends PacketEvent implements CancellableEvent, PlayerEvent {
|
||||
private final Player player;
|
||||
private final InetSocketAddress address;
|
||||
private boolean cancelled;
|
||||
|
||||
public PlayerInjectEvent(final Player player) {
|
||||
this.player = player;
|
||||
this.address = ChannelUtils.getSocketAddress(PacketEvents.get().packetProcessorInternal.getChannel(player));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCancelled() {
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCancelled(boolean value) {
|
||||
cancelled = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the bukkit player object of the player being injected.
|
||||
* This player might not be fully initialized.
|
||||
*
|
||||
* @return Injected Player.
|
||||
*/
|
||||
@Nullable
|
||||
@Override
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the socket address injecting player.
|
||||
*
|
||||
* @return Socket address of the injecting player.
|
||||
*/
|
||||
@Nullable
|
||||
public InetSocketAddress getSocketAddress() {
|
||||
return address;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Will always be false
|
||||
*/
|
||||
@Deprecated
|
||||
public boolean isAsync() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void call(PacketListenerAbstract listener) {
|
||||
listener.onPlayerInject(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInbuilt() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.impl;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketListenerAbstract;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.NMSPacketEvent;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.PlayerEvent;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
/**
|
||||
* The {@code PostPacketPlayReceiveEvent} event is fired after minecraft processes
|
||||
* a PLAY server-bound packet.
|
||||
* You cannot cancel this event since minecraft already processed/is processing this packet.
|
||||
* If the incoming packet was cancelled, resulting in it not being processed by minecraft,
|
||||
* this event won't be called.
|
||||
* This event assures you that the {@link PacketPlayReceiveEvent} event wasn't cancelled.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Serverbound_4">https://wiki.vg/Protocol#Serverbound_4</a>
|
||||
* @since 1.7
|
||||
*/
|
||||
public class PostPacketPlayReceiveEvent extends NMSPacketEvent implements PlayerEvent {
|
||||
private final Player player;
|
||||
|
||||
public PostPacketPlayReceiveEvent(final Player player, final Object channel, final NMSPacket packet) {
|
||||
super(channel, packet);
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the bukkit player object of the packet sender.
|
||||
*
|
||||
* @return Packet sender.
|
||||
*/
|
||||
@Override
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void call(PacketListenerAbstract listener) {
|
||||
if (listener.clientSidedPlayAllowance == null || listener.clientSidedPlayAllowance.contains(getPacketId())) {
|
||||
listener.onPostPacketPlayReceive(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.impl;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketListenerAbstract;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.NMSPacketEvent;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.PlayerEvent;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
/**
|
||||
* The {@code PostPacketPlaySendEvent} event is fired after minecraft processes
|
||||
* a PLAY client-bound packet.
|
||||
* You cannot cancel this event since minecraft already processed this packet.
|
||||
* If the incoming packet was cancelled, resulting in it not being processed by minecraft,
|
||||
* this event won't be called.
|
||||
* This event assures you that the {@link PacketPlaySendEvent} event wasn't cancelled.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Clientbound_4">https://wiki.vg/Protocol#Clientbound_4</a>
|
||||
* @since 1.7
|
||||
*/
|
||||
public class PostPacketPlaySendEvent extends NMSPacketEvent implements PlayerEvent {
|
||||
private final Player player;
|
||||
|
||||
public PostPacketPlaySendEvent(final Player player, final Object channel, final NMSPacket packet) {
|
||||
super(channel, packet);
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the bukkit player object of the packet sender.
|
||||
*
|
||||
* @return Packet receiver.
|
||||
*/
|
||||
@Override
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void call(PacketListenerAbstract listener) {
|
||||
if (listener.serverSidedPlayAllowance == null || listener.serverSidedPlayAllowance.contains(getPacketId())) {
|
||||
listener.onPostPacketPlaySend(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.impl;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import io.github.retrooper.packetevents.event.PacketListenerAbstract;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.PlayerEvent;
|
||||
import io.github.retrooper.packetevents.utils.netty.channel.ChannelUtils;
|
||||
import io.github.retrooper.packetevents.utils.player.ClientVersion;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
|
||||
/**
|
||||
* The {@code PostPlayerInjectEvent} event is fired after a successful injection.
|
||||
* If you are on an older version of PacketEvents DON'T use this to register player data.
|
||||
* This event might be called asynchronously and sometimes synchronously.
|
||||
* Use the {@link #isAsync()} method to figure out if is being called sync or async.
|
||||
* Make sure you do null checks in your packet listeners as this might be called a bit later.
|
||||
* A player is injected by PacketEvents whenever they join the server.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://github.com/retrooper/packetevents/blob/dev/src/main/java/io/github/retrooper/packetevents/handler/PacketHandlerInternal.java">https://github.com/retrooper/packetevents/blob/dev/src/main/java/io/github/retrooper/packetevents/handler/PacketHandlerInternal.java</a>
|
||||
* @since 1.3
|
||||
*/
|
||||
public class PostPlayerInjectEvent extends PacketEvent implements PlayerEvent {
|
||||
private final Player player;
|
||||
private final boolean async;
|
||||
|
||||
public PostPlayerInjectEvent(Player player, boolean async) {
|
||||
this.player = player;
|
||||
this.async = async;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the bukkit player object of the player that has been injected.
|
||||
* The player is guaranteed to not be null.
|
||||
*
|
||||
* @return Injected Player.
|
||||
*/
|
||||
@NotNull
|
||||
@Override
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the cached netty channel of the player.
|
||||
*
|
||||
* @return Netty channel of the injected player.
|
||||
*/
|
||||
@NotNull
|
||||
public Object getChannel() {
|
||||
return PacketEvents.get().packetProcessorInternal.getChannel(player);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public InetSocketAddress getSocketAddress() {
|
||||
return ChannelUtils.getSocketAddress(getChannel());
|
||||
}
|
||||
|
||||
/**
|
||||
* This method returns the ClientVersion of the injected player.
|
||||
*
|
||||
* @return ClientVersion of injected player.
|
||||
* @see ClientVersion
|
||||
*/
|
||||
@NotNull
|
||||
public ClientVersion getClientVersion() {
|
||||
return PacketEvents.get().getPlayerUtils().getClientVersion(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Has the event been called async or sync?
|
||||
*
|
||||
* @return Was the event call in an async context?
|
||||
*/
|
||||
public boolean isAsync() {
|
||||
return async;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void call(PacketListenerAbstract listener) {
|
||||
listener.onPostPlayerInject(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isInbuilt() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,176 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.manager;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import io.github.retrooper.packetevents.event.PacketListener;
|
||||
import io.github.retrooper.packetevents.event.PacketListenerAbstract;
|
||||
import io.github.retrooper.packetevents.event.PacketListenerDynamic;
|
||||
|
||||
/**
|
||||
* This is the event manager interface.
|
||||
* Every method is already implemented, we just use this
|
||||
* to have less code duplications.
|
||||
* You can either call event manager methods in the
|
||||
* {@link io.github.retrooper.packetevents.PacketEvents} instance or with an instance of the
|
||||
* {@link PEEventManager} stored in {@link PacketEvents}.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see PacketEvents#getEventManager()
|
||||
* @since 1.0
|
||||
*/
|
||||
public interface EventManager {
|
||||
|
||||
/**
|
||||
* Call a packet event.
|
||||
* This will let all listeners(new and deprecated listeners) process the event.
|
||||
* It isn't recommended to use a mix of both listeners(new and deprecated),
|
||||
* but it will work and they are compatible.
|
||||
*
|
||||
* @param event {@link PacketEvent}
|
||||
* @return Same event manager instance.
|
||||
*/
|
||||
default EventManager callEvent(PacketEvent event) {
|
||||
//The dynamic event manager calls the legacy event manager.
|
||||
PEEventManager.EVENT_MANAGER_MODERN.callEvent(event);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a deprecated event listener.
|
||||
* Not recommended to use the deprecated event listener.
|
||||
*
|
||||
* @param listener {@link PacketListener}
|
||||
* @return Same event manager instance.
|
||||
*/
|
||||
@Deprecated
|
||||
default EventManager registerListener(PacketListener listener) {
|
||||
if (listener != null) {
|
||||
PEEventManager.EVENT_MANAGER_LEGACY.registerListener(listener);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register multiple deprecated event listeners with one method.
|
||||
* Not recommended to use the deprecated event listener.
|
||||
*
|
||||
* @param listeners {@link PacketListener}
|
||||
* @return Same event manager instance.
|
||||
*/
|
||||
@Deprecated
|
||||
default EventManager registerListeners(PacketListener... listeners) {
|
||||
PEEventManager.EVENT_MANAGER_LEGACY.registerListeners(listeners);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister a deprecated event listener.
|
||||
* Not recommended to use the deprecated event listener.
|
||||
*
|
||||
* @param listener {@link PacketListener}
|
||||
* @return Same event manager instance.
|
||||
*/
|
||||
@Deprecated
|
||||
default EventManager unregisterListener(PacketListener listener) {
|
||||
PEEventManager.EVENT_MANAGER_LEGACY.unregisterListener(listener);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister multiple deprecated event listeners with one method.
|
||||
* Not recommended to use the deprecated event listener.
|
||||
*
|
||||
* @param listeners {@link PacketListener}
|
||||
* @return Same event manager instance.
|
||||
*/
|
||||
@Deprecated
|
||||
default EventManager unregisterListeners(PacketListener... listeners) {
|
||||
PEEventManager.EVENT_MANAGER_LEGACY.unregisterListeners(listeners);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a PacketListenerDynamic listener.
|
||||
*
|
||||
* @param listener {@link PacketListenerDynamic}
|
||||
* @return Same event manager instance.
|
||||
*/
|
||||
@Deprecated
|
||||
default EventManager registerListener(PacketListenerDynamic listener) {
|
||||
PEEventManager.EVENT_MANAGER_MODERN.registerListener(listener);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register multiple PacketListenerDynamic listeners.
|
||||
*
|
||||
* @param listeners {@link PacketListenerDynamic}
|
||||
* @return Same event manager instance.
|
||||
*/
|
||||
@Deprecated
|
||||
default EventManager registerListeners(PacketListenerDynamic... listeners) {
|
||||
PEEventManager.EVENT_MANAGER_MODERN.registerListeners(listeners);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Register a PacketListenerAbstract listener.
|
||||
*
|
||||
* @param listener {@link PacketListenerAbstract}
|
||||
* @return Same event manager instance.
|
||||
*/
|
||||
default EventManager registerListener(PacketListenerAbstract listener) {
|
||||
if (listener != null) {
|
||||
PEEventManager.EVENT_MANAGER_MODERN.registerListener(listener);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register multiple PacketListenerAbstract listeners.
|
||||
*
|
||||
* @param listeners {@link PacketListenerAbstract}
|
||||
* @return Same event manager instance.
|
||||
*/
|
||||
default EventManager registerListeners(PacketListenerAbstract... listeners) {
|
||||
PEEventManager.EVENT_MANAGER_MODERN.registerListeners(listeners);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister all registered event listeners.
|
||||
* All the deprecated and the dynamic listeners will be unregistered.
|
||||
*
|
||||
* @return Same event manager instance.
|
||||
*/
|
||||
default EventManager unregisterAllListeners() {
|
||||
PEEventManager.EVENT_MANAGER_MODERN.unregisterAllListeners();
|
||||
PEEventManager.EVENT_MANAGER_LEGACY.unregisterAllListeners();
|
||||
return this;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,166 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.manager;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import io.github.retrooper.packetevents.event.PacketListener;
|
||||
import io.github.retrooper.packetevents.event.annotation.PacketHandler;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.CancellableEvent;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
|
||||
@Deprecated
|
||||
class EventManagerLegacy {
|
||||
/**
|
||||
* Map storing all all legacy packet event listeners.
|
||||
* The key is an individual listener, the values are the key's event methods.
|
||||
*/
|
||||
|
||||
private final Map<PacketListener, HashSet<Method>> staticRegisteredMethods = new HashMap<>();
|
||||
|
||||
/**
|
||||
* Call a PacketEvent with the legacy event manager.
|
||||
* This method processes the event on all legacy packet event listeners.
|
||||
* This method is actually called by {@link EventManagerModern#callEvent(PacketEvent)} as the
|
||||
* if you mix the two event systems, the dynamic listeners are always processed first and pass
|
||||
* their highest reached event priority that this legacy one has to beat/reach to be able to cancel
|
||||
* the event.
|
||||
* This downside of this system is the event listeners aren't executed in any particular order, just
|
||||
* in the order they were registered.
|
||||
* This system is also slower than the other event system.
|
||||
*
|
||||
* @param event {@link PacketEvent}
|
||||
* @param eventPriority Priority the legacy listeners should beat to decide cancellation of the event.
|
||||
*/
|
||||
@Deprecated
|
||||
public void callEvent(final PacketEvent event, byte eventPriority) {
|
||||
boolean isCancelled = false;
|
||||
if (event instanceof CancellableEvent) {
|
||||
isCancelled = ((CancellableEvent) event).isCancelled();
|
||||
}
|
||||
//STATIC LISTENERS
|
||||
for (final PacketListener listener : staticRegisteredMethods.keySet()) {
|
||||
HashSet<Method> methods = staticRegisteredMethods.get(listener);
|
||||
|
||||
for (Method method : methods) {
|
||||
Class<?> parameterType = method.getParameterTypes()[0];
|
||||
if (parameterType.equals(PacketEvent.class)
|
||||
|| parameterType.isInstance(event)) {
|
||||
|
||||
PacketHandler annotation = method.getAnnotation(PacketHandler.class);
|
||||
try {
|
||||
method.invoke(listener, event);
|
||||
} catch (IllegalAccessException | InvocationTargetException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
if (event instanceof CancellableEvent) {
|
||||
CancellableEvent ce = (CancellableEvent) event;
|
||||
if (annotation.priority() >= eventPriority) {
|
||||
eventPriority = annotation.priority();
|
||||
isCancelled = ce.isCancelled();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (event instanceof CancellableEvent) {
|
||||
CancellableEvent ce = (CancellableEvent) event;
|
||||
ce.setCancelled(isCancelled);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a legacy packet event listener.
|
||||
* Not recommended to use the deprecated event listener.
|
||||
*
|
||||
* @param listener {@link PacketListener}
|
||||
*/
|
||||
@Deprecated
|
||||
public void registerListener(final PacketListener listener) {
|
||||
final HashSet<Method> methods = new HashSet<>();
|
||||
for (final Method m : listener.getClass().getDeclaredMethods()) {
|
||||
if (!m.isAccessible()) {
|
||||
m.setAccessible(true);
|
||||
}
|
||||
if (m.isAnnotationPresent(PacketHandler.class)
|
||||
&& m.getParameterTypes().length == 1) {
|
||||
methods.add(m);
|
||||
}
|
||||
}
|
||||
|
||||
if (!methods.isEmpty()) {
|
||||
staticRegisteredMethods.put(listener, methods);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Register multiple legacy packet event listeners with one method.
|
||||
* Not recommended to use the deprecated event listener.
|
||||
*
|
||||
* @param listeners {@link PacketListener}
|
||||
*/
|
||||
@Deprecated
|
||||
public void registerListeners(final PacketListener... listeners) {
|
||||
for (final PacketListener listener : listeners) {
|
||||
registerListener(listener);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister a legacy packet event listener.
|
||||
* Not recommended to use the deprecated event listener.
|
||||
*
|
||||
* @param listener {@link PacketListener}
|
||||
*/
|
||||
@Deprecated
|
||||
public void unregisterListener(final PacketListener listener) {
|
||||
staticRegisteredMethods.remove(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister multiple legacy packet event listeners with one method.
|
||||
* Not recommended to use the deprecated event listener.
|
||||
*
|
||||
* @param listeners {@link PacketListener}
|
||||
*/
|
||||
@Deprecated
|
||||
public void unregisterListeners(final PacketListener... listeners) {
|
||||
for (final PacketListener listener : listeners) {
|
||||
unregisterListener(listener);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister all legacy packet event listeners.
|
||||
*/
|
||||
@Deprecated
|
||||
public void unregisterAllListeners() {
|
||||
staticRegisteredMethods.clear();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.manager;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import io.github.retrooper.packetevents.event.PacketListenerAbstract;
|
||||
import io.github.retrooper.packetevents.event.eventtypes.CancellableEvent;
|
||||
import io.github.retrooper.packetevents.event.priority.PacketEventPriority;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.logging.Level;
|
||||
|
||||
class EventManagerModern {
|
||||
private final Map<Byte, HashSet<PacketListenerAbstract>> listenersMap = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* Call the PacketEvent.
|
||||
* This method processes the event on all the registered dynamic packet event listeners.
|
||||
* The {@link PacketEventPriority#LOWEST} prioritized listeners will be processing first,
|
||||
* the {@link PacketEventPriority#MONITOR} will be processing last and can
|
||||
* be the final decider whether the event has been cancelled or not.
|
||||
* This call event also calls the legacy event manager call event.
|
||||
*
|
||||
* @param event {@link PacketEvent}
|
||||
* @see EventManagerLegacy#callEvent(PacketEvent, byte)
|
||||
*/
|
||||
public void callEvent(final PacketEvent event) {
|
||||
boolean cancel = false;
|
||||
if (event instanceof CancellableEvent) {
|
||||
cancel = ((CancellableEvent) event).isCancelled();
|
||||
}
|
||||
byte highestReachedPriority = PacketEventPriority.LOWEST.getPriorityValue();
|
||||
for (byte priority = PacketEventPriority.LOWEST.getPriorityValue(); priority <= PacketEventPriority.MONITOR.getPriorityValue(); priority++) {
|
||||
HashSet<PacketListenerAbstract> listeners = listenersMap.get(priority);
|
||||
if (listeners != null) {
|
||||
for (PacketListenerAbstract listener : listeners) {
|
||||
try {
|
||||
event.call(listener);
|
||||
} catch (Exception ex) {
|
||||
PacketEvents.get().getPlugin().getLogger()
|
||||
.log(Level.SEVERE, "PacketEvents found an exception while calling a packet listener.", ex);
|
||||
}
|
||||
if (event instanceof CancellableEvent) {
|
||||
CancellableEvent ce = (CancellableEvent) event;
|
||||
cancel = ce.isCancelled();
|
||||
highestReachedPriority = priority;
|
||||
}
|
||||
}
|
||||
if (event instanceof CancellableEvent) {
|
||||
CancellableEvent ce = (CancellableEvent) event;
|
||||
ce.setCancelled(cancel);
|
||||
}
|
||||
}
|
||||
}
|
||||
PEEventManager.EVENT_MANAGER_LEGACY.callEvent(event, highestReachedPriority);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the dynamic packet event listener.
|
||||
*
|
||||
* @param listener {@link PacketListenerAbstract}
|
||||
*/
|
||||
public synchronized void registerListener(final PacketListenerAbstract listener) {
|
||||
byte priority = listener.getPriority().getPriorityValue();
|
||||
HashSet<PacketListenerAbstract> listenerSet = listenersMap.get(priority);
|
||||
if (listenerSet == null) {
|
||||
listenerSet = new HashSet<>();
|
||||
}
|
||||
listenerSet.add(listener);
|
||||
listenersMap.put(priority, listenerSet);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register multiple dynamic packet event listeners with one method.
|
||||
*
|
||||
* @param listeners {@link PacketListenerAbstract}
|
||||
*/
|
||||
public synchronized void registerListeners(PacketListenerAbstract... listeners) {
|
||||
for (PacketListenerAbstract listener : listeners) {
|
||||
registerListener(listener);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister all dynamic packet event listeners.
|
||||
*/
|
||||
public synchronized void unregisterAllListeners() {
|
||||
listenersMap.clear();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.manager;
|
||||
|
||||
/**
|
||||
* Class storing a static instance of the dynamic and the legacy event manager.
|
||||
*
|
||||
* @author retrooper
|
||||
* @since 1.8
|
||||
*/
|
||||
public class PEEventManager implements EventManager {
|
||||
|
||||
public static final EventManagerLegacy EVENT_MANAGER_LEGACY = new EventManagerLegacy();
|
||||
public static final EventManagerModern EVENT_MANAGER_MODERN = new EventManagerModern();
|
||||
|
||||
}
|
||||
+97
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.event.priority;
|
||||
|
||||
/**
|
||||
* Event priority enum for the new event system.
|
||||
* The event priority counts for the whole {@link io.github.retrooper.packetevents.event.PacketListenerAbstract}
|
||||
* and not for just one event.
|
||||
* The priority can be specified in the PacketListenerAbstract constructor.
|
||||
* If you don't specify a priority in the constructor, it will use the {@link #NORMAL} priority.
|
||||
*
|
||||
* @author retrooper
|
||||
* @since 1.6.9
|
||||
*/
|
||||
public enum PacketEventPriority {
|
||||
/**
|
||||
* The weakest event priority.
|
||||
* The first to be processed(IN THE DYNAMIC EVENT SYSTEM ONLY).
|
||||
* Use this if you need to be the first processing the event and
|
||||
* need no power in cancelling an event or preventing an event cancellation.
|
||||
*/
|
||||
LOWEST,
|
||||
|
||||
/**
|
||||
* A weak event priority.
|
||||
* Second to be processed(IN THE DYNAMIC EVENT SYSTEM ONLY).
|
||||
* Use this if you would prefer to be one of the first to process the event,
|
||||
* but don't mind if some other listener processes before you.
|
||||
*/
|
||||
LOW,
|
||||
|
||||
/**
|
||||
* Default event priority.
|
||||
* Third to be processed(IN THE DYNAMIC EVENT SYSTEM ONLY).
|
||||
* Use this if you don't really care/know when you process or just want to
|
||||
* be in the middle.
|
||||
*/
|
||||
NORMAL,
|
||||
|
||||
/**
|
||||
* Higher than the {@link PacketEventPriority#NORMAL} event priority.
|
||||
* Fourth to be processed(IN THE DYNAMIC EVENT SYSTEM ONLY).
|
||||
* Use this if you want to process before the default event prioritized listeners.
|
||||
*/
|
||||
HIGH,
|
||||
|
||||
/**
|
||||
* Second most powerful event priority.
|
||||
* Fifth to be processed(IN THE DYNAMIC EVENT SYSTEM ONLY).
|
||||
* Use this if you prefer to be one of the last to process,
|
||||
* but don't mind if some other listener really needs to process after you.
|
||||
* Also use this if you prefer deciding if the event cancelled or not, but don't
|
||||
* mind if some other listener urgently needs to decide over you.
|
||||
* {@link PacketEventPriority#MONITOR} is rarely ever recommended to use.
|
||||
*/
|
||||
HIGHEST,
|
||||
|
||||
/**
|
||||
* Most powerful event priority.
|
||||
* Last(Sixth) to be processed(IN THE DYNAMIC EVENT SYSTEM ONLY).
|
||||
* Use this if you urgently need to be the last to process
|
||||
* or urgently need to be the final decider whether the event has cancelled or not.
|
||||
* This is rarely recommended.
|
||||
*/
|
||||
MONITOR;
|
||||
|
||||
|
||||
public static PacketEventPriority getPacketEventPriority(byte bytePriority) {
|
||||
return values()[bytePriority];
|
||||
}
|
||||
|
||||
public byte getPriorityValue() {
|
||||
return (byte) ordinal();
|
||||
}
|
||||
}
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.exceptions;
|
||||
|
||||
/**
|
||||
* An exception thrown by PacketEvents when the {@link io.github.retrooper.packetevents.PacketEvents#load}
|
||||
* method fails to execute without any exceptions.
|
||||
* Resulting in PacketEvents failing to load.
|
||||
*
|
||||
* @author retrooper
|
||||
* @since 1.7.6
|
||||
*/
|
||||
public class PacketEventsLoadFailureException extends RuntimeException {
|
||||
public PacketEventsLoadFailureException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public PacketEventsLoadFailureException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
public PacketEventsLoadFailureException() {
|
||||
this("PacketEvents failed to load...");
|
||||
}
|
||||
|
||||
public PacketEventsLoadFailureException(Throwable cause) {
|
||||
this("PacketEvents failed to load...", cause);
|
||||
}
|
||||
}
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.exceptions;
|
||||
|
||||
import io.github.retrooper.packetevents.utils.reflection.ClassUtil;
|
||||
|
||||
/**
|
||||
* An exception thrown by PacketEvents when a wrapper fails
|
||||
* to find a field.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see io.github.retrooper.packetevents.packetwrappers.WrappedPacket#read(int, Class)
|
||||
* @see io.github.retrooper.packetevents.packetwrappers.WrappedPacket#write(Class, int, Object)
|
||||
* @since 1.6.9
|
||||
*/
|
||||
public class WrapperFieldNotFoundException extends RuntimeException {
|
||||
public WrapperFieldNotFoundException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public WrapperFieldNotFoundException(Class<?> packetClass, Class<?> type, int index) {
|
||||
this("PacketEvents failed to find a " + ClassUtil.getClassSimpleName(type) + " indexed " + index + " by its type in the " + packetClass.getName() + " class!");
|
||||
}
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.exceptions;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.reflection.ClassUtil;
|
||||
|
||||
/**
|
||||
* An exception thrown by PacketEvents when a wrapper is used although it isn't supported on the local server version.
|
||||
* Make sure to decompile a wrapper before using it, if you are unsure if it is supported through out all the server versions.
|
||||
* We override a {@link WrappedPacket#isSupported()} method if it isn't supported on all server versions.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see WrappedPacket#isSupported()
|
||||
* @see WrappedPacket.SupportedVersions
|
||||
* @since 1.7
|
||||
*/
|
||||
public class WrapperUnsupportedUsageException extends RuntimeException {
|
||||
public WrapperUnsupportedUsageException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public WrapperUnsupportedUsageException(Class<? extends WrappedPacket> wrapperClass) {
|
||||
this("You are using a packet wrapper which happens to be unsupported on the local server version. Packet wrapper you attempted to use: " + ClassUtil.getClassSimpleName(wrapperClass));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package io.github.retrooper.packetevents.injector;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public interface ChannelInjector {
|
||||
void inject();
|
||||
|
||||
void eject();
|
||||
|
||||
void injectPlayer(Player player);
|
||||
|
||||
void ejectPlayer(Player player);
|
||||
|
||||
boolean hasInjected(Player player);
|
||||
|
||||
void sendPacket(Object channel, Object rawNMSPacket);
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.injector;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public interface EarlyInjector extends ChannelInjector {
|
||||
void updatePlayerObject(Player player, Object channel);
|
||||
|
||||
boolean isBound();
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
package io.github.retrooper.packetevents.injector;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.event.impl.PlayerEjectEvent;
|
||||
import io.github.retrooper.packetevents.event.impl.PlayerInjectEvent;
|
||||
import io.github.retrooper.packetevents.injector.legacy.early.EarlyChannelInjectorLegacy;
|
||||
import io.github.retrooper.packetevents.injector.modern.early.EarlyChannelInjectorModern;
|
||||
import io.github.retrooper.packetevents.injector.legacy.late.LateChannelInjectorLegacy;
|
||||
import io.github.retrooper.packetevents.injector.modern.late.LateChannelInjectorModern;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class GlobalChannelInjector implements ChannelInjector {
|
||||
private ChannelInjector injector;
|
||||
|
||||
public GlobalChannelInjector() {
|
||||
|
||||
}
|
||||
|
||||
public void load() {
|
||||
boolean legacy = NMSUtils.legacyNettyImportMode;
|
||||
if (!PacketEvents.get().getSettings().shouldUseCompatibilityInjector()) {
|
||||
injector = legacy ? new EarlyChannelInjectorLegacy() : new EarlyChannelInjectorModern();
|
||||
} else {
|
||||
injector = legacy ? new LateChannelInjectorLegacy() : new LateChannelInjectorModern();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void inject() {
|
||||
try {
|
||||
//Try inject...
|
||||
injector.inject();
|
||||
} catch (Exception ex) {
|
||||
//Failed to inject! Let us revert to the compatibility injector and re-inject.
|
||||
if (injector instanceof EarlyInjector) {
|
||||
PacketEvents.get().getSettings().compatInjector(true);
|
||||
load();
|
||||
injector.inject();
|
||||
PacketEvents.get().getPlugin().getLogger().warning("PacketEvents failed to inject with the Early Injector. Reverting to the Compatibility/Late Injector... This is just a warning, but please report this!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void eject() {
|
||||
injector.eject();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void injectPlayer(Player player) {
|
||||
PlayerInjectEvent injectEvent = new PlayerInjectEvent(player);
|
||||
PacketEvents.get().callEvent(injectEvent);
|
||||
if (!injectEvent.isCancelled()) {
|
||||
injector.injectPlayer(player);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ejectPlayer(Player player) {
|
||||
PlayerEjectEvent ejectEvent = new PlayerEjectEvent(player);
|
||||
PacketEvents.get().callEvent(ejectEvent);
|
||||
if (!ejectEvent.isCancelled()) {
|
||||
injector.ejectPlayer(player);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasInjected(Player player) {
|
||||
return injector.hasInjected(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendPacket(Object ch, Object rawNMSPacket) {
|
||||
injector.sendPacket(ch, rawNMSPacket);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package io.github.retrooper.packetevents.injector;
|
||||
|
||||
public interface LateInjector extends ChannelInjector {
|
||||
|
||||
}
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.injector.legacy;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import net.minecraft.util.io.netty.channel.ChannelDuplexHandler;
|
||||
import net.minecraft.util.io.netty.channel.ChannelHandlerContext;
|
||||
import net.minecraft.util.io.netty.channel.ChannelPromise;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class PlayerChannelHandlerLegacy extends ChannelDuplexHandler {
|
||||
/**
|
||||
* Associated player.
|
||||
* This is null until the player is injected.
|
||||
*/
|
||||
public volatile Player player;
|
||||
|
||||
@Override
|
||||
public void channelRead(final ChannelHandlerContext ctx, Object packet) throws Exception {
|
||||
try {
|
||||
packet = PacketEvents.get().packetProcessorInternal.read(player, ctx.channel(), packet);
|
||||
if (packet != null) {
|
||||
super.channelRead(ctx, packet);
|
||||
PacketEvents.get().packetProcessorInternal.postRead(player, ctx.channel(), packet);
|
||||
}
|
||||
}
|
||||
catch (Throwable t) {
|
||||
PacketEvents.get().getPlugin().getLogger().log(Level.SEVERE, "Unable to handle an incoming packet ", t.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(final ChannelHandlerContext ctx, Object packet, final ChannelPromise promise) throws Exception {
|
||||
try {
|
||||
packet = PacketEvents.get().packetProcessorInternal.write(player, ctx.channel(), packet);
|
||||
if (packet != null) {
|
||||
super.write(ctx, packet, promise);
|
||||
PacketEvents.get().packetProcessorInternal.postWrite(player, ctx.channel(), packet);
|
||||
}
|
||||
}
|
||||
catch (Throwable t) {
|
||||
PacketEvents.get().getPlugin().getLogger().log(Level.SEVERE, "Unable to handle an outgoing packet ", t.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
+317
@@ -0,0 +1,317 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.injector.legacy.early;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.injector.EarlyInjector;
|
||||
import io.github.retrooper.packetevents.injector.legacy.PlayerChannelHandlerLegacy;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.list.ListWrapper;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import net.minecraft.util.io.netty.channel.Channel;
|
||||
import net.minecraft.util.io.netty.channel.ChannelFuture;
|
||||
import net.minecraft.util.io.netty.channel.ChannelHandler;
|
||||
import net.minecraft.util.io.netty.channel.ChannelInitializer;
|
||||
import net.minecraft.util.io.netty.channel.socket.SocketChannel;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.PluginDescriptionFile;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Early channel injector for 1.7.10 server versions.
|
||||
* Thank you ViaVersion.
|
||||
* https://github.com/ViaVersion/ViaVersion/tree/master/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java
|
||||
*
|
||||
* @author retrooper, Thomazz, ViaVersion
|
||||
* @since 1.8
|
||||
*/
|
||||
public class EarlyChannelInjectorLegacy implements EarlyInjector {
|
||||
private final List<ChannelFuture> injectedFutures = new ArrayList<>();
|
||||
private final List<Map<Field, Object>> injectedLists = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public void inject() {
|
||||
try {
|
||||
Object serverConnection = NMSUtils.getMinecraftServerConnection();
|
||||
for (Field field : serverConnection.getClass().getDeclaredFields()) {
|
||||
field.setAccessible(true);
|
||||
Object value = null;
|
||||
try {
|
||||
value = field.get(serverConnection);
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (value instanceof List) {
|
||||
//Get the list.
|
||||
List listWrapper = new ListWrapper((List) value) {
|
||||
@Override
|
||||
public void processAdd(Object o) {
|
||||
if (o instanceof ChannelFuture) {
|
||||
try {
|
||||
injectChannelFuture((ChannelFuture) o);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
HashMap<Field, Object> map = new HashMap<>();
|
||||
map.put(field, serverConnection);
|
||||
injectedLists.add(map);
|
||||
|
||||
field.set(serverConnection, listWrapper);
|
||||
|
||||
synchronized (listWrapper) {
|
||||
for (Object serverChannel : (List) value) {
|
||||
//Is this the server channel future list?
|
||||
if (serverChannel instanceof ChannelFuture) {
|
||||
//Yes it is...
|
||||
injectChannelFuture((ChannelFuture) serverChannel);
|
||||
} else {
|
||||
break;//Wrong list
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
PacketEvents.get().getPlugin().getLogger().severe("PacketEvents failed to inject!");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
|
||||
//Player channels might have been registered already. Let us add our handlers. We are a little late though.
|
||||
//This only happens when you join extremely early on older versions of minecraft.
|
||||
List<Object> networkManagers = NMSUtils.getNetworkManagers();
|
||||
synchronized (networkManagers) {
|
||||
for (Object networkManager : networkManagers) {
|
||||
WrappedPacket networkManagerWrapper = new WrappedPacket(new NMSPacket(networkManager));
|
||||
Channel channel = (Channel) networkManagerWrapper.readObject(0, NMSUtils.nettyChannelClass);
|
||||
if (channel == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (channel.pipeline().get("packet_handler") != null) {
|
||||
channel.pipeline().addBefore("packet_handler", PacketEvents.handlerName, new PlayerChannelHandlerLegacy());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void injectChannelFuture(ChannelFuture channelFuture) {
|
||||
List<String> channelHandlerNames = channelFuture.channel().pipeline().names();
|
||||
ChannelHandler bootstrapAcceptor = null;
|
||||
Field bootstrapAcceptorField = null;
|
||||
for (String handlerName : channelHandlerNames) {
|
||||
ChannelHandler handler = channelFuture.channel().pipeline().get(handlerName);
|
||||
try {
|
||||
bootstrapAcceptorField = handler.getClass().getDeclaredField("childHandler");
|
||||
bootstrapAcceptorField.setAccessible(true);
|
||||
bootstrapAcceptorField.get(handler);
|
||||
bootstrapAcceptor = handler;
|
||||
} catch (Exception ex) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if (bootstrapAcceptor == null) {
|
||||
bootstrapAcceptor = channelFuture.channel().pipeline().first();
|
||||
}
|
||||
|
||||
ChannelInitializer<?> oldChannelInitializer = null;
|
||||
try {
|
||||
oldChannelInitializer = (ChannelInitializer<?>) bootstrapAcceptorField.get(bootstrapAcceptor);
|
||||
|
||||
ChannelInitializer<?> channelInitializer = new PEChannelInitializerLegacy(oldChannelInitializer);
|
||||
|
||||
//Replace the old channel initializer with our own.
|
||||
bootstrapAcceptorField.setAccessible(true);
|
||||
bootstrapAcceptorField.set(bootstrapAcceptor, channelInitializer);
|
||||
|
||||
injectedFutures.add(channelFuture);
|
||||
} catch (IllegalAccessException e) {
|
||||
ClassLoader cl = bootstrapAcceptor.getClass().getClassLoader();
|
||||
if (cl.getClass().getName().equals("org.bukkit.plugin.java.PluginClassLoader")) {
|
||||
PluginDescriptionFile yaml = null;
|
||||
try {
|
||||
yaml = (PluginDescriptionFile) PluginDescriptionFile.class.getDeclaredField("description").get(cl);
|
||||
} catch (IllegalAccessException | NoSuchFieldException e2) {
|
||||
e2.printStackTrace();
|
||||
}
|
||||
throw new IllegalStateException("PacketEvents failed to inject, because of " + bootstrapAcceptor.getClass().getName() + ", you might want to try running without " + yaml.getName() + "?");
|
||||
} else {
|
||||
throw new IllegalStateException("PacketEvents failed to find core component 'childHandler', please check your plugins. issue: " + bootstrapAcceptor.getClass().getName());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void eject() {
|
||||
Field childHandlerField = null;
|
||||
for (ChannelFuture future : injectedFutures) {
|
||||
List<String> names = future.channel().pipeline().names();
|
||||
ChannelHandler bootstrapAcceptor = null;
|
||||
// Pick best
|
||||
for (String name : names) {
|
||||
try {
|
||||
ChannelHandler handler = future.channel().pipeline().get(name);
|
||||
if (childHandlerField == null) {
|
||||
childHandlerField = handler.getClass().getDeclaredField("childHandler");
|
||||
childHandlerField.setAccessible(true);
|
||||
}
|
||||
|
||||
ChannelInitializer<SocketChannel> oldInit = (ChannelInitializer<SocketChannel>) childHandlerField.get(handler);
|
||||
if (oldInit instanceof PEChannelInitializerLegacy) {
|
||||
bootstrapAcceptor = handler;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
// Not this one
|
||||
}
|
||||
}
|
||||
// Default to first
|
||||
if (bootstrapAcceptor == null) {
|
||||
bootstrapAcceptor = future.channel().pipeline().first();
|
||||
}
|
||||
|
||||
try {
|
||||
ChannelInitializer<SocketChannel> oldInit = (ChannelInitializer<SocketChannel>) childHandlerField.get(bootstrapAcceptor);
|
||||
if (oldInit instanceof PEChannelInitializerLegacy) {
|
||||
childHandlerField.setAccessible(true);
|
||||
childHandlerField.set(bootstrapAcceptor, ((PEChannelInitializerLegacy) oldInit).getOldChannelInitializer());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
PacketEvents.get().getPlugin().getLogger().severe("PacketEvents failed to eject the injection handler! Please reboot!");
|
||||
}
|
||||
}
|
||||
injectedFutures.clear();
|
||||
|
||||
for (Map<Field, Object> map : injectedLists) {
|
||||
try {
|
||||
for (Field key : map.keySet()) {
|
||||
key.setAccessible(true);
|
||||
Object o = map.get(key);
|
||||
if (o instanceof ListWrapper) {
|
||||
key.set(o, ((ListWrapper) o).getOriginalList());
|
||||
}
|
||||
}
|
||||
|
||||
} catch (IllegalAccessException e) {
|
||||
PacketEvents.get().getPlugin().getLogger().severe("PacketEvents failed to eject the injection handler! Please reboot!!");
|
||||
}
|
||||
}
|
||||
|
||||
injectedLists.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void injectPlayer(Player player) {
|
||||
Object channel = PacketEvents.get().packetProcessorInternal.getChannel(player);
|
||||
if (channel != null) {
|
||||
updatePlayerObject(player, channel);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ejectPlayer(Player player) {
|
||||
Object channel = PacketEvents.get().packetProcessorInternal.getChannel(player);
|
||||
if (channel != null) {
|
||||
Channel chnl = (Channel) channel;
|
||||
try {
|
||||
chnl.pipeline().remove(PacketEvents.handlerName);
|
||||
} catch (Exception ex) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasInjected(Player player) {
|
||||
Object channel = PacketEvents.get().packetProcessorInternal.getChannel(player);
|
||||
if (channel == null) {
|
||||
return false;
|
||||
}
|
||||
PlayerChannelHandlerLegacy handler = getHandler(channel);
|
||||
return handler != null && handler.player != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendPacket(Object ch, Object rawNMSPacket) {
|
||||
Channel channel = (Channel) ch;
|
||||
channel.writeAndFlush(rawNMSPacket);
|
||||
}
|
||||
|
||||
private PlayerChannelHandlerLegacy getHandler(Object rawChannel) {
|
||||
Channel channel = (Channel) rawChannel;
|
||||
ChannelHandler handler = channel.pipeline().get(PacketEvents.handlerName);
|
||||
if (handler instanceof PlayerChannelHandlerLegacy) {
|
||||
return (PlayerChannelHandlerLegacy) handler;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updatePlayerObject(Player player, Object rawChannel) {
|
||||
PlayerChannelHandlerLegacy handler = getHandler(rawChannel);
|
||||
if (handler != null) {
|
||||
handler.player = player;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBound() {
|
||||
try {
|
||||
Object connection = NMSUtils.getMinecraftServerConnection();
|
||||
if (connection == null) {
|
||||
return false;
|
||||
}
|
||||
for (Field field : connection.getClass().getDeclaredFields()) {
|
||||
field.setAccessible(true);
|
||||
final Object value = field.get(connection);
|
||||
if (value instanceof List) {
|
||||
// Inject the list
|
||||
synchronized (value) {
|
||||
for (Object o : (List) value) {
|
||||
if (o instanceof ChannelFuture) {
|
||||
return true;
|
||||
} else {
|
||||
break; // not the right list.
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.injector.legacy.early;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.injector.legacy.PlayerChannelHandlerLegacy;
|
||||
import io.github.retrooper.packetevents.utils.reflection.Reflection;
|
||||
import net.minecraft.util.io.netty.channel.ChannelInitializer;
|
||||
import net.minecraft.util.io.netty.channel.socket.SocketChannel;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class PEChannelInitializerLegacy extends ChannelInitializer<SocketChannel> {
|
||||
private final ChannelInitializer<?> oldChannelInitializer;
|
||||
private Method initChannelMethod;
|
||||
|
||||
public PEChannelInitializerLegacy(ChannelInitializer<?> oldChannelInitializer) {
|
||||
this.oldChannelInitializer = oldChannelInitializer;
|
||||
load();
|
||||
}
|
||||
|
||||
private void load() {
|
||||
initChannelMethod = Reflection.getMethod(oldChannelInitializer.getClass(), "initChannel", 0);
|
||||
}
|
||||
|
||||
public ChannelInitializer<?> getOldChannelInitializer() {
|
||||
return oldChannelInitializer;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initChannel(SocketChannel socketChannel) throws Exception {
|
||||
initChannelMethod.invoke(oldChannelInitializer, socketChannel);
|
||||
PlayerChannelHandlerLegacy channelHandler = new PlayerChannelHandlerLegacy();
|
||||
if (socketChannel.pipeline().get("packet_handler") != null) {
|
||||
socketChannel.pipeline().addBefore("packet_handler", PacketEvents.handlerName, channelHandler);
|
||||
}
|
||||
}
|
||||
}
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.injector.legacy.late;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.injector.legacy.PlayerChannelHandlerLegacy;
|
||||
import io.github.retrooper.packetevents.injector.LateInjector;
|
||||
import net.minecraft.util.io.netty.channel.Channel;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class LateChannelInjectorLegacy implements LateInjector {
|
||||
@Override
|
||||
public void inject() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void eject() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void injectPlayer(Player player) {
|
||||
PlayerChannelHandlerLegacy playerChannelHandlerLegacy = new PlayerChannelHandlerLegacy();
|
||||
playerChannelHandlerLegacy.player = player;
|
||||
Channel channel = (Channel) PacketEvents.get().packetProcessorInternal.getChannel(player);
|
||||
channel.pipeline().addBefore("packet_handler", PacketEvents.handlerName, playerChannelHandlerLegacy);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ejectPlayer(Player player) {
|
||||
Object channel = PacketEvents.get().packetProcessorInternal.getChannel(player);
|
||||
if (channel != null) {
|
||||
Channel chnl = (Channel) channel;
|
||||
try {
|
||||
chnl.pipeline().remove(PacketEvents.handlerName);
|
||||
}
|
||||
catch (Exception ex) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasInjected(Player player) {
|
||||
Channel channel = (Channel) PacketEvents.get().packetProcessorInternal.getChannel(player);
|
||||
return channel.pipeline().get(PacketEvents.handlerName) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendPacket(Object rawChannel, Object packet) {
|
||||
Channel channel = (Channel) rawChannel;
|
||||
channel.pipeline().writeAndFlush(packet);
|
||||
}
|
||||
}
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.injector.modern;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.netty.channel.ChannelDuplexHandler;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.channel.ChannelPromise;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class PlayerChannelHandlerModern extends ChannelDuplexHandler {
|
||||
/**
|
||||
* Associated player.
|
||||
* This is null until we inject the player.
|
||||
*/
|
||||
public volatile Player player;
|
||||
|
||||
@Override
|
||||
public void channelRead(final ChannelHandlerContext ctx, Object packet) throws Exception {
|
||||
try {
|
||||
packet = PacketEvents.get().packetProcessorInternal.read(player, ctx.channel(), packet);
|
||||
if (packet != null) {
|
||||
super.channelRead(ctx, packet);
|
||||
PacketEvents.get().packetProcessorInternal.postRead(player, ctx.channel(), packet);
|
||||
}
|
||||
}
|
||||
catch (Throwable t) {
|
||||
PacketEvents.get().getPlugin().getLogger().log(Level.SEVERE, "Unable to handle an incoming packet ", t.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void write(final ChannelHandlerContext ctx, Object packet, final ChannelPromise promise) throws Exception {
|
||||
try {
|
||||
packet = PacketEvents.get().packetProcessorInternal.write(player, ctx.channel(), packet);
|
||||
if (packet != null) {
|
||||
super.write(ctx, packet, promise);
|
||||
PacketEvents.get().packetProcessorInternal.postWrite(player, ctx.channel(), packet);
|
||||
}
|
||||
}
|
||||
catch (Throwable t) {
|
||||
PacketEvents.get().getPlugin().getLogger().log(Level.SEVERE, "Unable to handle an outgoing packet ", t.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
+310
@@ -0,0 +1,310 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.injector.modern.early;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.injector.EarlyInjector;
|
||||
import io.github.retrooper.packetevents.injector.modern.PlayerChannelHandlerModern;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.list.ListWrapper;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import io.netty.channel.Channel;
|
||||
import io.netty.channel.ChannelFuture;
|
||||
import io.netty.channel.ChannelHandler;
|
||||
import io.netty.channel.ChannelInitializer;
|
||||
import io.netty.channel.socket.SocketChannel;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.PluginDescriptionFile;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Early channel injector for all server versions higher than 1.7.10.
|
||||
* Thank you ViaVersion.
|
||||
* https://github.com/ViaVersion/ViaVersion/tree/master/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaInjector.java
|
||||
*
|
||||
* @author retrooper, Thomazz, ViaVersion
|
||||
* @since 1.8
|
||||
*/
|
||||
public class EarlyChannelInjectorModern implements EarlyInjector {
|
||||
private final List<ChannelFuture> injectedFutures = new ArrayList<>();
|
||||
private final List<Map<Field, Object>> injectedLists = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public void inject() {
|
||||
try {
|
||||
Object serverConnection = NMSUtils.getMinecraftServerConnection();
|
||||
for (Field field : serverConnection.getClass().getDeclaredFields()) {
|
||||
field.setAccessible(true);
|
||||
Object value = null;
|
||||
try {
|
||||
value = field.get(serverConnection);
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (value instanceof List) {
|
||||
//Get the list.
|
||||
List listWrapper = new ListWrapper((List) value) {
|
||||
@Override
|
||||
public void processAdd(Object o) {
|
||||
if (o instanceof ChannelFuture) {
|
||||
try {
|
||||
injectChannelFuture((ChannelFuture) o);
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
HashMap<Field, Object> map = new HashMap<>();
|
||||
map.put(field, serverConnection);
|
||||
injectedLists.add(map);
|
||||
|
||||
field.set(serverConnection, listWrapper);
|
||||
|
||||
synchronized (listWrapper) {
|
||||
for (Object serverChannel : (List) value) {
|
||||
//Is this the server channel future list?
|
||||
if (serverChannel instanceof ChannelFuture) {
|
||||
//Yes it is...
|
||||
injectChannelFuture((ChannelFuture) serverChannel);
|
||||
} else {
|
||||
break;//Wrong list
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
throw new IllegalStateException("PacketEvents failed to inject!", ex);
|
||||
}
|
||||
|
||||
//Player channels might have been registered already. Let us add our handlers. We are a little late though.
|
||||
//This only happens when you join extremely early on older versions of minecraft.
|
||||
List<Object> networkManagers = NMSUtils.getNetworkManagers();
|
||||
synchronized (networkManagers) {
|
||||
for (Object networkManager : networkManagers) {
|
||||
WrappedPacket networkManagerWrapper = new WrappedPacket(new NMSPacket(networkManager));
|
||||
Channel channel = (Channel) networkManagerWrapper.readObject(0, NMSUtils.nettyChannelClass);
|
||||
if (channel == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (channel.pipeline().get("packet_handler") != null) {
|
||||
channel.pipeline().addBefore("packet_handler", PacketEvents.handlerName, new PlayerChannelHandlerModern());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void injectChannelFuture(ChannelFuture channelFuture) {
|
||||
List<String> channelHandlerNames = channelFuture.channel().pipeline().names();
|
||||
ChannelHandler bootstrapAcceptor = null;
|
||||
Field bootstrapAcceptorField = null;
|
||||
for (String handlerName : channelHandlerNames) {
|
||||
ChannelHandler handler = channelFuture.channel().pipeline().get(handlerName);
|
||||
try {
|
||||
bootstrapAcceptorField = handler.getClass().getDeclaredField("childHandler");
|
||||
bootstrapAcceptorField.setAccessible(true);
|
||||
bootstrapAcceptorField.get(handler);
|
||||
bootstrapAcceptor = handler;
|
||||
} catch (Exception ignored) {}
|
||||
}
|
||||
|
||||
if (bootstrapAcceptor == null) {
|
||||
bootstrapAcceptor = channelFuture.channel().pipeline().first();
|
||||
}
|
||||
|
||||
ChannelInitializer<?> oldChannelInitializer;
|
||||
try {
|
||||
oldChannelInitializer = (ChannelInitializer<?>) bootstrapAcceptorField.get(bootstrapAcceptor);
|
||||
|
||||
ChannelInitializer<?> channelInitializer = new PEChannelInitializerModern(oldChannelInitializer);
|
||||
|
||||
//Replace the old channel initializer with our own.
|
||||
bootstrapAcceptorField.setAccessible(true);
|
||||
bootstrapAcceptorField.set(bootstrapAcceptor, channelInitializer);
|
||||
injectedFutures.add(channelFuture);
|
||||
} catch (IllegalAccessException e) {
|
||||
ClassLoader cl = bootstrapAcceptor.getClass().getClassLoader();
|
||||
if (cl.getClass().getName().equals("org.bukkit.plugin.java.PluginClassLoader")) {
|
||||
PluginDescriptionFile yaml = null;
|
||||
try {
|
||||
yaml = (PluginDescriptionFile) PluginDescriptionFile.class.getDeclaredField("description").get(cl);
|
||||
} catch (IllegalAccessException | NoSuchFieldException e2) {
|
||||
e2.printStackTrace();
|
||||
}
|
||||
throw new IllegalStateException("PacketEvents failed to inject, because of " + bootstrapAcceptor.getClass().getName() + ", you might want to try running without " + yaml.getName() + "?");
|
||||
} else {
|
||||
throw new IllegalStateException("PacketEvents failed to find core component 'childHandler', please check your plugins. issue: " + bootstrapAcceptor.getClass().getName());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void eject() {
|
||||
Field childHandlerField = null;
|
||||
for (ChannelFuture future : injectedFutures) {
|
||||
List<String> names = future.channel().pipeline().names();
|
||||
ChannelHandler bootstrapAcceptor = null;
|
||||
// Pick best
|
||||
for (String name : names) {
|
||||
try {
|
||||
ChannelHandler handler = future.channel().pipeline().get(name);
|
||||
if (childHandlerField == null) {
|
||||
childHandlerField = handler.getClass().getDeclaredField("childHandler");
|
||||
childHandlerField.setAccessible(true);
|
||||
}
|
||||
|
||||
ChannelInitializer<SocketChannel> oldInit = (ChannelInitializer<SocketChannel>) childHandlerField.get(handler);
|
||||
if (oldInit instanceof PEChannelInitializerModern) {
|
||||
bootstrapAcceptor = handler;
|
||||
}
|
||||
} catch (Exception ignored) {
|
||||
// Not this one
|
||||
}
|
||||
}
|
||||
// Default to first
|
||||
if (bootstrapAcceptor == null) {
|
||||
bootstrapAcceptor = future.channel().pipeline().first();
|
||||
}
|
||||
|
||||
try {
|
||||
ChannelInitializer<SocketChannel> oldInit = (ChannelInitializer<SocketChannel>) childHandlerField.get(bootstrapAcceptor);
|
||||
if (oldInit instanceof PEChannelInitializerModern) {
|
||||
childHandlerField.setAccessible(true);
|
||||
childHandlerField.set(bootstrapAcceptor, ((PEChannelInitializerModern) oldInit).getOldChannelInitializer());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
PacketEvents.get().getPlugin().getLogger().severe("PacketEvents failed to eject the injection handler! Please reboot!");
|
||||
}
|
||||
}
|
||||
injectedFutures.clear();
|
||||
|
||||
for (Map<Field, Object> map : injectedLists) {
|
||||
try {
|
||||
for (Field key : map.keySet()) {
|
||||
key.setAccessible(true);
|
||||
Object o = map.get(key);
|
||||
if (o instanceof ListWrapper) {
|
||||
key.set(o, ((ListWrapper) o).getOriginalList());
|
||||
}
|
||||
}
|
||||
|
||||
} catch (IllegalAccessException e) {
|
||||
PacketEvents.get().getPlugin().getLogger().severe("PacketEvents failed to eject the injection handler! Please reboot!!");
|
||||
}
|
||||
}
|
||||
|
||||
injectedLists.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void injectPlayer(Player player) {
|
||||
Object channel = PacketEvents.get().packetProcessorInternal.getChannel(player);
|
||||
if (channel != null) {
|
||||
updatePlayerObject(player, channel);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ejectPlayer(Player player) {
|
||||
Object channel = PacketEvents.get().packetProcessorInternal.getChannel(player);
|
||||
if (channel != null) {
|
||||
Channel chnl = (Channel) channel;
|
||||
try {
|
||||
chnl.pipeline().remove(PacketEvents.handlerName);
|
||||
} catch (Exception ignored) {}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasInjected(Player player) {
|
||||
Object channel = PacketEvents.get().packetProcessorInternal.getChannel(player);
|
||||
if (channel == null) {
|
||||
return false;
|
||||
}
|
||||
PlayerChannelHandlerModern handler = getHandler(channel);
|
||||
return handler != null && handler.player != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendPacket(Object ch, Object rawNMSPacket) {
|
||||
Channel channel = (Channel) ch;
|
||||
channel.writeAndFlush(rawNMSPacket);
|
||||
}
|
||||
|
||||
private PlayerChannelHandlerModern getHandler(Object rawChannel) {
|
||||
Channel channel = (Channel) rawChannel;
|
||||
ChannelHandler handler = channel.pipeline().get(PacketEvents.handlerName);
|
||||
if (handler instanceof PlayerChannelHandlerModern) {
|
||||
return (PlayerChannelHandlerModern) handler;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updatePlayerObject(Player player, Object rawChannel) {
|
||||
PlayerChannelHandlerModern handler = getHandler(rawChannel);
|
||||
if (handler != null) {
|
||||
handler.player = player;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBound() {
|
||||
try {
|
||||
Object connection = NMSUtils.getMinecraftServerConnection();
|
||||
if (connection == null) {
|
||||
return false;
|
||||
}
|
||||
for (Field field : connection.getClass().getDeclaredFields()) {
|
||||
field.setAccessible(true);
|
||||
final Object value = field.get(connection);
|
||||
if (value instanceof List) {
|
||||
// Inject the list
|
||||
synchronized (value) {
|
||||
for (Object o : (List) value) {
|
||||
if (o instanceof ChannelFuture) {
|
||||
return true;
|
||||
} else {
|
||||
break; // not the right list.
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception ignored) {}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.injector.modern.early;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.injector.modern.PlayerChannelHandlerModern;
|
||||
import io.github.retrooper.packetevents.utils.reflection.Reflection;
|
||||
import io.netty.channel.ChannelInitializer;
|
||||
import io.netty.channel.socket.SocketChannel;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class PEChannelInitializerModern extends ChannelInitializer<SocketChannel> {
|
||||
private final ChannelInitializer<?> oldChannelInitializer;
|
||||
private Method initChannelMethod;
|
||||
|
||||
public PEChannelInitializerModern(ChannelInitializer<?> oldChannelInitializer) {
|
||||
this.oldChannelInitializer = oldChannelInitializer;
|
||||
load();
|
||||
}
|
||||
|
||||
private void load() {
|
||||
initChannelMethod = Reflection.getMethod(oldChannelInitializer.getClass(), "initChannel", 0);
|
||||
}
|
||||
|
||||
public ChannelInitializer<?> getOldChannelInitializer() {
|
||||
return oldChannelInitializer;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void initChannel(SocketChannel socketChannel) throws Exception {
|
||||
initChannelMethod.invoke(oldChannelInitializer, socketChannel);
|
||||
PlayerChannelHandlerModern channelHandler = new PlayerChannelHandlerModern();
|
||||
if (socketChannel.pipeline().get("packet_handler") != null) {
|
||||
socketChannel.pipeline().addBefore("packet_handler", PacketEvents.handlerName, channelHandler);
|
||||
}
|
||||
}
|
||||
}
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.injector.modern.late;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.injector.modern.PlayerChannelHandlerModern;
|
||||
import io.github.retrooper.packetevents.injector.LateInjector;
|
||||
import io.netty.channel.Channel;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class LateChannelInjectorModern implements LateInjector {
|
||||
@Override
|
||||
public void inject() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void eject() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void injectPlayer(Player player) {
|
||||
PlayerChannelHandlerModern playerChannelHandlerModern = new PlayerChannelHandlerModern();
|
||||
playerChannelHandlerModern.player = player;
|
||||
Channel channel = (Channel) PacketEvents.get().packetProcessorInternal.getChannel(player);
|
||||
channel.pipeline().addBefore("packet_handler", PacketEvents.handlerName, playerChannelHandlerModern);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ejectPlayer(Player player) {
|
||||
Object channel = PacketEvents.get().packetProcessorInternal.getChannel(player);
|
||||
if (channel != null) {
|
||||
Channel chnl = (Channel) channel;
|
||||
try {
|
||||
chnl.pipeline().remove(PacketEvents.handlerName);
|
||||
}
|
||||
catch (Exception ex) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasInjected(Player player) {
|
||||
Channel channel = (Channel) PacketEvents.get().packetProcessorInternal.getChannel(player);
|
||||
return channel.pipeline().get(PacketEvents.handlerName) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendPacket(Object rawChannel, Object packet) {
|
||||
Channel channel = (Channel) rawChannel;
|
||||
channel.pipeline().writeAndFlush(packet);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package io.github.retrooper.packetevents.packettype;
|
||||
|
||||
/**
|
||||
* @author retrooper
|
||||
* @since 1.8
|
||||
*/
|
||||
public enum PacketState {
|
||||
STATUS, HANDSHAKING, LOGIN, PLAY
|
||||
}
|
||||
@@ -0,0 +1,453 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packettype;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerVersion;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.IdentityHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/**
|
||||
* Packet Type IDs.
|
||||
* This is the Packet ID system, it is recommended to use this over packet comparisons by packet name.
|
||||
* This is also faster than comparing packet names.
|
||||
*
|
||||
* @author retrooper
|
||||
* @since 1.6.8
|
||||
*/
|
||||
public class PacketType {
|
||||
/**
|
||||
* If a Packet Type could not be resolved, it will be set to the current value of this constant.
|
||||
* This value may change over the versions so it is important to use the variable and not hard code its value.
|
||||
*/
|
||||
public static final byte INVALID = -128;
|
||||
public static final Map<Class<?>, Byte> packetIDMap = new IdentityHashMap<>();
|
||||
|
||||
private static void insertPacketID(Class<?> cls, byte packetID) {
|
||||
if (cls != null) {
|
||||
packetIDMap.put(cls, packetID);
|
||||
}
|
||||
}
|
||||
|
||||
public static void load() {
|
||||
Status.Client.load();
|
||||
Status.Server.load();
|
||||
|
||||
Handshaking.Client.load();
|
||||
|
||||
Login.Client.load();
|
||||
Login.Server.load();
|
||||
|
||||
Play.Client.load();
|
||||
Play.Server.load();
|
||||
}
|
||||
|
||||
/**
|
||||
* Status Packet IDs.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Status">https://wiki.vg/Protocol#Status</a>
|
||||
* @since 1.7
|
||||
*/
|
||||
public static class Status {
|
||||
/**
|
||||
* Server-bound (client-sided) Status Packet IDs.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Serverbound_2">https://wiki.vg/Protocol#Serverbound_2</a>
|
||||
* @since 1.8
|
||||
*/
|
||||
public static class Client {
|
||||
public static final byte START = -127, PING = -126;
|
||||
private static void load() {
|
||||
insertPacketID(PacketTypeClasses.Status.Client.START, Client.START);
|
||||
insertPacketID(PacketTypeClasses.Status.Client.PING, Client.PING);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Client-bound (server-sided) Status Packet IDs.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Clientbound_2">https://wiki.vg/Protocol#Clientbound_2</a>
|
||||
* @since 1.8
|
||||
*/
|
||||
public static class Server {
|
||||
public static final byte PONG = -125, SERVER_INFO = -124;
|
||||
private static void load() {
|
||||
insertPacketID(PacketTypeClasses.Status.Server.PONG, Server.PONG);
|
||||
insertPacketID(PacketTypeClasses.Status.Server.SERVER_INFO, Server.SERVER_INFO);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handshaking Packet IDs.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Handshaking">https://wiki.vg/Protocol#Handshaking</a>
|
||||
* @since 1.8
|
||||
*/
|
||||
public static class Handshaking {
|
||||
/**
|
||||
* Server-bound (client-sided) Handshaking Packet IDs.
|
||||
*
|
||||
* @author retrooper
|
||||
* @since 1.8
|
||||
*/
|
||||
public static class Client {
|
||||
public static final byte SET_PROTOCOL = -123;
|
||||
private static void load() {
|
||||
insertPacketID(PacketTypeClasses.Handshaking.Client.SET_PROTOCOL, Client.SET_PROTOCOL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Login Packet IDs.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Login">https://wiki.vg/Protocol#Login</a>
|
||||
* @since 1.7
|
||||
*/
|
||||
public static class Login {
|
||||
/**
|
||||
* Server-bound (client-sided) Login Packet IDs.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Serverbound_3">https://wiki.vg/Protocol#Serverbound_3</a>
|
||||
* @since 1.8
|
||||
*/
|
||||
public static class Client {
|
||||
public static final byte CUSTOM_PAYLOAD = -122, START = -121, ENCRYPTION_BEGIN = -120;
|
||||
private static void load() {
|
||||
insertPacketID(PacketTypeClasses.Login.Client.CUSTOM_PAYLOAD, Client.CUSTOM_PAYLOAD);
|
||||
insertPacketID(PacketTypeClasses.Login.Client.START, Client.START);
|
||||
insertPacketID(PacketTypeClasses.Login.Client.ENCRYPTION_BEGIN, Client.ENCRYPTION_BEGIN);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Client-bound (server-sided) Login Packet IDs.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Clientbound_3">https://wiki.vg/Protocol#Clientbound_3</a>
|
||||
* @since 1.8
|
||||
*/
|
||||
public static class Server {
|
||||
public static final byte CUSTOM_PAYLOAD = -119, DISCONNECT = -118, ENCRYPTION_BEGIN = -117, SUCCESS = -116, SET_COMPRESSION = -115;
|
||||
private static void load() {
|
||||
insertPacketID(PacketTypeClasses.Login.Server.CUSTOM_PAYLOAD, Server.CUSTOM_PAYLOAD);
|
||||
insertPacketID(PacketTypeClasses.Login.Server.DISCONNECT, Server.DISCONNECT);
|
||||
insertPacketID(PacketTypeClasses.Login.Server.ENCRYPTION_BEGIN, Server.ENCRYPTION_BEGIN);
|
||||
insertPacketID(PacketTypeClasses.Login.Server.SUCCESS, Server.SUCCESS);
|
||||
insertPacketID(PacketTypeClasses.Login.Server.SET_COMPRESSION, Server.SET_COMPRESSION);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Play Packet IDs.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Play">https://wiki.vg/Protocol#Play</a>
|
||||
* @since 1.8
|
||||
*/
|
||||
public static class Play {
|
||||
/**
|
||||
* Server-bound (client-sided) Play Packet IDs.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Serverbound_4">https://wiki.vg/Protocol#Serverbound_4</a>
|
||||
* @since 1.8
|
||||
*/
|
||||
public static class Client {
|
||||
public static final byte TELEPORT_ACCEPT = -114,
|
||||
TILE_NBT_QUERY = -113, DIFFICULTY_CHANGE = -112, CHAT = -111, CLIENT_COMMAND = -110,
|
||||
SETTINGS = -109, TAB_COMPLETE = -108, TRANSACTION = -107, ENCHANT_ITEM = -106,
|
||||
WINDOW_CLICK = -105, CLOSE_WINDOW = -104, CUSTOM_PAYLOAD = -103, B_EDIT = -102,
|
||||
ENTITY_NBT_QUERY = -101, USE_ENTITY = -100, JIGSAW_GENERATE = -99, KEEP_ALIVE = -98,
|
||||
DIFFICULTY_LOCK = -97, POSITION = -96, POSITION_LOOK = -95, LOOK = -94,
|
||||
FLYING = -93, VEHICLE_MOVE = -92, BOAT_MOVE = -91, PICK_ITEM = -90,
|
||||
AUTO_RECIPE = -89, ABILITIES = -88, BLOCK_DIG = -87, ENTITY_ACTION = -86,
|
||||
STEER_VEHICLE = -85, RECIPE_DISPLAYED = -84, ITEM_NAME = -83, RESOURCE_PACK_STATUS = -82,
|
||||
ADVANCEMENTS = -81, TR_SEL = -80, BEACON = -79, HELD_ITEM_SLOT = -78,
|
||||
SET_COMMAND_BLOCK = -77, SET_COMMAND_MINECART = -76, SET_CREATIVE_SLOT = -75, SET_JIGSAW = -74,
|
||||
STRUCT = -73, UPDATE_SIGN = -72, ARM_ANIMATION = -71, SPECTATE = -70,
|
||||
USE_ITEM = -69, BLOCK_PLACE = -68;
|
||||
|
||||
private static void load() {
|
||||
insertPacketID(PacketTypeClasses.Play.Client.TELEPORT_ACCEPT, TELEPORT_ACCEPT);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.TILE_NBT_QUERY, TILE_NBT_QUERY);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.DIFFICULTY_CHANGE, DIFFICULTY_CHANGE);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.CHAT, CHAT);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.CLIENT_COMMAND, CLIENT_COMMAND);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.SETTINGS, SETTINGS);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.TAB_COMPLETE, TAB_COMPLETE);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.TRANSACTION, TRANSACTION);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.ENCHANT_ITEM, ENCHANT_ITEM);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.WINDOW_CLICK, WINDOW_CLICK);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.CLOSE_WINDOW, CLOSE_WINDOW);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.CUSTOM_PAYLOAD, CUSTOM_PAYLOAD);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.B_EDIT, B_EDIT);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.ENTITY_NBT_QUERY, ENTITY_NBT_QUERY);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.USE_ENTITY, USE_ENTITY);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.JIGSAW_GENERATE, JIGSAW_GENERATE);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.KEEP_ALIVE, KEEP_ALIVE);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.DIFFICULTY_LOCK, DIFFICULTY_LOCK);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.POSITION, POSITION);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.POSITION_LOOK, POSITION_LOOK);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.LOOK, LOOK);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.FLYING, FLYING);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.VEHICLE_MOVE, VEHICLE_MOVE);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.BOAT_MOVE, BOAT_MOVE);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.PICK_ITEM, PICK_ITEM);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.AUTO_RECIPE, AUTO_RECIPE);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.ABILITIES, ABILITIES);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.BLOCK_DIG, BLOCK_DIG);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.ENTITY_ACTION, ENTITY_ACTION);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.STEER_VEHICLE, STEER_VEHICLE);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.RECIPE_DISPLAYED, RECIPE_DISPLAYED);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.ITEM_NAME, ITEM_NAME);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.RESOURCE_PACK_STATUS, RESOURCE_PACK_STATUS);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.ADVANCEMENTS, ADVANCEMENTS);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.TR_SEL, TR_SEL);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.BEACON, BEACON);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.HELD_ITEM_SLOT, HELD_ITEM_SLOT);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.SET_COMMAND_BLOCK, SET_COMMAND_BLOCK);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.SET_COMMAND_MINECART, SET_COMMAND_MINECART);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.SET_CREATIVE_SLOT, SET_CREATIVE_SLOT);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.SET_JIGSAW, SET_JIGSAW);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.STRUCT, STRUCT);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.UPDATE_SIGN, UPDATE_SIGN);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.ARM_ANIMATION, ARM_ANIMATION);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.SPECTATE, SPECTATE);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.USE_ITEM, USE_ITEM);
|
||||
insertPacketID(PacketTypeClasses.Play.Client.BLOCK_PLACE, BLOCK_PLACE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Server-bound Play Packet Type utility.
|
||||
* Save a few lines of code by using this.
|
||||
*
|
||||
* @author retrooper
|
||||
* @since 1.8
|
||||
*/
|
||||
public static class Util {
|
||||
/**
|
||||
* Is the play packet a PacketPlayInFlying, PacketPlayInPosition, PacketPlayInPositionLook
|
||||
* or a PacketPlayInLook packet?
|
||||
*
|
||||
* @param packetID Play Packet ID.
|
||||
* @return Is the Packet ID an instance of the PacketPlayInFlying packet?
|
||||
*/
|
||||
public static boolean isInstanceOfFlying(final byte packetID) {
|
||||
return packetID == FLYING
|
||||
|| packetID == POSITION
|
||||
|| packetID == POSITION_LOOK
|
||||
|| packetID == LOOK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is this the packet where the client places a block?
|
||||
* On 1.7.10 - 1.8.8 the client sends a PacketPlayInBlockPlace packet when actually placing the block.
|
||||
* On 1.9 - now the client sends a PacketPlayInUseItem packet when placing the block and the
|
||||
* PacketPlayInBlockPlace has a different use.
|
||||
* This method is a nice utility supporting all these versions letting you know
|
||||
* if the client played a block.
|
||||
* The {@link io.github.retrooper.packetevents.packetwrappers.play.in.blockplace.WrappedPacketInBlockPlace} wrapper
|
||||
* only works on an actual block place.
|
||||
* Use this method before using the wrapper to support all minecraft versions.
|
||||
*
|
||||
* @param packetID Play Packet ID.
|
||||
* @return Has the client placed a block?
|
||||
*/
|
||||
public static boolean isBlockPlace(final byte packetID) {
|
||||
final ServerVersion version = PacketEvents.get().getServerUtils().getVersion();
|
||||
return version.isNewerThan(ServerVersion.v_1_8_8) ?
|
||||
packetID == PacketType.Play.Client.USE_ITEM
|
||||
: packetID == PacketType.Play.Client.BLOCK_PLACE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Client-bound (server-sided) Play Packet IDs.
|
||||
*
|
||||
* @author retrooper
|
||||
* @see <a href="https://wiki.vg/Protocol#Clientbound_4">https://wiki.vg/Protocol#Clientbound_4</a>
|
||||
* @since 1.8
|
||||
*/
|
||||
public static class Server {
|
||||
public static final byte SPAWN_ENTITY = -67, SPAWN_ENTITY_EXPERIENCE_ORB = -66, SPAWN_ENTITY_WEATHER = -65, SPAWN_ENTITY_LIVING = -64,
|
||||
SPAWN_ENTITY_PAINTING = -63, SPAWN_ENTITY_SPAWN = -62, ANIMATION = -61, STATISTIC = -60,
|
||||
BLOCK_BREAK = -59, BLOCK_BREAK_ANIMATION = -58, TILE_ENTITY_DATA = -57, BLOCK_ACTION = -56,
|
||||
BLOCK_CHANGE = -55, BOSS = -54, SERVER_DIFFICULTY = -53, CHAT = -52, MULTI_BLOCK_CHANGE = -51,
|
||||
TAB_COMPLETE = -50, COMMANDS = -49, TRANSACTION = -48, CLOSE_WINDOW = -47,
|
||||
WINDOW_ITEMS = -46, WINDOW_DATA = -45, SET_SLOT = -44, SET_COOLDOWN = -43,
|
||||
CUSTOM_PAYLOAD = -42, CUSTOM_SOUND_EFFECT = -41, KICK_DISCONNECT = -40, ENTITY_STATUS = -39,
|
||||
EXPLOSION = -38, UNLOAD_CHUNK = -37, GAME_STATE_CHANGE = -36, OPEN_WINDOW_HORSE = -35,
|
||||
KEEP_ALIVE = -34, MAP_CHUNK = -33, WORLD_EVENT = -32, WORLD_PARTICLES = -31,
|
||||
LIGHT_UPDATE = -30, LOGIN = -29, MAP = -28, OPEN_WINDOW_MERCHANT = -27,
|
||||
REL_ENTITY_MOVE = -26, REL_ENTITY_MOVE_LOOK = -25, ENTITY_LOOK = -24, ENTITY = -23,
|
||||
VEHICLE_MOVE = -22, OPEN_BOOK = -21, OPEN_WINDOW = -20, OPEN_SIGN_EDITOR = -19,
|
||||
AUTO_RECIPE = -18, ABILITIES = -17, COMBAT_EVENT = -16, PLAYER_INFO = -15,
|
||||
LOOK_AT = -14, POSITION = -13, RECIPES = -12, ENTITY_DESTROY = -11,
|
||||
REMOVE_ENTITY_EFFECT = -10, RESOURCE_PACK_SEND = -9, RESPAWN = -8, ENTITY_HEAD_ROTATION = -7,
|
||||
SELECT_ADVANCEMENT_TAB = -6, WORLD_BORDER = -5, CAMERA = -4, HELD_ITEM_SLOT = -3,
|
||||
VIEW_CENTRE = -2, VIEW_DISTANCE = -1, SCOREBOARD_DISPLAY_OBJECTIVE = 0, ENTITY_METADATA = 1,
|
||||
ATTACH_ENTITY = 2, ENTITY_VELOCITY = 3, ENTITY_EQUIPMENT = 4, EXPERIENCE = 5,
|
||||
UPDATE_HEALTH = 6, SCOREBOARD_OBJECTIVE = 7, MOUNT = 8, SCOREBOARD_TEAM = 9,
|
||||
SCOREBOARD_SCORE = 10, SPAWN_POSITION = 11, UPDATE_TIME = 12, TITLE = 13,
|
||||
ENTITY_SOUND = 14, NAMED_SOUND_EFFECT = 15, STOP_SOUND = 16, PLAYER_LIST_HEADER_FOOTER = 17,
|
||||
NBT_QUERY = 18, COLLECT = 19, ENTITY_TELEPORT = 20, ADVANCEMENTS = 21, UPDATE_ATTRIBUTES = 22,
|
||||
ENTITY_EFFECT = 23, RECIPE_UPDATE = 24, TAGS = 25, MAP_CHUNK_BULK = 26, NAMED_ENTITY_SPAWN = 27;
|
||||
|
||||
private static void load() {
|
||||
insertPacketID(PacketTypeClasses.Play.Server.SPAWN_ENTITY, SPAWN_ENTITY);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.SPAWN_ENTITY_EXPERIENCE_ORB, SPAWN_ENTITY_EXPERIENCE_ORB);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.SPAWN_ENTITY_WEATHER, SPAWN_ENTITY_WEATHER);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.SPAWN_ENTITY_LIVING, SPAWN_ENTITY_LIVING);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.SPAWN_ENTITY_PAINTING, SPAWN_ENTITY_PAINTING);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.SPAWN_ENTITY_SPAWN, SPAWN_ENTITY_SPAWN);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.ANIMATION, ANIMATION);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.STATISTIC, STATISTIC);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.BLOCK_BREAK, BLOCK_BREAK);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.BLOCK_BREAK_ANIMATION, BLOCK_BREAK_ANIMATION);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.TILE_ENTITY_DATA, TILE_ENTITY_DATA);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.BLOCK_ACTION, BLOCK_ACTION);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.BLOCK_CHANGE, BLOCK_CHANGE);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.BOSS, BOSS);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.SPAWN_ENTITY, SPAWN_ENTITY);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.SERVER_DIFFICULTY, SERVER_DIFFICULTY);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.CHAT, CHAT);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.MULTI_BLOCK_CHANGE, MULTI_BLOCK_CHANGE);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.TAB_COMPLETE, TAB_COMPLETE);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.COMMANDS, COMMANDS);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.TRANSACTION, TRANSACTION);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.CLOSE_WINDOW, CLOSE_WINDOW);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.WINDOW_ITEMS, WINDOW_ITEMS);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.WINDOW_DATA, WINDOW_DATA);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.SET_SLOT, SET_SLOT);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.SET_COOLDOWN, SET_COOLDOWN);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.CUSTOM_PAYLOAD, CUSTOM_PAYLOAD);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.CUSTOM_SOUND_EFFECT, CUSTOM_SOUND_EFFECT);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.KICK_DISCONNECT, KICK_DISCONNECT);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.ENTITY_STATUS, ENTITY_STATUS);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.EXPLOSION, EXPLOSION);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.UNLOAD_CHUNK, UNLOAD_CHUNK);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.GAME_STATE_CHANGE, GAME_STATE_CHANGE);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.OPEN_WINDOW_HORSE, OPEN_WINDOW_HORSE);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.KEEP_ALIVE, KEEP_ALIVE);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.MAP_CHUNK, MAP_CHUNK);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.WORLD_EVENT, WORLD_EVENT);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.WORLD_EVENT, SPAWN_ENTITY);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.WORLD_PARTICLES, WORLD_PARTICLES);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.LIGHT_UPDATE, LIGHT_UPDATE);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.LOGIN, LOGIN);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.MAP, MAP);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.OPEN_WINDOW_MERCHANT, OPEN_WINDOW_MERCHANT);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.REL_ENTITY_MOVE, REL_ENTITY_MOVE);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.REL_ENTITY_MOVE_LOOK, REL_ENTITY_MOVE_LOOK);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.ENTITY_LOOK, ENTITY_LOOK);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.ENTITY, ENTITY);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.VEHICLE_MOVE, VEHICLE_MOVE);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.OPEN_BOOK, OPEN_BOOK);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.OPEN_WINDOW, OPEN_WINDOW);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.OPEN_SIGN_EDITOR, OPEN_SIGN_EDITOR);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.AUTO_RECIPE, AUTO_RECIPE);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.ABILITIES, ABILITIES);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.COMBAT_EVENT, COMBAT_EVENT);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.PLAYER_INFO, PLAYER_INFO);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.LOOK_AT, LOOK_AT);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.POSITION, POSITION);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.RECIPES, RECIPES);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.ENTITY_DESTROY, ENTITY_DESTROY);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.REMOVE_ENTITY_EFFECT, REMOVE_ENTITY_EFFECT);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.RESOURCE_PACK_SEND, RESOURCE_PACK_SEND);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.RESPAWN, RESPAWN);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.ENTITY_HEAD_ROTATION, ENTITY_HEAD_ROTATION);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.SELECT_ADVANCEMENT_TAB, SELECT_ADVANCEMENT_TAB);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.WORLD_BORDER, WORLD_BORDER);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.CAMERA, CAMERA);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.HELD_ITEM_SLOT, HELD_ITEM_SLOT);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.VIEW_CENTRE, VIEW_CENTRE);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.VIEW_DISTANCE, VIEW_DISTANCE);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.SCOREBOARD_DISPLAY_OBJECTIVE, SCOREBOARD_DISPLAY_OBJECTIVE);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.ENTITY_METADATA, ENTITY_METADATA);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.ATTACH_ENTITY, ATTACH_ENTITY);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.ENTITY_VELOCITY, ENTITY_VELOCITY);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.ENTITY_EQUIPMENT, ENTITY_EQUIPMENT);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.EXPERIENCE, EXPERIENCE);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.UPDATE_HEALTH, UPDATE_HEALTH);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.SCOREBOARD_OBJECTIVE, SCOREBOARD_OBJECTIVE);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.MOUNT, MOUNT);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.SCOREBOARD_TEAM, SCOREBOARD_TEAM);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.SCOREBOARD_SCORE, SCOREBOARD_SCORE);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.SPAWN_POSITION, SPAWN_POSITION);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.UPDATE_TIME, UPDATE_TIME);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.TITLE, TITLE);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.ENTITY_SOUND, ENTITY_SOUND);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.NAMED_SOUND_EFFECT, NAMED_SOUND_EFFECT);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.STOP_SOUND, STOP_SOUND);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.PLAYER_LIST_HEADER_FOOTER, PLAYER_LIST_HEADER_FOOTER);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.NBT_QUERY, NBT_QUERY);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.COLLECT, COLLECT);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.ENTITY_TELEPORT, ENTITY_TELEPORT);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.ADVANCEMENTS, ADVANCEMENTS);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.UPDATE_ATTRIBUTES, UPDATE_ATTRIBUTES);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.ENTITY_EFFECT, ENTITY_EFFECT);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.RECIPE_UPDATE, RECIPE_UPDATE);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.TAGS, TAGS);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.MAP_CHUNK_BULK, MAP_CHUNK_BULK);
|
||||
insertPacketID(PacketTypeClasses.Play.Server.NAMED_ENTITY_SPAWN, NAMED_ENTITY_SPAWN);
|
||||
}
|
||||
|
||||
/**
|
||||
* Client-bound Play Packet Type utility.
|
||||
* Save a few lines of code by using this.
|
||||
*
|
||||
* @author retrooper
|
||||
* @since 1.8
|
||||
*/
|
||||
public static class Util {
|
||||
/**
|
||||
* Is the play packet a PacketPlayOutEntity, PacketPlayOutRelEntityMove, PacketPlayOutRelEntityMoveLook
|
||||
* or a PacketPlayOutEntityLook packet?
|
||||
*
|
||||
* @param packetID Play Packet ID.
|
||||
* @return Is the Packet ID an instance of the PacketPlayOutEntity packet?
|
||||
*/
|
||||
public static boolean isInstanceOfEntity(final byte packetID) {
|
||||
return packetID == ENTITY || packetID == REL_ENTITY_MOVE ||
|
||||
packetID == REL_ENTITY_MOVE_LOOK || packetID == ENTITY_LOOK;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,333 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packettype;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import io.github.retrooper.packetevents.utils.reflection.SubclassUtil;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerVersion;
|
||||
|
||||
public class PacketTypeClasses {
|
||||
public static void load() {
|
||||
//STATUS
|
||||
PacketTypeClasses.Status.Client.load();
|
||||
PacketTypeClasses.Status.Server.load();
|
||||
//HANDSHAKING
|
||||
PacketTypeClasses.Handshaking.Client.load();
|
||||
//LOGIN
|
||||
PacketTypeClasses.Login.Client.load();
|
||||
PacketTypeClasses.Login.Server.load();
|
||||
//PLAY
|
||||
PacketTypeClasses.Play.Client.load();
|
||||
PacketTypeClasses.Play.Server.load();
|
||||
}
|
||||
|
||||
public static class Status {
|
||||
public static class Client {
|
||||
public static Class<?> START, PING;
|
||||
|
||||
public static void load() {
|
||||
Client.START = NMSUtils.getNMSClassWithoutException("PacketStatusInStart");
|
||||
Client.PING = NMSUtils.getNMSClassWithoutException("PacketStatusInPing");
|
||||
}
|
||||
}
|
||||
|
||||
public static class Server {
|
||||
public static Class<?> PONG, SERVER_INFO;
|
||||
|
||||
public static void load() {
|
||||
Server.PONG = NMSUtils.getNMSClassWithoutException("PacketStatusOutPong");
|
||||
Server.SERVER_INFO = NMSUtils.getNMSClassWithoutException("PacketStatusOutServerInfo");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class Handshaking {
|
||||
public static class Client {
|
||||
public static Class<?> SET_PROTOCOL;
|
||||
|
||||
public static void load() {
|
||||
Handshaking.Client.SET_PROTOCOL = NMSUtils.getNMSClassWithoutException("PacketHandshakingInSetProtocol");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class Login {
|
||||
public static class Client {
|
||||
public static Class<?> CUSTOM_PAYLOAD, START, ENCRYPTION_BEGIN;
|
||||
|
||||
public static void load() {
|
||||
//In and Out custom payload login packets have been here since 1.13
|
||||
if (PacketEvents.get().getServerUtils().getVersion().isNewerThanOrEquals(ServerVersion.v_1_13)) {
|
||||
Client.CUSTOM_PAYLOAD = NMSUtils.getNMSClassWithoutException("PacketLoginInCustomPayload");
|
||||
}
|
||||
Client.START = NMSUtils.getNMSClassWithoutException("PacketLoginInStart");
|
||||
Client.ENCRYPTION_BEGIN = NMSUtils.getNMSClassWithoutException("PacketLoginInEncryptionBegin");
|
||||
}
|
||||
}
|
||||
|
||||
public static class Server {
|
||||
public static Class<?> CUSTOM_PAYLOAD, DISCONNECT, ENCRYPTION_BEGIN, SUCCESS, SET_COMPRESSION;
|
||||
|
||||
public static void load() {
|
||||
//In and Out custom payload login packets have been here since 1.13
|
||||
if (PacketEvents.get().getServerUtils().getVersion().isNewerThanOrEquals(ServerVersion.v_1_13)) {
|
||||
Server.CUSTOM_PAYLOAD = NMSUtils.getNMSClassWithoutException("PacketLoginOutCustomPayload");
|
||||
}
|
||||
Server.DISCONNECT = NMSUtils.getNMSClassWithoutException("PacketLoginOutDisconnect");
|
||||
Server.ENCRYPTION_BEGIN = NMSUtils.getNMSClassWithoutException("PacketLoginOutEncryptionBegin");
|
||||
Server.SUCCESS = NMSUtils.getNMSClassWithoutException("PacketLoginOutSuccess");
|
||||
if (PacketEvents.get().getServerUtils().getVersion().isNewerThan(ServerVersion.v_1_7_10)) {
|
||||
Server.SET_COMPRESSION = NMSUtils.getNMSClassWithoutException("PacketLoginOutSetCompression");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class Play {
|
||||
public static class Client {
|
||||
private static final String PREFIX = "PacketPlayIn";
|
||||
public static Class<?> FLYING, POSITION, POSITION_LOOK, LOOK, CLIENT_COMMAND,
|
||||
TRANSACTION, BLOCK_DIG, ENTITY_ACTION, USE_ENTITY,
|
||||
WINDOW_CLICK, STEER_VEHICLE, CUSTOM_PAYLOAD, ARM_ANIMATION,
|
||||
BLOCK_PLACE, USE_ITEM, ABILITIES, HELD_ITEM_SLOT,
|
||||
CLOSE_WINDOW, TAB_COMPLETE, CHAT, SET_CREATIVE_SLOT,
|
||||
KEEP_ALIVE, SETTINGS, ENCHANT_ITEM, TELEPORT_ACCEPT,
|
||||
TILE_NBT_QUERY, DIFFICULTY_CHANGE, B_EDIT, ENTITY_NBT_QUERY,
|
||||
JIGSAW_GENERATE, DIFFICULTY_LOCK, VEHICLE_MOVE, BOAT_MOVE, PICK_ITEM,
|
||||
AUTO_RECIPE, RECIPE_DISPLAYED, ITEM_NAME, RESOURCE_PACK_STATUS,
|
||||
ADVANCEMENTS, TR_SEL, BEACON, SET_COMMAND_BLOCK,
|
||||
SET_COMMAND_MINECART, SET_JIGSAW, STRUCT, UPDATE_SIGN, SPECTATE;
|
||||
|
||||
/**
|
||||
* Initiate all server-bound play packet classes.
|
||||
*/
|
||||
public static void load() {
|
||||
FLYING = NMSUtils.getNMSClassWithoutException(PREFIX + "Flying");
|
||||
try {
|
||||
POSITION = NMSUtils.getNMSClass(PREFIX + "Position");
|
||||
POSITION_LOOK = NMSUtils.getNMSClass(PREFIX + "PositionLook");
|
||||
LOOK = NMSUtils.getNMSClass(PREFIX + "Look");
|
||||
} catch (Exception e) {
|
||||
POSITION = SubclassUtil.getSubClass(FLYING, PREFIX + "Position");
|
||||
POSITION_LOOK = SubclassUtil.getSubClass(FLYING, PREFIX + "PositionLook");
|
||||
LOOK = SubclassUtil.getSubClass(FLYING, PREFIX + "Look");
|
||||
}
|
||||
|
||||
try {
|
||||
SETTINGS = NMSUtils.getNMSClass(PREFIX + "Settings");
|
||||
ENCHANT_ITEM = NMSUtils.getNMSClass(PREFIX + "EnchantItem");
|
||||
|
||||
CLIENT_COMMAND = NMSUtils.getNMSClass(PREFIX + "ClientCommand");
|
||||
TRANSACTION = NMSUtils.getNMSClass(PREFIX + "Transaction");
|
||||
BLOCK_DIG = NMSUtils.getNMSClass(PREFIX + "BlockDig");
|
||||
ENTITY_ACTION = NMSUtils.getNMSClass(PREFIX + "EntityAction");
|
||||
USE_ENTITY = NMSUtils.getNMSClass(PREFIX + "UseEntity");
|
||||
WINDOW_CLICK = NMSUtils.getNMSClass(PREFIX + "WindowClick");
|
||||
STEER_VEHICLE = NMSUtils.getNMSClass(PREFIX + "SteerVehicle");
|
||||
CUSTOM_PAYLOAD = NMSUtils.getNMSClass(PREFIX + "CustomPayload");
|
||||
ARM_ANIMATION = NMSUtils.getNMSClass(PREFIX + "ArmAnimation");
|
||||
ABILITIES = NMSUtils.getNMSClass(PREFIX + "Abilities");
|
||||
HELD_ITEM_SLOT = NMSUtils.getNMSClass(PREFIX + "HeldItemSlot");
|
||||
CLOSE_WINDOW = NMSUtils.getNMSClass(PREFIX + "CloseWindow");
|
||||
TAB_COMPLETE = NMSUtils.getNMSClass(PREFIX + "TabComplete");
|
||||
CHAT = NMSUtils.getNMSClass(PREFIX + "Chat");
|
||||
SET_CREATIVE_SLOT = NMSUtils.getNMSClass(PREFIX + "SetCreativeSlot");
|
||||
KEEP_ALIVE = NMSUtils.getNMSClass(PREFIX + "KeepAlive");
|
||||
UPDATE_SIGN = NMSUtils.getNMSClassWithoutException(PREFIX + "UpdateSign");
|
||||
|
||||
TELEPORT_ACCEPT = NMSUtils.getNMSClassWithoutException(PREFIX + "TeleportAccept");
|
||||
TILE_NBT_QUERY = NMSUtils.getNMSClassWithoutException(PREFIX + "TileNBTQuery");
|
||||
DIFFICULTY_CHANGE = NMSUtils.getNMSClassWithoutException(PREFIX + "DifficultyChange");
|
||||
B_EDIT = NMSUtils.getNMSClassWithoutException(PREFIX + "BEdit");
|
||||
ENTITY_NBT_QUERY = NMSUtils.getNMSClassWithoutException(PREFIX + "EntityNBTQuery");
|
||||
JIGSAW_GENERATE = NMSUtils.getNMSClassWithoutException(PREFIX + "JigsawGenerate");
|
||||
DIFFICULTY_LOCK = NMSUtils.getNMSClassWithoutException(PREFIX + "DifficultyLock");
|
||||
VEHICLE_MOVE = NMSUtils.getNMSClassWithoutException(PREFIX + "VehicleMove");
|
||||
BOAT_MOVE = NMSUtils.getNMSClassWithoutException(PREFIX + "BoatMove");
|
||||
PICK_ITEM = NMSUtils.getNMSClassWithoutException(PREFIX + "PickItem");
|
||||
AUTO_RECIPE = NMSUtils.getNMSClassWithoutException(PREFIX + "AutoRecipe");
|
||||
RECIPE_DISPLAYED = NMSUtils.getNMSClassWithoutException(PREFIX + "RecipeDisplayed");
|
||||
ITEM_NAME = NMSUtils.getNMSClassWithoutException(PREFIX + "ItemName");
|
||||
//1.8+
|
||||
RESOURCE_PACK_STATUS = NMSUtils.getNMSClassWithoutException(PREFIX + "ResourcePackStatus");
|
||||
|
||||
ADVANCEMENTS = NMSUtils.getNMSClassWithoutException(PREFIX + "Advancements");
|
||||
TR_SEL = NMSUtils.getNMSClassWithoutException(PREFIX + "TrSel");
|
||||
BEACON = NMSUtils.getNMSClassWithoutException(PREFIX + "Beacon");
|
||||
SET_COMMAND_BLOCK = NMSUtils.getNMSClassWithoutException(PREFIX + "SetCommandBlock");
|
||||
SET_COMMAND_MINECART = NMSUtils.getNMSClassWithoutException(PREFIX + "SetCommandMinecart");
|
||||
SET_JIGSAW = NMSUtils.getNMSClassWithoutException(PREFIX + "SetJigsaw");
|
||||
STRUCT = NMSUtils.getNMSClassWithoutException(PREFIX + "Struct");
|
||||
SPECTATE = NMSUtils.getNMSClassWithoutException(PREFIX + "Spectate");
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
try {
|
||||
BLOCK_PLACE = NMSUtils.getNMSClass(PREFIX + "BlockPlace");
|
||||
USE_ITEM = NMSUtils.getNMSClass(PREFIX + "UseItem");
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static class Server {
|
||||
private static final String s = "PacketPlayOut";
|
||||
public static Class<?> SPAWN_ENTITY, SPAWN_ENTITY_EXPERIENCE_ORB, SPAWN_ENTITY_WEATHER, SPAWN_ENTITY_LIVING,
|
||||
SPAWN_ENTITY_PAINTING, SPAWN_ENTITY_SPAWN, ANIMATION, STATISTIC,
|
||||
BLOCK_BREAK, BLOCK_BREAK_ANIMATION, TILE_ENTITY_DATA, BLOCK_ACTION,
|
||||
BLOCK_CHANGE, BOSS, SERVER_DIFFICULTY, CHAT, MULTI_BLOCK_CHANGE,
|
||||
TAB_COMPLETE, COMMANDS, TRANSACTION, CLOSE_WINDOW,
|
||||
WINDOW_ITEMS, WINDOW_DATA, SET_SLOT, SET_COOLDOWN,
|
||||
CUSTOM_PAYLOAD, CUSTOM_SOUND_EFFECT, KICK_DISCONNECT, ENTITY_STATUS,
|
||||
EXPLOSION, UNLOAD_CHUNK, GAME_STATE_CHANGE, OPEN_WINDOW_HORSE,
|
||||
KEEP_ALIVE, MAP_CHUNK, WORLD_EVENT, WORLD_PARTICLES,
|
||||
LIGHT_UPDATE, LOGIN, MAP, OPEN_WINDOW_MERCHANT,
|
||||
REL_ENTITY_MOVE, REL_ENTITY_MOVE_LOOK, ENTITY_LOOK, ENTITY,
|
||||
VEHICLE_MOVE, OPEN_BOOK, OPEN_WINDOW, OPEN_SIGN_EDITOR,
|
||||
AUTO_RECIPE, ABILITIES, COMBAT_EVENT, PLAYER_INFO,
|
||||
LOOK_AT, POSITION, RECIPES, ENTITY_DESTROY,
|
||||
REMOVE_ENTITY_EFFECT, RESOURCE_PACK_SEND, RESPAWN, ENTITY_HEAD_ROTATION,
|
||||
SELECT_ADVANCEMENT_TAB, WORLD_BORDER, CAMERA, HELD_ITEM_SLOT,
|
||||
VIEW_CENTRE, VIEW_DISTANCE, SCOREBOARD_DISPLAY_OBJECTIVE, ENTITY_METADATA,
|
||||
ATTACH_ENTITY, ENTITY_VELOCITY, ENTITY_EQUIPMENT, EXPERIENCE,
|
||||
UPDATE_HEALTH, SCOREBOARD_OBJECTIVE, MOUNT, SCOREBOARD_TEAM,
|
||||
SCOREBOARD_SCORE, SPAWN_POSITION, UPDATE_TIME, TITLE,
|
||||
ENTITY_SOUND, NAMED_SOUND_EFFECT, STOP_SOUND, PLAYER_LIST_HEADER_FOOTER,
|
||||
NBT_QUERY, COLLECT, ENTITY_TELEPORT, ADVANCEMENTS, UPDATE_ATTRIBUTES,
|
||||
ENTITY_EFFECT, RECIPE_UPDATE, TAGS, MAP_CHUNK_BULK, NAMED_ENTITY_SPAWN;
|
||||
|
||||
/**
|
||||
* Initiate all client-bound packet classes.
|
||||
*/
|
||||
public static void load() {
|
||||
SPAWN_ENTITY = NMSUtils.getNMSClassWithoutException(s + "SpawnEntity");
|
||||
SPAWN_ENTITY_EXPERIENCE_ORB = NMSUtils.getNMSClassWithoutException(s + "SpawnEntityExperienceOrb");
|
||||
SPAWN_ENTITY_WEATHER = NMSUtils.getNMSClassWithoutException(s + "SpawnEntityWeather");
|
||||
SPAWN_ENTITY_LIVING = NMSUtils.getNMSClassWithoutException(s + "SpawnEntityLiving");
|
||||
SPAWN_ENTITY_PAINTING = NMSUtils.getNMSClassWithoutException(s + "SpawnEntityPainting");
|
||||
SPAWN_ENTITY_SPAWN = NMSUtils.getNMSClassWithoutException(s + "SpawnEntitySpawn");
|
||||
ANIMATION = NMSUtils.getNMSClassWithoutException(s + "Animation");
|
||||
STATISTIC = NMSUtils.getNMSClassWithoutException(s + "Statistic");
|
||||
BLOCK_BREAK = NMSUtils.getNMSClassWithoutException(s + "BlockBreak");
|
||||
BLOCK_BREAK_ANIMATION = NMSUtils.getNMSClassWithoutException(s + "BlockBreakAnimation");
|
||||
TILE_ENTITY_DATA = NMSUtils.getNMSClassWithoutException(s + "TileEntityData");
|
||||
BLOCK_ACTION = NMSUtils.getNMSClassWithoutException(s + "BlockAction");
|
||||
BLOCK_CHANGE = NMSUtils.getNMSClassWithoutException(s + "BlockChange");
|
||||
BOSS = NMSUtils.getNMSClassWithoutException(s + "Boss");
|
||||
SERVER_DIFFICULTY = NMSUtils.getNMSClassWithoutException(s + "ServerDifficulty");
|
||||
CHAT = NMSUtils.getNMSClassWithoutException(s + "Chat");
|
||||
MULTI_BLOCK_CHANGE = NMSUtils.getNMSClassWithoutException(s + "MultiBlockChange");
|
||||
TAB_COMPLETE = NMSUtils.getNMSClassWithoutException(s + "TabComplete");
|
||||
COMMANDS = NMSUtils.getNMSClassWithoutException(s + "Commands");
|
||||
TRANSACTION = NMSUtils.getNMSClassWithoutException(s + "Transaction");
|
||||
CLOSE_WINDOW = NMSUtils.getNMSClassWithoutException(s + "CloseWindow");
|
||||
WINDOW_ITEMS = NMSUtils.getNMSClassWithoutException(s + "WindowItems");
|
||||
WINDOW_DATA = NMSUtils.getNMSClassWithoutException(s + "WindowData");
|
||||
SET_SLOT = NMSUtils.getNMSClassWithoutException(s + "SetSlot");
|
||||
SET_COOLDOWN = NMSUtils.getNMSClassWithoutException(s + "SetCooldown");
|
||||
CUSTOM_PAYLOAD = NMSUtils.getNMSClassWithoutException(s + "CustomPayload");
|
||||
CUSTOM_SOUND_EFFECT = NMSUtils.getNMSClassWithoutException(s + "CustomSoundEffect");
|
||||
KICK_DISCONNECT = NMSUtils.getNMSClassWithoutException(s + "KickDisconnect");
|
||||
ENTITY_STATUS = NMSUtils.getNMSClassWithoutException(s + "EntityStatus");
|
||||
EXPLOSION = NMSUtils.getNMSClassWithoutException(s + "Explosion");
|
||||
UNLOAD_CHUNK = NMSUtils.getNMSClassWithoutException(s + "UnloadChunk");
|
||||
GAME_STATE_CHANGE = NMSUtils.getNMSClassWithoutException(s + "GameStateChange");
|
||||
OPEN_WINDOW_HORSE = NMSUtils.getNMSClassWithoutException(s + "OpenWindowHorse");
|
||||
KEEP_ALIVE = NMSUtils.getNMSClassWithoutException(s + "KeepAlive");
|
||||
MAP_CHUNK = NMSUtils.getNMSClassWithoutException(s + "MapChunk");
|
||||
WORLD_EVENT = NMSUtils.getNMSClassWithoutException(s + "WorldEvent");
|
||||
WORLD_PARTICLES = NMSUtils.getNMSClassWithoutException(s + "WorldParticles");
|
||||
LIGHT_UPDATE = NMSUtils.getNMSClassWithoutException(s + "LightUpdate");
|
||||
LOGIN = NMSUtils.getNMSClassWithoutException(s + "Login");
|
||||
MAP = NMSUtils.getNMSClassWithoutException(s + "Map");
|
||||
OPEN_WINDOW_MERCHANT = NMSUtils.getNMSClassWithoutException(s + "OpenWindowMerchant");
|
||||
ENTITY = NMSUtils.getNMSClassWithoutException(s + "Entity");
|
||||
REL_ENTITY_MOVE = SubclassUtil.getSubClass(ENTITY, s + "RelEntityMove");
|
||||
REL_ENTITY_MOVE_LOOK = SubclassUtil.getSubClass(ENTITY, s + "RelEntityMoveLook");
|
||||
ENTITY_LOOK = SubclassUtil.getSubClass(ENTITY, s + "EntityLook");
|
||||
if (REL_ENTITY_MOVE == null) {
|
||||
//is not a subclass and should be accessed normally
|
||||
REL_ENTITY_MOVE = NMSUtils.getNMSClassWithoutException(s + "RelEntityMove");
|
||||
REL_ENTITY_MOVE_LOOK = NMSUtils.getNMSClassWithoutException(s + "RelEntityMoveLook");
|
||||
ENTITY_LOOK = NMSUtils.getNMSClassWithoutException(s + "RelEntityLook");
|
||||
}
|
||||
VEHICLE_MOVE = NMSUtils.getNMSClassWithoutException(s + "VehicleMove");
|
||||
OPEN_BOOK = NMSUtils.getNMSClassWithoutException(s + "OpenBook");
|
||||
OPEN_WINDOW = NMSUtils.getNMSClassWithoutException(s + "OpenWindow");
|
||||
OPEN_SIGN_EDITOR = NMSUtils.getNMSClassWithoutException(s + "OpenSignEditor");
|
||||
AUTO_RECIPE = NMSUtils.getNMSClassWithoutException(s + "AutoRecipe");
|
||||
ABILITIES = NMSUtils.getNMSClassWithoutException(s + "Abilities");
|
||||
COMBAT_EVENT = NMSUtils.getNMSClassWithoutException(s + "CombatEvent");
|
||||
PLAYER_INFO = NMSUtils.getNMSClassWithoutException(s + "PlayerInfo");
|
||||
LOOK_AT = NMSUtils.getNMSClassWithoutException(s + "LookAt");
|
||||
POSITION = NMSUtils.getNMSClassWithoutException(s + "Position");
|
||||
RECIPES = NMSUtils.getNMSClassWithoutException(s + "Recipes");
|
||||
ENTITY_DESTROY = NMSUtils.getNMSClassWithoutException(s + "EntityDestroy");
|
||||
REMOVE_ENTITY_EFFECT = NMSUtils.getNMSClassWithoutException(s + "RemoveEntityEffect");
|
||||
RESOURCE_PACK_SEND = NMSUtils.getNMSClassWithoutException(s + "ResourcePackSend");
|
||||
RESPAWN = NMSUtils.getNMSClassWithoutException(s + "Respawn");
|
||||
ENTITY_HEAD_ROTATION = NMSUtils.getNMSClassWithoutException(s + "EntityHeadRotation");
|
||||
SELECT_ADVANCEMENT_TAB = NMSUtils.getNMSClassWithoutException(s + "SelectAdvancementTab");
|
||||
WORLD_BORDER = NMSUtils.getNMSClassWithoutException(s + "WorldBorder");
|
||||
CAMERA = NMSUtils.getNMSClassWithoutException(s + "Camera");
|
||||
HELD_ITEM_SLOT = NMSUtils.getNMSClassWithoutException(s + "HeldItemSlot");
|
||||
VIEW_CENTRE = NMSUtils.getNMSClassWithoutException(s + "ViewCentre");
|
||||
VIEW_DISTANCE = NMSUtils.getNMSClassWithoutException(s + "ViewDistance");
|
||||
SCOREBOARD_DISPLAY_OBJECTIVE = NMSUtils.getNMSClassWithoutException(s + "ScoreboardDisplayObjective");
|
||||
ENTITY_METADATA = NMSUtils.getNMSClassWithoutException(s + "EntityMetadata");
|
||||
ATTACH_ENTITY = NMSUtils.getNMSClassWithoutException(s + "AttachEntity");
|
||||
ENTITY_VELOCITY = NMSUtils.getNMSClassWithoutException(s + "EntityVelocity");
|
||||
ENTITY_EQUIPMENT = NMSUtils.getNMSClassWithoutException(s + "EntityEquipment");
|
||||
EXPERIENCE = NMSUtils.getNMSClassWithoutException(s + "Experience");
|
||||
UPDATE_HEALTH = NMSUtils.getNMSClassWithoutException(s + "UpdateHealth");
|
||||
SCOREBOARD_OBJECTIVE = NMSUtils.getNMSClassWithoutException(s + "ScoreboardObjective");
|
||||
MOUNT = NMSUtils.getNMSClassWithoutException(s + "Mount");
|
||||
SCOREBOARD_TEAM = NMSUtils.getNMSClassWithoutException(s + "ScoreboardTeam");
|
||||
SCOREBOARD_SCORE = NMSUtils.getNMSClassWithoutException(s + "ScoreboardScore");
|
||||
SPAWN_POSITION = NMSUtils.getNMSClassWithoutException(s + "SpawnPosition");
|
||||
UPDATE_TIME = NMSUtils.getNMSClassWithoutException(s + "UpdateTime");
|
||||
TITLE = NMSUtils.getNMSClassWithoutException(s + "Title");
|
||||
ENTITY_SOUND = NMSUtils.getNMSClassWithoutException(s + "EntitySound");
|
||||
NAMED_SOUND_EFFECT = NMSUtils.getNMSClassWithoutException(s + "NamedSoundEffect");
|
||||
STOP_SOUND = NMSUtils.getNMSClassWithoutException(s + "StopSound");
|
||||
PLAYER_LIST_HEADER_FOOTER = NMSUtils.getNMSClassWithoutException(s + "PlayerListHeaderFooter");
|
||||
NBT_QUERY = NMSUtils.getNMSClassWithoutException(s + "NBTQuery");
|
||||
COLLECT = NMSUtils.getNMSClassWithoutException(s + "Collect");
|
||||
ENTITY_TELEPORT = NMSUtils.getNMSClassWithoutException(s + "EntityTeleport");
|
||||
ADVANCEMENTS = NMSUtils.getNMSClassWithoutException(s + "Advancements");
|
||||
UPDATE_ATTRIBUTES = NMSUtils.getNMSClassWithoutException(s + "UpdateAttributes");
|
||||
ENTITY_EFFECT = NMSUtils.getNMSClassWithoutException(s + "EntityEffect");
|
||||
RECIPE_UPDATE = NMSUtils.getNMSClassWithoutException(s + "RecipeUpdate");
|
||||
TAGS = NMSUtils.getNMSClassWithoutException(s + "Tags");
|
||||
MAP_CHUNK_BULK = NMSUtils.getNMSClassWithoutException(s + "MapChunkBulk");
|
||||
NAMED_ENTITY_SPAWN = NMSUtils.getNMSClassWithoutException(s + "NamedEntitySpawn");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers;
|
||||
|
||||
import io.github.retrooper.packetevents.utils.reflection.ClassUtil;
|
||||
|
||||
public class NMSPacket {
|
||||
private final Object rawNMSPacket;
|
||||
|
||||
public NMSPacket(Object rawNMSPacket) {
|
||||
this.rawNMSPacket = rawNMSPacket;
|
||||
}
|
||||
|
||||
public Object getRawNMSPacket() {
|
||||
return rawNMSPacket;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return ClassUtil.getClassSimpleName(rawNMSPacket.getClass());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,455 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.exceptions.WrapperFieldNotFoundException;
|
||||
import io.github.retrooper.packetevents.exceptions.WrapperUnsupportedUsageException;
|
||||
import io.github.retrooper.packetevents.packettype.PacketTypeClasses;
|
||||
import io.github.retrooper.packetevents.packetwrappers.api.WrapperPacketReader;
|
||||
import io.github.retrooper.packetevents.packetwrappers.api.WrapperPacketWriter;
|
||||
import io.github.retrooper.packetevents.utils.reflection.ClassUtil;
|
||||
import io.github.retrooper.packetevents.utils.reflection.Reflection;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerVersion;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class WrappedPacket implements WrapperPacketReader, WrapperPacketWriter {
|
||||
|
||||
private static final Map<Class<? extends WrappedPacket>, Boolean> LOADED_WRAPPERS = new ConcurrentHashMap<>();
|
||||
private static final Map<Class<?>, Map<Class<?>, Field[]>> FIELD_CACHE = new ConcurrentHashMap<>();
|
||||
private static final Field[] EMPTY_FIELD_ARRAY = new Field[0];
|
||||
public static ServerVersion version;
|
||||
private final Class<?> packetClass;
|
||||
protected final NMSPacket packet;
|
||||
|
||||
public WrappedPacket() {
|
||||
packet = null;
|
||||
packetClass = null;
|
||||
load0();
|
||||
}
|
||||
|
||||
public WrappedPacket(final NMSPacket packet) {
|
||||
this(packet, packet.getRawNMSPacket().getClass());
|
||||
}
|
||||
|
||||
public WrappedPacket(final NMSPacket packet, Class<?> packetClass) {
|
||||
if (packetClass.getSuperclass().equals(PacketTypeClasses.Play.Client.FLYING)) {
|
||||
packetClass = PacketTypeClasses.Play.Client.FLYING;
|
||||
} else if (packetClass.getSuperclass().equals(PacketTypeClasses.Play.Server.ENTITY)) {
|
||||
packetClass = PacketTypeClasses.Play.Server.ENTITY;
|
||||
}
|
||||
this.packetClass = packetClass;
|
||||
this.packet = packet;
|
||||
load0();
|
||||
}
|
||||
|
||||
private void load0() {
|
||||
if (!isSupported()) {
|
||||
throw new WrapperUnsupportedUsageException(getClass());
|
||||
}
|
||||
final Class<? extends WrappedPacket> clazz = getClass();
|
||||
if (!LOADED_WRAPPERS.containsKey(clazz)) {
|
||||
try {
|
||||
load();
|
||||
} catch (Exception ex) {
|
||||
String wrapperName = ClassUtil.getClassSimpleName(getClass());
|
||||
PacketEvents.get().getPlugin().getLogger()
|
||||
.log(Level.SEVERE, "PacketEvents found an exception while loading the " + wrapperName + " packet wrapper. Please report this bug! Tell us about your server version, spigot and code(of you using the wrapper)", ex);
|
||||
LOADED_WRAPPERS.put(clazz, false);
|
||||
}
|
||||
LOADED_WRAPPERS.put(clazz, true);
|
||||
}
|
||||
}
|
||||
|
||||
protected void load() {
|
||||
|
||||
}
|
||||
|
||||
protected boolean hasLoaded() {
|
||||
return LOADED_WRAPPERS.getOrDefault(getClass(), false);
|
||||
}
|
||||
|
||||
protected void throwUnsupportedOperation(Enum<?> enumConst) throws UnsupportedOperationException {
|
||||
Class<?> enumConstClass = enumConst.getClass();
|
||||
Field field = null;
|
||||
try {
|
||||
field = enumConstClass.getField(enumConst.name());
|
||||
} catch (NoSuchFieldException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (field.isAnnotationPresent(SupportedVersions.class)) {
|
||||
SupportedVersions supportedVersions = field.getAnnotation(SupportedVersions.class);
|
||||
List<ServerVersion> versionList = parseSupportedVersionsAnnotation(supportedVersions);
|
||||
String supportedVersionsMsg = Arrays.toString(versionList.toArray(new ServerVersion[0]));
|
||||
throw new UnsupportedOperationException("PacketEvents failed to use the " + enumConst.name() + " enum constant in the " + enumConstClass.getSimpleName() + " enum. This enum constant is not supported on your server version. (" + PacketEvents.get().getServerUtils().getVersion() + ")\n This enum constant is only supported on these server versions: " + supportedVersionsMsg);
|
||||
} else {
|
||||
throw new UnsupportedOperationException("PacketEvents failed to use the " + enumConst.name() + " enum constant in the " + enumConstClass.getSimpleName() + " enum. This enum constant is not supported on your server version. (" + PacketEvents.get().getServerUtils().getVersion() + ")\n Failed to find out what server versions this enum constant is supported on.");
|
||||
}
|
||||
}
|
||||
|
||||
protected void throwUnsupportedOperation() throws UnsupportedOperationException {
|
||||
final String currentMethodName = "throwUnsupportedOperation";
|
||||
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
|
||||
int stackTraceElementIndex = 2;
|
||||
for (int i = 0; i < stackTraceElements.length; i++) {
|
||||
StackTraceElement element = stackTraceElements[i];
|
||||
if (element.getMethodName().equals(currentMethodName)) {
|
||||
stackTraceElementIndex = i + 1; //It is the next method
|
||||
break;
|
||||
}
|
||||
}
|
||||
StackTraceElement stackTraceElement = stackTraceElements[stackTraceElementIndex];
|
||||
String methodName = stackTraceElement.getMethodName();
|
||||
List<Method> possibleMethods = Reflection.getMethods(getClass(), methodName, null);
|
||||
Method method = null;
|
||||
for (Method m : possibleMethods) {
|
||||
if (m.isAnnotationPresent(SupportedVersions.class)) {
|
||||
method = m;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (method == null) {
|
||||
throw new UnsupportedOperationException("PacketEvents failed to access your requested field. This field is not supported on your server version. Failed to lookup the server versions this field supports...");
|
||||
} else {
|
||||
SupportedVersions supportedVersions = method.getAnnotation(SupportedVersions.class);
|
||||
List<ServerVersion> versionList = parseSupportedVersionsAnnotation(supportedVersions);
|
||||
|
||||
String supportedVersionsMsg = Arrays.toString(versionList.toArray(new ServerVersion[0]));
|
||||
throw new UnsupportedOperationException("PacketEvents failed to access your requested field. This field is not supported on your server version. (" + PacketEvents.get().getServerUtils().getVersion() + ")\n This field is only supported on these server versions: " + supportedVersionsMsg);
|
||||
}
|
||||
}
|
||||
|
||||
private List<ServerVersion> parseSupportedVersionsAnnotation(SupportedVersions supportedVersions) {
|
||||
List<ServerVersion> versionList = new ArrayList<>();
|
||||
for (int i = 0; i < supportedVersions.ranges().length; i += 2) {
|
||||
ServerVersion first = supportedVersions.ranges()[i];
|
||||
ServerVersion last = supportedVersions.ranges()[i + 1];
|
||||
if (first == last) {
|
||||
versionList.add(first);
|
||||
continue;
|
||||
} else if (first == ServerVersion.ERROR) {
|
||||
first = ServerVersion.getOldest();
|
||||
} else if (last == ServerVersion.ERROR) {
|
||||
last = ServerVersion.getLatest();
|
||||
}
|
||||
versionList.addAll(Arrays.asList(ServerVersion.values()).subList(first.ordinal(), last.ordinal() + 1));
|
||||
}
|
||||
versionList.remove(ServerVersion.ERROR);
|
||||
return versionList;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean readBoolean(int index) {
|
||||
return read(index, boolean.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte readByte(int index) {
|
||||
return read(index, byte.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public short readShort(int index) {
|
||||
return read(index, short.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int readInt(int index) {
|
||||
return read(index, int.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long readLong(int index) {
|
||||
return read(index, long.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float readFloat(int index) {
|
||||
return read(index, float.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double readDouble(int index) {
|
||||
return read(index, double.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean[] readBooleanArray(int index) {
|
||||
return read(index, boolean[].class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] readByteArray(int index) {
|
||||
return read(index, byte[].class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public short[] readShortArray(int index) {
|
||||
return read(index, short[].class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] readIntArray(int index) {
|
||||
return read(index, int[].class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long[] readLongArray(int index) {
|
||||
return read(index, long[].class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public float[] readFloatArray(int index) {
|
||||
return read(index, float[].class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double[] readDoubleArray(int index) {
|
||||
return read(index, double[].class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String[] readStringArray(int index) {
|
||||
return read(index, String[].class); // JavaImpact: Can we be sure that returning the original array is okay? retrooper: Yes
|
||||
}
|
||||
|
||||
@Override
|
||||
public String readString(int index) {
|
||||
return read(index, String.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object readAnyObject(int index) {
|
||||
try {
|
||||
Field f = packetClass.getDeclaredFields()[index];
|
||||
if (!f.isAccessible()) {
|
||||
f.setAccessible(true);
|
||||
}
|
||||
try {
|
||||
return f.get(packet.getRawNMSPacket());
|
||||
} catch (IllegalAccessException | NullPointerException | ArrayIndexOutOfBoundsException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} catch (ArrayIndexOutOfBoundsException e) {
|
||||
throw new WrapperFieldNotFoundException("PacketEvents failed to find any field indexed " + index + " in the " + ClassUtil.getClassSimpleName(packetClass) + " class!");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T readObject(int index, Class<? extends T> type) {
|
||||
return read(index, type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Enum<?> readEnumConstant(int index, Class<? extends Enum<?>> type) {
|
||||
return read(index, type);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public <T> T read(int index, Class<? extends T> type) {
|
||||
Field field = getField(type, index);
|
||||
try {
|
||||
return (T) field.get(packet.getRawNMSPacket());
|
||||
} catch (IllegalAccessException | NullPointerException | ArrayIndexOutOfBoundsException e) {
|
||||
throw new WrapperFieldNotFoundException(packetClass, type, index);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeBoolean(int index, boolean value) {
|
||||
write(boolean.class, index, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeByte(int index, byte value) {
|
||||
write(byte.class, index, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeShort(int index, short value) {
|
||||
write(short.class, index, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeInt(int index, int value) {
|
||||
write(int.class, index, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeLong(int index, long value) {
|
||||
write(long.class, index, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeFloat(int index, float value) {
|
||||
write(float.class, index, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeDouble(int index, double value) {
|
||||
write(double.class, index, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeString(int index, String value) {
|
||||
write(String.class, index, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeObject(int index, Object value) {
|
||||
write(value.getClass(), index, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeBooleanArray(int index, boolean[] array) {
|
||||
write(boolean[].class, index, array);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeByteArray(int index, byte[] value) {
|
||||
write(byte[].class, index, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeShortArray(int index, short[] value) {
|
||||
write(short[].class, index, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeIntArray(int index, int[] value) {
|
||||
write(int[].class, index, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeLongArray(int index, long[] value) {
|
||||
write(long[].class, index, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeFloatArray(int index, float[] value) {
|
||||
write(float[].class, index, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeDoubleArray(int index, double[] value) {
|
||||
write(double[].class, index, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeStringArray(int index, String[] value) {
|
||||
write(String[].class, index, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeAnyObject(int index, Object value) {
|
||||
try {
|
||||
Field f = packetClass.getDeclaredFields()[index];
|
||||
f.set(packet.getRawNMSPacket(), value);
|
||||
} catch (Exception e) {
|
||||
throw new WrapperFieldNotFoundException("PacketEvents failed to find any field indexed " + index + " in the " + ClassUtil.getClassSimpleName(packetClass) + " class!");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeEnumConstant(int index, Enum<?> enumConstant) {
|
||||
write(enumConstant.getClass(), index, enumConstant);
|
||||
}
|
||||
|
||||
public void write(Class<?> type, int index, Object value) throws WrapperFieldNotFoundException {
|
||||
Field field = getField(type, index);
|
||||
//Reflection.getFieldWithoutFinalModifier(field);
|
||||
if (field == null) {
|
||||
throw new WrapperFieldNotFoundException(packetClass, type, index);
|
||||
}
|
||||
try {
|
||||
field.set(packet.getRawNMSPacket(), value);
|
||||
} catch (IllegalAccessException | NullPointerException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private Field getField(Class<?> type, int index) {
|
||||
Map<Class<?>, Field[]> cached = FIELD_CACHE.computeIfAbsent(packetClass, k -> new ConcurrentHashMap<>());
|
||||
Field[] fields = cached.computeIfAbsent(type, typeClass -> getFields(typeClass, packetClass.getDeclaredFields()));
|
||||
if (fields.length >= index + 1) {
|
||||
return fields[index];
|
||||
} else {
|
||||
throw new WrapperFieldNotFoundException(packetClass, type, index);
|
||||
}
|
||||
}
|
||||
|
||||
private Field[] getFields(Class<?> type, Field[] fields) {
|
||||
List<Field> ret = new ArrayList<>();
|
||||
for (Field field : fields) {
|
||||
if (field.getType().equals(type)) {
|
||||
if (!field.isAccessible()) {
|
||||
field.setAccessible(true);
|
||||
}
|
||||
ret.add(field);
|
||||
}
|
||||
}
|
||||
return ret.toArray(EMPTY_FIELD_ARRAY);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Does the local server version support reading at-least one field with this packet wrapper?
|
||||
* If it does, we can label this wrapper to be supported on the local server version.
|
||||
* One example where it would not be supported would be if the packet the wrapper is wrapping doesn't even exist on the local server version.
|
||||
*
|
||||
* @return Is the wrapper supported on the local server version?
|
||||
*/
|
||||
public boolean isSupported() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* If a method in a wrapper is annotated with this, it means it isn't supported on all server versions.
|
||||
* It not being supported by all server versions can lead to exceptions. Make sure you always decompile a wrapper getter before using it.
|
||||
* This annotation will specify what versions are supported.
|
||||
*
|
||||
* @author retrooper
|
||||
* @since 1.8
|
||||
*/
|
||||
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface SupportedVersions {
|
||||
ServerVersion[] ranges() default {};
|
||||
}
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.api;
|
||||
|
||||
/**
|
||||
* This interface indicates that a packet wrapper supports being sent to a client.
|
||||
*/
|
||||
public interface SendableWrapper {
|
||||
Object asNMSPacket();
|
||||
}
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.api;
|
||||
|
||||
public interface WrapperPacketReader {
|
||||
|
||||
boolean readBoolean(int index);
|
||||
|
||||
byte readByte(int index);
|
||||
|
||||
short readShort(int index);
|
||||
|
||||
int readInt(int index);
|
||||
|
||||
long readLong(int index);
|
||||
|
||||
float readFloat(int index);
|
||||
|
||||
double readDouble(int index);
|
||||
|
||||
boolean[] readBooleanArray(int index);
|
||||
|
||||
byte[] readByteArray(int index);
|
||||
|
||||
short[] readShortArray(int index);
|
||||
|
||||
int[] readIntArray(int index);
|
||||
|
||||
long[] readLongArray(int index);
|
||||
|
||||
float[] readFloatArray(int index);
|
||||
|
||||
double[] readDoubleArray(int index);
|
||||
|
||||
String[] readStringArray(int index);
|
||||
|
||||
String readString(int index);
|
||||
|
||||
<T> T readObject(int index, Class<? extends T> type);
|
||||
|
||||
Enum<?> readEnumConstant(int index, Class<? extends Enum<?>> type);
|
||||
|
||||
Object readAnyObject(int index);
|
||||
}
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.api;
|
||||
|
||||
public interface WrapperPacketWriter {
|
||||
void writeBoolean(int index, boolean value);
|
||||
|
||||
void writeByte(int index, byte value);
|
||||
|
||||
void writeShort(int index, short value);
|
||||
|
||||
void writeInt(int index, int value);
|
||||
|
||||
void writeLong(int index, long value);
|
||||
|
||||
void writeFloat(int index, float value);
|
||||
|
||||
void writeDouble(int index, double value);
|
||||
|
||||
void writeString(int index, String value);
|
||||
|
||||
//ARRAYS
|
||||
void writeBooleanArray(int index, boolean[] array);
|
||||
|
||||
void writeByteArray(int index, byte[] value);
|
||||
|
||||
void writeShortArray(int index, short[] value);
|
||||
|
||||
void writeIntArray(int index, int[] value);
|
||||
|
||||
void writeLongArray(int index, long[] value);
|
||||
|
||||
void writeFloatArray(int index, float[] value);
|
||||
|
||||
void writeDoubleArray(int index, double[] value);
|
||||
|
||||
void writeStringArray(int index, String[] value);
|
||||
|
||||
void writeObject(int index, Object object);
|
||||
|
||||
void writeAnyObject(int index, Object value);
|
||||
|
||||
void writeEnumConstant(int index, Enum<?> enumConstant);
|
||||
}
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
package io.github.retrooper.packetevents.packetwrappers.api.helper;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public abstract class WrappedPacketEntityAbstraction extends WrappedPacket {
|
||||
private final int entityIDFieldIndex;
|
||||
protected Entity entity;
|
||||
protected int entityID = -1;
|
||||
|
||||
public WrappedPacketEntityAbstraction(NMSPacket packet, int entityIDFieldIndex) {
|
||||
super(packet);
|
||||
this.entityIDFieldIndex = entityIDFieldIndex;
|
||||
}
|
||||
|
||||
public WrappedPacketEntityAbstraction(NMSPacket packet) {
|
||||
super(packet);
|
||||
this.entityIDFieldIndex = 0;
|
||||
}
|
||||
|
||||
public WrappedPacketEntityAbstraction(int entityIDFieldIndex) {
|
||||
super();
|
||||
this.entityIDFieldIndex = entityIDFieldIndex;
|
||||
}
|
||||
|
||||
public WrappedPacketEntityAbstraction() {
|
||||
super();
|
||||
this.entityIDFieldIndex = 0;
|
||||
}
|
||||
|
||||
public int getEntityId() {
|
||||
if (entityID != -1 || packet == null) {
|
||||
return entityID;
|
||||
}
|
||||
return entityID = readInt(entityIDFieldIndex);
|
||||
}
|
||||
|
||||
public void setEntityId(int entityID) {
|
||||
if (packet != null) {
|
||||
writeInt(entityIDFieldIndex, this.entityID = entityID);
|
||||
} else {
|
||||
this.entityID = entityID;
|
||||
}
|
||||
this.entity = null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Entity getEntity(@Nullable World world) {
|
||||
if (entity != null) {
|
||||
return entity;
|
||||
}
|
||||
return entity = NMSUtils.getEntityById(world, getEntityId());
|
||||
}
|
||||
|
||||
public Entity getEntity() {
|
||||
return getEntity(null);
|
||||
}
|
||||
|
||||
public void setEntity(@NotNull Entity entity) {
|
||||
setEntityId(entity.getEntityId());
|
||||
this.entity = entity;
|
||||
}
|
||||
}
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.handshaking.setprotocol;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
|
||||
public class WrappedPacketHandshakingInSetProtocol extends WrappedPacket {
|
||||
|
||||
public WrappedPacketHandshakingInSetProtocol(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public int getProtocolVersion() {
|
||||
return readInt(0);
|
||||
}
|
||||
|
||||
public void setProtocolVersion(int protocolVersion) {
|
||||
writeInt(0, protocolVersion);
|
||||
}
|
||||
|
||||
public int getPort() {
|
||||
return readInt(1);
|
||||
}
|
||||
|
||||
public void setPort(int port) {
|
||||
writeInt(1, port);
|
||||
}
|
||||
|
||||
public String getHostName() {
|
||||
return readString(0);
|
||||
}
|
||||
|
||||
public void setHostName(String hostName) {
|
||||
writeString(0, hostName);
|
||||
}
|
||||
}
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.login.in.custompayload;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerVersion;
|
||||
|
||||
public class WrappedPacketLoginInCustomPayload extends WrappedPacket {
|
||||
public WrappedPacketLoginInCustomPayload(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public int getMessageId() {
|
||||
return readInt(0);
|
||||
}
|
||||
|
||||
public void setMessageId(int id) {
|
||||
writeInt(0, id);
|
||||
}
|
||||
|
||||
public byte[] getData() {
|
||||
return PacketEvents.get().getByteBufUtil().getBytes(getBuffer());
|
||||
}
|
||||
|
||||
public void setData(byte[] data) {
|
||||
Object dataSerializer = readObject(0, NMSUtils.packetDataSerializerClass);
|
||||
WrappedPacket dataSerializerWrapper = new WrappedPacket(new NMSPacket(dataSerializer));
|
||||
PacketEvents.get().getByteBufUtil().setBytes(getBuffer(), data);
|
||||
}
|
||||
|
||||
private Object getBuffer() {
|
||||
Object dataSerializer = readObject(0, NMSUtils.packetDataSerializerClass);
|
||||
WrappedPacket byteBufWrapper = new WrappedPacket(new NMSPacket(dataSerializer));
|
||||
return byteBufWrapper.readObject(0, NMSUtils.byteBufClass);
|
||||
}
|
||||
|
||||
public void retain() {
|
||||
PacketEvents.get().getByteBufUtil().retain(getBuffer());
|
||||
}
|
||||
|
||||
public void release() {
|
||||
PacketEvents.get().getByteBufUtil().release(getBuffer());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSupported() {
|
||||
return version.isNewerThan(ServerVersion.v_1_12_2);
|
||||
}
|
||||
}
|
||||
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.login.in.encryptionbegin;
|
||||
|
||||
import io.github.retrooper.packetevents.packettype.PacketTypeClasses;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
|
||||
public class WrappedPacketLoginInEncryptionBegin extends WrappedPacket {
|
||||
public WrappedPacketLoginInEncryptionBegin(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public byte[] getPublicKey() {
|
||||
return readByteArray(0);
|
||||
}
|
||||
|
||||
public void setPublicKey(byte[] key) {
|
||||
writeByteArray(0, key);
|
||||
}
|
||||
|
||||
public byte[] getVerifyToken() {
|
||||
return readByteArray(1);
|
||||
}
|
||||
|
||||
public void setVerifyToken(byte[] token) {
|
||||
writeByteArray(1, token);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSupported() {
|
||||
return PacketTypeClasses.Login.Client.ENCRYPTION_BEGIN != null;
|
||||
}
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.login.in.start;
|
||||
|
||||
import io.github.retrooper.packetevents.packettype.PacketTypeClasses;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.gameprofile.GameProfileUtil;
|
||||
import io.github.retrooper.packetevents.utils.gameprofile.WrappedGameProfile;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
|
||||
public class WrappedPacketLoginInStart extends WrappedPacket {
|
||||
public WrappedPacketLoginInStart(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public WrappedGameProfile getGameProfile() {
|
||||
return GameProfileUtil.getWrappedGameProfile(readObject(0, NMSUtils.gameProfileClass));
|
||||
}
|
||||
|
||||
public void setGameProfile(WrappedGameProfile wrappedGameProfile) {
|
||||
Object gameProfile = GameProfileUtil.getGameProfile(wrappedGameProfile.getId(), wrappedGameProfile.getName());
|
||||
write(NMSUtils.gameProfileClass, 0, gameProfile);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSupported() {
|
||||
return PacketTypeClasses.Login.Client.START != null;
|
||||
}
|
||||
}
|
||||
+142
@@ -0,0 +1,142 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.login.out.custompayload;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.packettype.PacketTypeClasses;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.api.SendableWrapper;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
public class WrappedPacketLoginOutCustomPayload extends WrappedPacket implements SendableWrapper {
|
||||
private static Constructor<?> constructor;
|
||||
private static Constructor<?> packetDataSerializerConstructor;
|
||||
private int messageID;
|
||||
private String channelName;
|
||||
private byte[] data;
|
||||
|
||||
public WrappedPacketLoginOutCustomPayload(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void load() {
|
||||
Class<?> packetClass = PacketTypeClasses.Login.Server.CUSTOM_PAYLOAD;
|
||||
if (packetClass != null) {
|
||||
try {
|
||||
if (NMSUtils.packetDataSerializerClass != null) {
|
||||
packetDataSerializerConstructor = NMSUtils.packetDataSerializerClass.getConstructor(NMSUtils.byteBufClass);
|
||||
}
|
||||
} catch (NoSuchMethodException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
try {
|
||||
constructor = packetClass.getConstructor();
|
||||
} catch (NoSuchMethodException e3) {
|
||||
throw new IllegalStateException("PacketEvents is unable to resolve the PacketPlayOutCustomPayload constructor.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int getMessageId() {
|
||||
if (packet != null) {
|
||||
return readInt(0);
|
||||
}
|
||||
return messageID;
|
||||
}
|
||||
|
||||
public void setMessageId(int messageID) {
|
||||
if (packet != null) {
|
||||
writeInt(0, messageID);
|
||||
} else {
|
||||
this.messageID = messageID;
|
||||
}
|
||||
}
|
||||
|
||||
public String getChannelName() {
|
||||
if (packet != null) {
|
||||
Object minecraftKey = readObject(0, NMSUtils.minecraftKeyClass);
|
||||
return NMSUtils.getStringFromMinecraftKey(minecraftKey);
|
||||
}
|
||||
return channelName;
|
||||
}
|
||||
|
||||
public void setChannelName(String channelName) {
|
||||
if (packet != null) {
|
||||
Object minecraftKey = NMSUtils.generateMinecraftKey(channelName);
|
||||
writeObject(0, minecraftKey);
|
||||
} else {
|
||||
this.channelName = channelName;
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] getData() {
|
||||
if (packet != null) {
|
||||
Object dataSerializer = readObject(0, NMSUtils.packetDataSerializerClass);
|
||||
WrappedPacket byteBufWrapper = new WrappedPacket(new NMSPacket(dataSerializer));
|
||||
Object byteBuf = byteBufWrapper.readObject(0, NMSUtils.byteBufClass);
|
||||
return PacketEvents.get().getByteBufUtil().getBytes(byteBuf);
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
public void setData(byte[] data) {
|
||||
PacketEvents.get().getByteBufUtil().setBytes(getBuffer(), data);
|
||||
}
|
||||
|
||||
private Object getBuffer() {
|
||||
Object dataSerializer = readObject(0, NMSUtils.packetDataSerializerClass);
|
||||
WrappedPacket byteBufWrapper = new WrappedPacket(new NMSPacket(dataSerializer));
|
||||
return byteBufWrapper.readObject(0, NMSUtils.byteBufClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object asNMSPacket() {
|
||||
Object byteBufObject = PacketEvents.get().getByteBufUtil().newByteBuf(data);
|
||||
try {
|
||||
Object minecraftKey = NMSUtils.generateMinecraftKey(channelName);
|
||||
Object dataSerializer = packetDataSerializerConstructor.newInstance(byteBufObject);
|
||||
Object packetInstance = constructor.newInstance();
|
||||
WrappedPacket packetWrapper = new WrappedPacket(new NMSPacket(packetInstance));
|
||||
packetWrapper.writeInt(0, messageID);
|
||||
packetWrapper.writeObject(0, minecraftKey);
|
||||
packetWrapper.writeObject(0, dataSerializer);
|
||||
return packetInstance;
|
||||
} catch (InstantiationException | InvocationTargetException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSupported() {
|
||||
return PacketTypeClasses.Login.Server.CUSTOM_PAYLOAD != null;
|
||||
}
|
||||
}
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.login.out.disconnect;
|
||||
|
||||
import io.github.retrooper.packetevents.packettype.PacketTypeClasses;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
|
||||
public class WrappedPacketLoginOutDisconnect extends WrappedPacket {
|
||||
public WrappedPacketLoginOutDisconnect(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public String getReason() {
|
||||
Object iChatBaseComponent = readObject(0, NMSUtils.iChatBaseComponentClass);
|
||||
return NMSUtils.readIChatBaseComponent(iChatBaseComponent);
|
||||
}
|
||||
|
||||
public void setReason(String reason) {
|
||||
Object iChatBaseComponent = NMSUtils.generateIChatBaseComponent(reason);
|
||||
writeObject(0, iChatBaseComponent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSupported() {
|
||||
return PacketTypeClasses.Login.Server.DISCONNECT != null;
|
||||
}
|
||||
}
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.login.out.encryptionbegin;
|
||||
|
||||
import io.github.retrooper.packetevents.packettype.PacketTypeClasses;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
|
||||
import java.security.PublicKey;
|
||||
|
||||
public class WrappedPacketLoginOutEncryptionBegin extends WrappedPacket {
|
||||
public WrappedPacketLoginOutEncryptionBegin(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public String getEncodedString() {
|
||||
return readString(0);
|
||||
}
|
||||
|
||||
public void setEncodedString(String encodedString) {
|
||||
writeString(0, encodedString);
|
||||
}
|
||||
|
||||
public PublicKey getPublicKey() {
|
||||
return readObject(1, PublicKey.class);
|
||||
}
|
||||
|
||||
public void setPublicKey(PublicKey key) {
|
||||
writeObject(0, key);
|
||||
}
|
||||
|
||||
public byte[] getVerifyToken() {
|
||||
return readByteArray(0);
|
||||
}
|
||||
|
||||
public void setVerifyToken(byte[] verifyToken) {
|
||||
writeByteArray(0, verifyToken);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSupported() {
|
||||
return PacketTypeClasses.Login.Server.ENCRYPTION_BEGIN != null;
|
||||
}
|
||||
}
|
||||
+94
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.login.out.setcompression;
|
||||
|
||||
import io.github.retrooper.packetevents.packettype.PacketTypeClasses;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.api.SendableWrapper;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerVersion;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
//This packet does not exist on 1.7.10
|
||||
public class WrappedPacketLoginOutSetCompression extends WrappedPacket implements SendableWrapper {
|
||||
private static Constructor<?> constructor;
|
||||
private int threshold;
|
||||
|
||||
public WrappedPacketLoginOutSetCompression(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public WrappedPacketLoginOutSetCompression(int threshold) {
|
||||
this.threshold = threshold;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void load() {
|
||||
try {
|
||||
if (PacketTypeClasses.Login.Server.SET_COMPRESSION != null) {
|
||||
constructor = PacketTypeClasses.Login.Server.SET_COMPRESSION.getConstructor(int.class);
|
||||
}
|
||||
} catch (NoSuchMethodException e) {
|
||||
//probably 1.7.10
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Maximum size of a packet before it can be compressed.
|
||||
*
|
||||
* @return threshold Threshold
|
||||
*/
|
||||
public int getThreshold() {
|
||||
if (packet != null) {
|
||||
return readInt(0);
|
||||
}
|
||||
return threshold;
|
||||
}
|
||||
|
||||
public void setThreshold(int threshold) {
|
||||
if (packet != null) {
|
||||
writeInt(0, threshold);
|
||||
} else {
|
||||
this.threshold = threshold;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object asNMSPacket() {
|
||||
try {
|
||||
return constructor.newInstance(getThreshold());
|
||||
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSupported() {
|
||||
return version.isNewerThan(ServerVersion.v_1_7_10);
|
||||
}
|
||||
}
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.login.out.success;
|
||||
|
||||
import io.github.retrooper.packetevents.packettype.PacketTypeClasses;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.gameprofile.GameProfileUtil;
|
||||
import io.github.retrooper.packetevents.utils.gameprofile.WrappedGameProfile;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
|
||||
public class WrappedPacketLoginOutSuccess extends WrappedPacket {
|
||||
public WrappedPacketLoginOutSuccess(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public WrappedGameProfile getGameProfile() {
|
||||
return GameProfileUtil.getWrappedGameProfile(readObject(0, NMSUtils.gameProfileClass));
|
||||
}
|
||||
|
||||
|
||||
public void setGameProfile(WrappedGameProfile wrappedGameProfile) {
|
||||
Object gameProfile = GameProfileUtil.getGameProfile(wrappedGameProfile.getId(), wrappedGameProfile.getName());
|
||||
write(NMSUtils.gameProfileClass, 0, gameProfile);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSupported() {
|
||||
return PacketTypeClasses.Login.Server.SUCCESS != null;
|
||||
}
|
||||
}
|
||||
+120
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.abilities;
|
||||
|
||||
import io.github.retrooper.packetevents.packettype.PacketTypeClasses;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.reflection.Reflection;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerVersion;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public final class WrappedPacketInAbilities extends WrappedPacket {
|
||||
private static boolean v_1_16_Mode;
|
||||
|
||||
public WrappedPacketInAbilities(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void load() {
|
||||
v_1_16_Mode = Reflection.getField(PacketTypeClasses.Play.Client.ABILITIES, boolean.class, 1) == null;
|
||||
}
|
||||
|
||||
public boolean isFlying() {
|
||||
return readBoolean(v_1_16_Mode ? 0 : 1);
|
||||
}
|
||||
|
||||
public void setFlying(boolean flying) {
|
||||
writeBoolean(v_1_16_Mode ? 0 : 1, flying);
|
||||
}
|
||||
|
||||
public Optional<Boolean> isVulnerable() {
|
||||
if (v_1_16_Mode) {
|
||||
return Optional.empty();
|
||||
}
|
||||
return Optional.of(readBoolean(0));
|
||||
}
|
||||
|
||||
public void setVulnerable(boolean vulnerable) {
|
||||
if (!v_1_16_Mode) {
|
||||
writeBoolean(0, vulnerable);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public Optional<Boolean> isFlightAllowed() {
|
||||
if (v_1_16_Mode) {
|
||||
return Optional.empty();
|
||||
}
|
||||
return Optional.of(readBoolean(2));
|
||||
}
|
||||
|
||||
public void setFlightAllowed(boolean flightAllowed) {
|
||||
if (!v_1_16_Mode) {
|
||||
writeBoolean(2, flightAllowed);
|
||||
}
|
||||
}
|
||||
|
||||
public Optional<Boolean> canInstantlyBuild() {
|
||||
if (v_1_16_Mode) {
|
||||
return Optional.empty();
|
||||
}
|
||||
return Optional.of(readBoolean(3));
|
||||
}
|
||||
|
||||
public void setCanInstantlyBuild(boolean canInstantlyBuild) {
|
||||
if (!v_1_16_Mode) {
|
||||
writeBoolean(3, canInstantlyBuild);
|
||||
}
|
||||
}
|
||||
|
||||
public Optional<Float> getFlySpeed() {
|
||||
if (v_1_16_Mode) {
|
||||
return Optional.empty();
|
||||
}
|
||||
return Optional.of(readFloat(0));
|
||||
}
|
||||
|
||||
public void setFlySpeed(float flySpeed) {
|
||||
if (!v_1_16_Mode) {
|
||||
writeFloat(0, flySpeed);
|
||||
}
|
||||
}
|
||||
|
||||
public Optional<Float> getWalkSpeed() {
|
||||
if (v_1_16_Mode) {
|
||||
return Optional.empty();
|
||||
}
|
||||
return Optional.of(readFloat(1));
|
||||
}
|
||||
|
||||
public void setWalkSpeed(float walkSpeed) {
|
||||
if (!v_1_16_Mode) {
|
||||
writeFloat(1, walkSpeed);
|
||||
}
|
||||
}
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.armanimation;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.enums.EnumUtil;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import io.github.retrooper.packetevents.utils.player.Hand;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerVersion;
|
||||
|
||||
public class WrappedPacketInArmAnimation extends WrappedPacket {
|
||||
public WrappedPacketInArmAnimation(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public Hand getHand() {
|
||||
if (version.isOlderThan(ServerVersion.v_1_9)) {
|
||||
return Hand.MAIN_HAND;
|
||||
} else {
|
||||
Enum<?> enumConst = readEnumConstant(0, NMSUtils.enumHandClass);
|
||||
return Hand.valueOf(enumConst.name());
|
||||
}
|
||||
}
|
||||
|
||||
public void setHand(Hand hand) {
|
||||
//Optimize to do nothing on legacy versions. The protocol of the legacy versions only support one hand, the main hand.
|
||||
if (version.isNewerThan(ServerVersion.v_1_8_8)) {
|
||||
Enum<?> enumConst = EnumUtil.valueOf(NMSUtils.enumHandClass, hand.name());
|
||||
write(NMSUtils.enumHandClass, 0, enumConst);
|
||||
}
|
||||
}
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.beacon;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
|
||||
public class WrappedPacketInBeacon extends WrappedPacket {
|
||||
public WrappedPacketInBeacon(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public int getPrimaryEffect() {
|
||||
return readInt(0);
|
||||
}
|
||||
|
||||
public void setPrimaryEffect(int primaryEffect) {
|
||||
writeInt(0, primaryEffect);
|
||||
}
|
||||
|
||||
public int getSecondaryEffect() {
|
||||
return readInt(1);
|
||||
}
|
||||
|
||||
public void setSecondaryEffect(int secondaryEffect) {
|
||||
writeInt(1, secondaryEffect);
|
||||
}
|
||||
}
|
||||
+156
@@ -0,0 +1,156 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.blockdig;
|
||||
|
||||
import io.github.retrooper.packetevents.packettype.PacketTypeClasses;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.enums.EnumUtil;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import io.github.retrooper.packetevents.utils.player.Direction;
|
||||
import io.github.retrooper.packetevents.utils.reflection.SubclassUtil;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerVersion;
|
||||
import io.github.retrooper.packetevents.utils.vector.Vector3i;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
public final class WrappedPacketInBlockDig extends WrappedPacket {
|
||||
private static Class<? extends Enum<?>> digTypeClass;
|
||||
private static boolean isVersionLowerThan_v_1_8;
|
||||
|
||||
public WrappedPacketInBlockDig(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void load() {
|
||||
Class<?> blockDigClass = PacketTypeClasses.Play.Client.BLOCK_DIG;
|
||||
isVersionLowerThan_v_1_8 = version.isOlderThan(ServerVersion.v_1_8);
|
||||
|
||||
if (version != ServerVersion.v_1_7_10) {
|
||||
try {
|
||||
digTypeClass = NMSUtils.getNMSEnumClass("EnumPlayerDigType");
|
||||
} catch (ClassNotFoundException e) {
|
||||
//It is probably a subclass
|
||||
digTypeClass = SubclassUtil.getEnumSubClass(blockDigClass, "EnumPlayerDigType");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Vector3i getBlockPosition() {
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
int z = 0;
|
||||
if (isVersionLowerThan_v_1_8) {
|
||||
x = readInt(0);
|
||||
y = readInt(1);
|
||||
z = readInt(2);
|
||||
} else {
|
||||
Object blockPosObj = readObject(0, NMSUtils.blockPosClass);
|
||||
try {
|
||||
x = (int) NMSUtils.getBlockPosX.invoke(blockPosObj);
|
||||
y = (int) NMSUtils.getBlockPosY.invoke(blockPosObj);
|
||||
z = (int) NMSUtils.getBlockPosZ.invoke(blockPosObj);
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return new Vector3i(x, y, z);
|
||||
}
|
||||
|
||||
public void setBlockPosition(Vector3i blockPos) {
|
||||
if (isVersionLowerThan_v_1_8) {
|
||||
writeInt(0, blockPos.x);
|
||||
writeInt(1, blockPos.y);
|
||||
writeInt(2, blockPos.z);
|
||||
} else {
|
||||
Object blockPosObj = NMSUtils.generateNMSBlockPos(blockPos.x, blockPos.y, blockPos.z);
|
||||
write(NMSUtils.blockPosClass, 0, blockPosObj);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the direction / Get the face.
|
||||
*
|
||||
* @return Direction
|
||||
*/
|
||||
public Direction getDirection() {
|
||||
if (isVersionLowerThan_v_1_8) {
|
||||
return Direction.getDirection(readInt(3));
|
||||
} else {
|
||||
Enum<?> enumDir = readEnumConstant(0, NMSUtils.enumDirectionClass);
|
||||
return Direction.valueOf(enumDir.name());
|
||||
}
|
||||
}
|
||||
|
||||
public void setDirection(Direction direction) {
|
||||
if (isVersionLowerThan_v_1_8) {
|
||||
writeInt(3, direction.getFaceValue());
|
||||
} else {
|
||||
Enum<?> enumConst = EnumUtil.valueOf(NMSUtils.enumDirectionClass, direction.name());
|
||||
write(NMSUtils.enumDirectionClass, 0, enumConst);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the PlayerDigType enum sent in this packet.
|
||||
*
|
||||
* @return Dig Type
|
||||
*/
|
||||
public PlayerDigType getDigType() {
|
||||
if (isVersionLowerThan_v_1_8) {
|
||||
return PlayerDigType.values()[readInt(4)];
|
||||
} else {
|
||||
return PlayerDigType.valueOf(readObject(0, digTypeClass).name());
|
||||
}
|
||||
}
|
||||
|
||||
public void setDigType(PlayerDigType type) {
|
||||
if (isVersionLowerThan_v_1_8) {
|
||||
writeInt(4, type.ordinal());
|
||||
} else {
|
||||
Enum<?> enumConst = EnumUtil.valueOf(digTypeClass, type.name());
|
||||
write(digTypeClass, 0, enumConst);
|
||||
}
|
||||
}
|
||||
|
||||
public enum PlayerDigType {
|
||||
START_DESTROY_BLOCK,
|
||||
ABORT_DESTROY_BLOCK,
|
||||
STOP_DESTROY_BLOCK,
|
||||
DROP_ALL_ITEMS,
|
||||
DROP_ITEM,
|
||||
RELEASE_USE_ITEM,
|
||||
|
||||
/**
|
||||
* Doesn't exist on the newest versions.
|
||||
*/
|
||||
@Deprecated
|
||||
SWAP_HELD_ITEMS,
|
||||
|
||||
SWAP_ITEM_WITH_OFFHAND,
|
||||
UNKNOWN
|
||||
}
|
||||
}
|
||||
+167
@@ -0,0 +1,167 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.blockplace;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.enums.EnumUtil;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import io.github.retrooper.packetevents.utils.player.Direction;
|
||||
import io.github.retrooper.packetevents.utils.player.Hand;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerVersion;
|
||||
import io.github.retrooper.packetevents.utils.vector.Vector3f;
|
||||
import io.github.retrooper.packetevents.utils.vector.Vector3i;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
|
||||
public final class WrappedPacketInBlockPlace extends WrappedPacket {
|
||||
private static boolean newerThan_v_1_8_8, newerThan_v_1_7_10;
|
||||
private static int handEnumIndex;
|
||||
|
||||
public WrappedPacketInBlockPlace(final NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void load() {
|
||||
newerThan_v_1_7_10 = version.isNewerThan(ServerVersion.v_1_7_10);
|
||||
newerThan_v_1_8_8 = version.isNewerThan(ServerVersion.v_1_8_8);
|
||||
try {
|
||||
Object handEnum = readObject(1, NMSUtils.enumHandClass);
|
||||
handEnumIndex = 1;
|
||||
} catch (Exception ex) {
|
||||
handEnumIndex = 0;//Most likely a newer version
|
||||
}
|
||||
}
|
||||
|
||||
public Hand getHand() {
|
||||
if (version.isOlderThan(ServerVersion.v_1_9)) {
|
||||
return Hand.MAIN_HAND;
|
||||
} else {
|
||||
Enum<?> enumConst = readEnumConstant(handEnumIndex, NMSUtils.enumHandClass);
|
||||
return Hand.valueOf(enumConst.name());
|
||||
}
|
||||
}
|
||||
|
||||
public void setHand(Hand hand) {
|
||||
//Optimize to do nothing on legacy versions. The protocol of the legacy versions only support one hand, the main hand.
|
||||
if (version.isNewerThan(ServerVersion.v_1_8_8)) {
|
||||
Enum<?> enumConst = EnumUtil.valueOf(NMSUtils.enumHandClass, hand.name());
|
||||
write(NMSUtils.enumHandClass, handEnumIndex, enumConst);
|
||||
}
|
||||
}
|
||||
|
||||
public Direction getDirection() {
|
||||
if (newerThan_v_1_8_8) {
|
||||
WrappedPacketInBlockPlace_1_9 blockPlace_1_9 = new WrappedPacketInBlockPlace_1_9(new NMSPacket(packet.getRawNMSPacket()));
|
||||
return blockPlace_1_9.getDirection();
|
||||
} else if (newerThan_v_1_7_10) {
|
||||
WrappedPacketInBlockPlace_1_8 blockPlace_1_8 = new WrappedPacketInBlockPlace_1_8(new NMSPacket(packet.getRawNMSPacket()));
|
||||
return Direction.getDirection(blockPlace_1_8.getFace());
|
||||
} else {
|
||||
WrappedPacketInBlockPlace_1_7_10 blockPlace_1_7_10 = new WrappedPacketInBlockPlace_1_7_10(new NMSPacket(packet.getRawNMSPacket()));
|
||||
return Direction.getDirection(blockPlace_1_7_10.getFace());
|
||||
}
|
||||
}
|
||||
|
||||
public void setDirection(Direction direction) {
|
||||
if (newerThan_v_1_8_8) {
|
||||
WrappedPacketInBlockPlace_1_9 blockPlace_1_9 = new WrappedPacketInBlockPlace_1_9(new NMSPacket(packet.getRawNMSPacket()));
|
||||
blockPlace_1_9.setDirection(direction);
|
||||
} else if (newerThan_v_1_7_10) {
|
||||
WrappedPacketInBlockPlace_1_8 blockPlace_1_8 = new WrappedPacketInBlockPlace_1_8(new NMSPacket(packet.getRawNMSPacket()));
|
||||
blockPlace_1_8.setFace(direction.getFaceValue());
|
||||
} else {
|
||||
WrappedPacketInBlockPlace_1_7_10 blockPlace_1_7_10 = new WrappedPacketInBlockPlace_1_7_10(new NMSPacket(packet.getRawNMSPacket()));
|
||||
blockPlace_1_7_10.setFace(direction.getFaceValue());
|
||||
}
|
||||
}
|
||||
|
||||
public Vector3i getBlockPosition() {
|
||||
Vector3i blockPos;
|
||||
if (newerThan_v_1_8_8) {
|
||||
WrappedPacketInBlockPlace_1_9 blockPlace_1_9 = new WrappedPacketInBlockPlace_1_9(packet);
|
||||
blockPos = blockPlace_1_9.getBlockPosition();
|
||||
} else if (newerThan_v_1_7_10) {
|
||||
WrappedPacketInBlockPlace_1_8 blockPlace_1_8 = new WrappedPacketInBlockPlace_1_8(packet);
|
||||
blockPos = blockPlace_1_8.getBlockPosition();
|
||||
} else {
|
||||
WrappedPacketInBlockPlace_1_7_10 blockPlace_1_7_10 = new WrappedPacketInBlockPlace_1_7_10(packet);
|
||||
blockPos = blockPlace_1_7_10.getBlockPosition();
|
||||
}
|
||||
return blockPos;
|
||||
}
|
||||
|
||||
public Optional<Vector3f> getCursorPosition() {
|
||||
if (newerThan_v_1_8_8) {
|
||||
return Optional.empty();
|
||||
} else if (newerThan_v_1_7_10) {
|
||||
WrappedPacketInBlockPlace_1_8 blockPlace_1_8 = new WrappedPacketInBlockPlace_1_8(packet);
|
||||
return Optional.of(blockPlace_1_8.getCursorPosition());
|
||||
} else {
|
||||
WrappedPacketInBlockPlace_1_7_10 blockPlace_1_7_10 = new WrappedPacketInBlockPlace_1_7_10(packet);
|
||||
return Optional.of(blockPlace_1_7_10.getCursorPosition());
|
||||
}
|
||||
}
|
||||
|
||||
public void setCursorPosition(Vector3f cursorPos) {
|
||||
if (newerThan_v_1_8_8) {
|
||||
|
||||
} else if (newerThan_v_1_7_10) {
|
||||
WrappedPacketInBlockPlace_1_8 blockPlace_1_8 = new WrappedPacketInBlockPlace_1_8(packet);
|
||||
blockPlace_1_8.setCursorPosition(cursorPos);
|
||||
} else {
|
||||
WrappedPacketInBlockPlace_1_7_10 blockPlace_1_7_10 = new WrappedPacketInBlockPlace_1_7_10(packet);
|
||||
blockPlace_1_7_10.setCursorPosition(cursorPos);
|
||||
}
|
||||
}
|
||||
|
||||
public Optional<ItemStack> getItemStack() {
|
||||
if (newerThan_v_1_8_8) {
|
||||
return Optional.empty();
|
||||
} else if (newerThan_v_1_7_10) {
|
||||
WrappedPacketInBlockPlace_1_8 blockPlace_1_8 = new WrappedPacketInBlockPlace_1_8(packet);
|
||||
return Optional.of(blockPlace_1_8.getItemStack());
|
||||
} else {
|
||||
WrappedPacketInBlockPlace_1_7_10 blockPlace_1_7_10 = new WrappedPacketInBlockPlace_1_7_10(packet);
|
||||
return Optional.of(blockPlace_1_7_10.getItemStack());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void setItemStack(ItemStack stack) {
|
||||
if (newerThan_v_1_8_8) {
|
||||
|
||||
} else if (newerThan_v_1_7_10) {
|
||||
WrappedPacketInBlockPlace_1_8 blockPlace_1_8 = new WrappedPacketInBlockPlace_1_8(packet);
|
||||
blockPlace_1_8.setItemStack(stack);
|
||||
} else {
|
||||
WrappedPacketInBlockPlace_1_7_10 blockPlace_1_7_10 = new WrappedPacketInBlockPlace_1_7_10(packet);
|
||||
blockPlace_1_7_10.setItemStack(stack);
|
||||
}
|
||||
}
|
||||
}
|
||||
+92
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.blockplace;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.vector.Vector3f;
|
||||
import io.github.retrooper.packetevents.utils.vector.Vector3i;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
final class WrappedPacketInBlockPlace_1_7_10 extends WrappedPacket {
|
||||
private final net.minecraft.server.v1_7_R4.PacketPlayInBlockPlace blockPlace;
|
||||
|
||||
WrappedPacketInBlockPlace_1_7_10(final NMSPacket packet) {
|
||||
super(packet);
|
||||
blockPlace =
|
||||
(net.minecraft.server.v1_7_R4.PacketPlayInBlockPlace) packet.getRawNMSPacket();
|
||||
}
|
||||
|
||||
public Vector3i getBlockPosition() {
|
||||
return new Vector3i(blockPlace.c(), blockPlace.d(), blockPlace.e());
|
||||
}
|
||||
|
||||
public void setBlockPosition(Vector3i blockPos) {
|
||||
Vector3i currentBlockPos = getBlockPosition();
|
||||
if (blockPos.x != currentBlockPos.x) {
|
||||
writeInt(0, blockPos.x);
|
||||
}
|
||||
if (blockPos.y != currentBlockPos.y) {
|
||||
writeInt(1, blockPos.y);
|
||||
}
|
||||
if (blockPos.z != currentBlockPos.z) {
|
||||
writeInt(2, blockPos.z);
|
||||
}
|
||||
}
|
||||
|
||||
public int getFace() {
|
||||
return blockPlace.getFace();
|
||||
}
|
||||
|
||||
public void setFace(int face) {
|
||||
writeInt(3, face);
|
||||
}
|
||||
|
||||
public ItemStack getItemStack() {
|
||||
return org.bukkit.craftbukkit.v1_7_R4.inventory.CraftItemStack.asBukkitCopy(blockPlace.getItemStack());
|
||||
}
|
||||
|
||||
public void setItemStack(ItemStack stack) {
|
||||
Object nmsItemStack = org.bukkit.craftbukkit.v1_7_R4.inventory.CraftItemStack.asNMSCopy(stack);
|
||||
writeObject(0, nmsItemStack);
|
||||
}
|
||||
|
||||
public Vector3f getCursorPosition() {
|
||||
return new Vector3f(blockPlace.h(), blockPlace.i(), blockPlace.j());
|
||||
}
|
||||
|
||||
public void setCursorPosition(Vector3f cursorPos) {
|
||||
Vector3f currentCursorPos = getCursorPosition();
|
||||
if (cursorPos.x != currentCursorPos.x) {
|
||||
writeFloat(0, cursorPos.x);
|
||||
}
|
||||
if (cursorPos.y != currentCursorPos.y) {
|
||||
writeFloat(1, cursorPos.y);
|
||||
}
|
||||
if (cursorPos.z != currentCursorPos.z) {
|
||||
writeFloat(2, cursorPos.z);
|
||||
}
|
||||
}
|
||||
}
|
||||
+87
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.blockplace;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import io.github.retrooper.packetevents.utils.vector.Vector3f;
|
||||
import io.github.retrooper.packetevents.utils.vector.Vector3i;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
final class WrappedPacketInBlockPlace_1_8 extends WrappedPacket {
|
||||
|
||||
WrappedPacketInBlockPlace_1_8(final NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public Vector3i getBlockPosition() {
|
||||
Vector3i blockPos = new Vector3i();
|
||||
|
||||
Object blockPosObj = readObject(1, NMSUtils.blockPosClass);
|
||||
try {
|
||||
blockPos.x = (int)NMSUtils.getBlockPosX.invoke(blockPosObj);
|
||||
blockPos.y = (int)NMSUtils.getBlockPosY.invoke(blockPosObj);
|
||||
blockPos.z = (int)NMSUtils.getBlockPosZ.invoke(blockPosObj);
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return blockPos;
|
||||
}
|
||||
|
||||
public void setBlockPosition(Vector3i blockPos) {
|
||||
Object blockPosObj = NMSUtils.generateNMSBlockPos(blockPos.z, blockPos.y, blockPos.z);
|
||||
write(NMSUtils.blockPosClass, 1, blockPosObj);
|
||||
}
|
||||
|
||||
public ItemStack getItemStack() {
|
||||
return NMSUtils.toBukkitItemStack(readObject(0, NMSUtils.nmsItemStackClass));
|
||||
}
|
||||
|
||||
public void setItemStack(ItemStack stack) {
|
||||
Object nmsItemStack = NMSUtils.toNMSItemStack(stack);
|
||||
write(NMSUtils.nmsItemStackClass, 0, nmsItemStack);
|
||||
}
|
||||
|
||||
public int getFace() {
|
||||
return readInt(0);
|
||||
}
|
||||
|
||||
public void setFace(int face) {
|
||||
writeInt(0, face);
|
||||
}
|
||||
|
||||
public Vector3f getCursorPosition() {
|
||||
return new Vector3f(readFloat(0), readFloat(1), readFloat(2));
|
||||
}
|
||||
|
||||
public void setCursorPosition(Vector3f cursorPos) {
|
||||
writeFloat(0, cursorPos.x);
|
||||
writeFloat(1, cursorPos.y);
|
||||
writeFloat(2, cursorPos.z);
|
||||
}
|
||||
}
|
||||
+111
@@ -0,0 +1,111 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.blockplace;
|
||||
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.enums.EnumUtil;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import io.github.retrooper.packetevents.utils.player.Direction;
|
||||
import io.github.retrooper.packetevents.utils.vector.Vector3i;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
final class WrappedPacketInBlockPlace_1_9 extends WrappedPacket {
|
||||
private static Class<?> movingObjectPositionBlockClass;
|
||||
private Object movingObjPos;
|
||||
|
||||
public WrappedPacketInBlockPlace_1_9(final NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void load() {
|
||||
movingObjectPositionBlockClass = NMSUtils.getNMSClassWithoutException("MovingObjectPositionBlock");
|
||||
}
|
||||
|
||||
public Vector3i getBlockPosition() {
|
||||
Vector3i blockPos = new Vector3i();
|
||||
Object blockPosObj;
|
||||
if (movingObjectPositionBlockClass == null) {
|
||||
blockPosObj = readObject(0, NMSUtils.blockPosClass);
|
||||
} else {
|
||||
if (movingObjPos == null) {
|
||||
movingObjPos = readObject(0, movingObjectPositionBlockClass);
|
||||
}
|
||||
WrappedPacket movingObjectPosWrapper = new WrappedPacket(new NMSPacket(movingObjPos));
|
||||
blockPosObj = movingObjectPosWrapper.readObject(0, NMSUtils.blockPosClass);
|
||||
}
|
||||
try {
|
||||
blockPos.x = (int) NMSUtils.getBlockPosX.invoke(blockPosObj);
|
||||
blockPos.y = (int) NMSUtils.getBlockPosY.invoke(blockPosObj);
|
||||
blockPos.z = (int) NMSUtils.getBlockPosZ.invoke(blockPosObj);
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return blockPos;
|
||||
}
|
||||
|
||||
public void setBlockPosition(Vector3i blockPos) {
|
||||
Object blockPosObj = NMSUtils.generateNMSBlockPos(blockPos.x, blockPos.y, blockPos.z);
|
||||
if (movingObjectPositionBlockClass == null) {
|
||||
write(NMSUtils.blockPosClass, 0, blockPosObj);
|
||||
} else {
|
||||
if (movingObjPos == null) {
|
||||
movingObjPos = readObject(0, movingObjectPositionBlockClass);
|
||||
}
|
||||
WrappedPacket movingObjectPosWrapper = new WrappedPacket(new NMSPacket(movingObjPos));
|
||||
movingObjectPosWrapper.write(NMSUtils.blockPosClass, 0, blockPos);
|
||||
}
|
||||
}
|
||||
|
||||
public Direction getDirection() {
|
||||
Enum<?> enumConst;
|
||||
if (movingObjectPositionBlockClass == null) {
|
||||
enumConst = readEnumConstant(0, NMSUtils.enumDirectionClass);
|
||||
} else {
|
||||
if (movingObjPos == null) {
|
||||
movingObjPos = readObject(0, movingObjectPositionBlockClass);
|
||||
}
|
||||
WrappedPacket movingObjectPosWrapper = new WrappedPacket(new NMSPacket(movingObjPos));
|
||||
enumConst = movingObjectPosWrapper.readEnumConstant(0, NMSUtils.enumDirectionClass);
|
||||
}
|
||||
return Direction.valueOf(enumConst.name());
|
||||
}
|
||||
|
||||
public void setDirection(Direction direction) {
|
||||
Enum<?> enumConst = EnumUtil.valueOf(NMSUtils.enumDirectionClass, direction.name());
|
||||
if (movingObjectPositionBlockClass == null) {
|
||||
writeEnumConstant(0, enumConst);
|
||||
} else {
|
||||
if (movingObjPos == null) {
|
||||
movingObjPos = readObject(0, movingObjectPositionBlockClass);
|
||||
}
|
||||
WrappedPacket movingObjectPosWrapper = new WrappedPacket(new NMSPacket(movingObjPos));
|
||||
movingObjectPosWrapper.writeEnumConstant(0, enumConst);
|
||||
}
|
||||
}
|
||||
}
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.boatmove;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerVersion;
|
||||
|
||||
/**
|
||||
* Wrapper for the BoatMove packet.
|
||||
*
|
||||
* @author Tecnio
|
||||
* @since 1.8
|
||||
*/
|
||||
public final class WrappedPacketInBoatMove extends WrappedPacket {
|
||||
public WrappedPacketInBoatMove(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public boolean getLeftPaddle() {
|
||||
return readBoolean(0);
|
||||
}
|
||||
|
||||
public void setLeftPaddle(boolean turning) {
|
||||
writeBoolean(0, turning);
|
||||
}
|
||||
|
||||
public boolean getRightPaddle() {
|
||||
return readBoolean(1);
|
||||
}
|
||||
|
||||
public void setRightPaddle(boolean turning) {
|
||||
writeBoolean(1, turning);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSupported() {
|
||||
return version.isNewerThan(ServerVersion.v_1_8);
|
||||
}
|
||||
}
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.chat;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
|
||||
public final class WrappedPacketInChat extends WrappedPacket {
|
||||
private String message = null;
|
||||
public WrappedPacketInChat(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
if (message != null) {
|
||||
return message;
|
||||
}
|
||||
return message = readString(0);
|
||||
}
|
||||
|
||||
public void setMessage(String message) {
|
||||
this.message = message;
|
||||
writeString(0, message);
|
||||
}
|
||||
}
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.clientcommand;
|
||||
|
||||
import io.github.retrooper.packetevents.packettype.PacketTypeClasses;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.enums.EnumUtil;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import io.github.retrooper.packetevents.utils.reflection.SubclassUtil;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerVersion;
|
||||
|
||||
public final class WrappedPacketInClientCommand extends WrappedPacket {
|
||||
private static Class<? extends Enum<?>> enumClientCommandClass;
|
||||
|
||||
public WrappedPacketInClientCommand(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void load() {
|
||||
Class<?> packetClass = PacketTypeClasses.Play.Client.CLIENT_COMMAND;
|
||||
try {
|
||||
enumClientCommandClass = NMSUtils.getNMSEnumClass("EnumClientCommand");
|
||||
} catch (ClassNotFoundException e) {
|
||||
//Probably a subclass
|
||||
enumClientCommandClass = SubclassUtil.getEnumSubClass(packetClass, "EnumClientCommand");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public ClientCommand getClientCommand() {
|
||||
Enum<?> emumConst = readEnumConstant(0, enumClientCommandClass);
|
||||
return ClientCommand.valueOf(emumConst.name());
|
||||
}
|
||||
|
||||
public void setClientCommand(ClientCommand command) throws UnsupportedOperationException {
|
||||
if (command == ClientCommand.OPEN_INVENTORY_ACHIEVEMENT && version.isNewerThan(ServerVersion.v_1_16)) {
|
||||
throwUnsupportedOperation(command);
|
||||
}
|
||||
Enum<?> enumConst = EnumUtil.valueOf(enumClientCommandClass, command.name());
|
||||
writeEnumConstant(0, enumConst);
|
||||
}
|
||||
|
||||
public enum ClientCommand {
|
||||
PERFORM_RESPAWN,
|
||||
REQUEST_STATS,
|
||||
|
||||
//This enum constant only exists on 1.7.10 -> 1.15.2
|
||||
@SupportedVersions(ranges = {ServerVersion.v_1_7_10, ServerVersion.v_1_15_2})
|
||||
@Deprecated
|
||||
OPEN_INVENTORY_ACHIEVEMENT
|
||||
}
|
||||
|
||||
}
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.closewindow;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
|
||||
public class WrappedPacketInCloseWindow extends WrappedPacket {
|
||||
public WrappedPacketInCloseWindow(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
//0 for player inv.
|
||||
public int getWindowId() {
|
||||
return readInt(0);
|
||||
}
|
||||
|
||||
public void setWindowId(int windowID) {
|
||||
writeInt(0, windowID);
|
||||
}
|
||||
}
|
||||
+101
@@ -0,0 +1,101 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.custompayload;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.packettype.PacketTypeClasses;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import io.github.retrooper.packetevents.utils.reflection.Reflection;
|
||||
|
||||
public final class WrappedPacketInCustomPayload extends WrappedPacket {
|
||||
private static boolean strPresent, byteArrayPresent;
|
||||
|
||||
public WrappedPacketInCustomPayload(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void load() {
|
||||
Class<?> packetClass = PacketTypeClasses.Play.Client.CUSTOM_PAYLOAD;
|
||||
strPresent = Reflection.getField(packetClass, String.class, 0) != null;
|
||||
byteArrayPresent = Reflection.getField(packetClass, byte[].class, 0) != null;
|
||||
}
|
||||
|
||||
public String getTag() {
|
||||
if (strPresent) {
|
||||
return readString(0);
|
||||
} else {
|
||||
Object minecraftKey = readObject(0, NMSUtils.minecraftKeyClass);
|
||||
return NMSUtils.getStringFromMinecraftKey(minecraftKey);
|
||||
}
|
||||
}
|
||||
|
||||
public void setTag(String tag) {
|
||||
if (strPresent) {
|
||||
writeString(0, tag);
|
||||
} else {
|
||||
Object minecraftKey = NMSUtils.generateMinecraftKey(tag);
|
||||
write(NMSUtils.minecraftKeyClass, 0, minecraftKey);
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] getData() {
|
||||
if (byteArrayPresent) {
|
||||
return readByteArray(0);
|
||||
} else {
|
||||
return PacketEvents.get().getByteBufUtil().getBytes(getBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
public void setData(byte[] data) {
|
||||
if (byteArrayPresent) {
|
||||
writeByteArray(0, data);
|
||||
} else {
|
||||
PacketEvents.get().getByteBufUtil().setBytes(getBuffer(), data);
|
||||
}
|
||||
}
|
||||
|
||||
private Object getBuffer() {
|
||||
Object dataSerializer = readObject(0, NMSUtils.packetDataSerializerClass);
|
||||
WrappedPacket dataSerializerWrapper = new WrappedPacket(new NMSPacket(dataSerializer));
|
||||
|
||||
return dataSerializerWrapper.readObject(0, NMSUtils.byteBufClass);
|
||||
}
|
||||
|
||||
public void retain() {
|
||||
if (!byteArrayPresent) {
|
||||
PacketEvents.get().getByteBufUtil().retain(getBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
public void release() {
|
||||
if (!byteArrayPresent) {
|
||||
PacketEvents.get().getByteBufUtil().release(getBuffer());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.difficultychange;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.enums.EnumUtil;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import io.github.retrooper.packetevents.utils.world.Difficulty;
|
||||
|
||||
/**
|
||||
* Wrapper for the DifficultyChange packet.
|
||||
*
|
||||
* @author Tecnio
|
||||
* @since 1.8
|
||||
*/
|
||||
public final class WrappedPacketInDifficultyChange extends WrappedPacket {
|
||||
|
||||
private static Class<? extends Enum<?>> enumDifficultyClass;
|
||||
|
||||
public WrappedPacketInDifficultyChange(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void load() {
|
||||
try {
|
||||
enumDifficultyClass = NMSUtils.getNMSEnumClass("EnumDifficulty");
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public Difficulty getDifficulty() {
|
||||
Enum<?> enumConstant = readEnumConstant(0, enumDifficultyClass);
|
||||
return Difficulty.values()[enumConstant.ordinal()];
|
||||
}
|
||||
|
||||
public void setDifficulty(Difficulty difficulty) {
|
||||
Enum<?> enumConstant = EnumUtil.valueByIndex(enumDifficultyClass, difficulty.ordinal());
|
||||
writeEnumConstant(0, enumConstant);
|
||||
}
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.difficultylock;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerVersion;
|
||||
|
||||
/**
|
||||
* Wrapper for the DifficultyLock packet.
|
||||
*
|
||||
* @author Tecnio
|
||||
* @since 1.8
|
||||
*/
|
||||
public final class WrappedPacketInDifficultyLock extends WrappedPacket {
|
||||
public WrappedPacketInDifficultyLock(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public boolean isLocked() {
|
||||
return readBoolean(0);
|
||||
}
|
||||
|
||||
public void setLocked(boolean locked) {
|
||||
writeBoolean(0, locked);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSupported() {
|
||||
return version.isNewerThan(ServerVersion.v_1_15_2);
|
||||
}
|
||||
}
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.enchantitem;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
|
||||
public class WrappedPacketInEnchantItem extends WrappedPacket {
|
||||
public WrappedPacketInEnchantItem(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public int getWindowId() {
|
||||
return readInt(0);
|
||||
}
|
||||
|
||||
public void setWindowId(int windowID) {
|
||||
writeInt(0, windowID);
|
||||
}
|
||||
|
||||
public int getButton() {
|
||||
return readInt(1);
|
||||
}
|
||||
|
||||
public void setButton(int button) {
|
||||
writeInt(1, button);
|
||||
}
|
||||
}
|
||||
+169
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.entityaction;
|
||||
|
||||
import io.github.retrooper.packetevents.packettype.PacketTypeClasses;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.enums.EnumUtil;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import io.github.retrooper.packetevents.utils.reflection.SubclassUtil;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerVersion;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public final class WrappedPacketInEntityAction extends WrappedPacket {
|
||||
private static Class<? extends Enum<?>> enumPlayerActionClass;
|
||||
private static boolean newerThan_v_1_8_8;
|
||||
|
||||
public WrappedPacketInEntityAction(final NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void load() {
|
||||
newerThan_v_1_8_8 = version.isNewerThan(ServerVersion.v_1_8_8);
|
||||
enumPlayerActionClass = NMSUtils.getNMSEnumClassWithoutException("EnumPlayerAction");
|
||||
if (enumPlayerActionClass == null) {
|
||||
enumPlayerActionClass = SubclassUtil.getEnumSubClass(PacketTypeClasses.Play.Client.ENTITY_ACTION, "EnumPlayerAction");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public PlayerAction getAction() {
|
||||
if (enumPlayerActionClass == null) {
|
||||
int animationIndex = readInt(1) - 1;
|
||||
return PlayerAction.getByActionValue((byte) (animationIndex));
|
||||
} else {
|
||||
Enum<?> enumConst = readEnumConstant(0, enumPlayerActionClass);
|
||||
return PlayerAction.getByName(enumConst.name());
|
||||
}
|
||||
}
|
||||
|
||||
public void setAction(PlayerAction action) throws UnsupportedOperationException {
|
||||
if (enumPlayerActionClass == null) {
|
||||
byte animationIndex = action.actionID;
|
||||
writeInt(1, animationIndex + 1);
|
||||
} else {
|
||||
Enum<?> enumConst;
|
||||
if (newerThan_v_1_8_8) {
|
||||
if (action == PlayerAction.RIDING_JUMP) {
|
||||
throwUnsupportedOperation(action);
|
||||
}
|
||||
enumConst = EnumUtil.valueByIndex(enumPlayerActionClass, action.ordinal());
|
||||
|
||||
} else {
|
||||
enumConst = EnumUtil.valueOf(enumPlayerActionClass, action.name());
|
||||
if (enumConst == null) {
|
||||
enumConst = EnumUtil.valueOf(enumPlayerActionClass, action.alias);
|
||||
}
|
||||
}
|
||||
writeEnumConstant(0, enumConst);
|
||||
}
|
||||
}
|
||||
|
||||
public int getJumpBoost() {
|
||||
if (enumPlayerActionClass == null) {
|
||||
return readInt(2);
|
||||
} else {
|
||||
return readInt(1);
|
||||
}
|
||||
}
|
||||
|
||||
public void setJumpBoost(int jumpBoost) {
|
||||
if (enumPlayerActionClass == null) {
|
||||
writeInt(2, jumpBoost);
|
||||
} else {
|
||||
writeInt(1, jumpBoost);
|
||||
}
|
||||
}
|
||||
|
||||
public enum PlayerAction {
|
||||
START_SNEAKING((byte) 0, "PRESS_SHIFT_KEY"),
|
||||
STOP_SNEAKING((byte) 1, "RELEASE_SHIFT_KEY"),
|
||||
STOP_SLEEPING((byte) 2),
|
||||
START_SPRINTING((byte) 3),
|
||||
STOP_SPRINTING((byte) 4),
|
||||
START_RIDING_JUMP((byte) 5),
|
||||
STOP_RIDING_JUMP((byte) 6),
|
||||
OPEN_INVENTORY((byte) 7),
|
||||
START_FALL_FLYING((byte) 8),
|
||||
|
||||
/**
|
||||
* Removed in minecraft server version 1.9.
|
||||
* This constant will only work on 1.7.10-1.8
|
||||
*/
|
||||
@SupportedVersions(ranges = {ServerVersion.v_1_7_10, ServerVersion.v_1_8_8})
|
||||
@Deprecated
|
||||
RIDING_JUMP((byte) 5);
|
||||
|
||||
final byte actionID;
|
||||
final String alias;
|
||||
|
||||
PlayerAction(byte actionID) {
|
||||
this.actionID = actionID;
|
||||
this.alias = "empty";
|
||||
}
|
||||
|
||||
PlayerAction(byte actionID, String alias) {
|
||||
this.actionID = actionID;
|
||||
this.alias = alias;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static PlayerAction getByActionValue(byte value) {
|
||||
if (version.isOlderThan(ServerVersion.v_1_9)) {
|
||||
if (value == RIDING_JUMP.actionID) {
|
||||
return RIDING_JUMP;
|
||||
} else {
|
||||
for (PlayerAction action : values()) {
|
||||
if (action.actionID == value) {
|
||||
return action;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return values()[value];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public static PlayerAction getByName(String name) {
|
||||
for (PlayerAction action : values()) {
|
||||
if (action.name().equals(name) || action.alias.equals(name)) {
|
||||
return action;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public byte getActionValue() {
|
||||
return actionID;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+99
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.flying;
|
||||
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
|
||||
public class WrappedPacketInFlying extends WrappedPacket {
|
||||
public WrappedPacketInFlying(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public double getX() {
|
||||
return readDouble(0);
|
||||
}
|
||||
|
||||
public void setX(double x) {
|
||||
writeDouble(0, x);
|
||||
}
|
||||
|
||||
public double getY() {
|
||||
return readDouble(1);
|
||||
}
|
||||
|
||||
public void setY(double y) {
|
||||
writeDouble(1, y);
|
||||
}
|
||||
|
||||
public double getZ() {
|
||||
return readDouble(2);
|
||||
}
|
||||
|
||||
public void setZ(double z) {
|
||||
writeDouble(2, z);
|
||||
}
|
||||
|
||||
public float getYaw() {
|
||||
return readFloat(0);
|
||||
}
|
||||
|
||||
public void setYaw(float yaw) {
|
||||
writeFloat(0, yaw);
|
||||
}
|
||||
|
||||
public float getPitch() {
|
||||
return readFloat(1);
|
||||
}
|
||||
|
||||
public void setPitch(float pitch) {
|
||||
writeFloat(1, pitch);
|
||||
}
|
||||
|
||||
public boolean isOnGround() {
|
||||
return readBoolean(0);
|
||||
}
|
||||
|
||||
public void setOnGround(boolean onGround) {
|
||||
writeBoolean(0, onGround);
|
||||
}
|
||||
|
||||
public boolean isPosition() {
|
||||
return readBoolean(1);
|
||||
}
|
||||
|
||||
public void setIsPosition(boolean isPosition) {
|
||||
writeBoolean(1, isPosition);
|
||||
}
|
||||
|
||||
public boolean isLook() {
|
||||
return readBoolean(2);
|
||||
}
|
||||
|
||||
public void setIsLook(boolean isLook) {
|
||||
writeBoolean(2, isLook);
|
||||
}
|
||||
}
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.helditemslot;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
|
||||
public final class WrappedPacketInHeldItemSlot extends WrappedPacket {
|
||||
public WrappedPacketInHeldItemSlot(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public int getCurrentSelectedSlot() {
|
||||
return readInt(0);
|
||||
}
|
||||
|
||||
public void setCurrentSelectedSlot(int slot) {
|
||||
writeInt(0, slot);
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.itemname;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
|
||||
public class WrappedPacketInItemName extends WrappedPacket {
|
||||
public WrappedPacketInItemName(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public String getItemName() {
|
||||
return readString(0);
|
||||
}
|
||||
|
||||
public void setItemName(String itemName) {
|
||||
writeString(0, itemName);
|
||||
}
|
||||
}
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.keepalive;
|
||||
|
||||
import io.github.retrooper.packetevents.packettype.PacketTypeClasses;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.reflection.Reflection;
|
||||
|
||||
public final class WrappedPacketInKeepAlive extends WrappedPacket {
|
||||
private static boolean integerPresentInIndex0;
|
||||
|
||||
public WrappedPacketInKeepAlive(final NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void load() {
|
||||
Class<?> packetClass = PacketTypeClasses.Play.Client.KEEP_ALIVE;
|
||||
integerPresentInIndex0 = Reflection.getField(packetClass, int.class, 0) != null;
|
||||
}
|
||||
|
||||
public long getId() {
|
||||
if (!integerPresentInIndex0) {
|
||||
return readLong(0);
|
||||
} else {
|
||||
return readInt(0);
|
||||
}
|
||||
}
|
||||
|
||||
public void setId(long id) {
|
||||
if (!integerPresentInIndex0) {
|
||||
writeLong(0, id);
|
||||
} else {
|
||||
if (id > Integer.MAX_VALUE) {
|
||||
id = Integer.MAX_VALUE;
|
||||
}
|
||||
else if (id < Integer.MIN_VALUE) {
|
||||
id = Integer.MIN_VALUE;
|
||||
}
|
||||
writeInt(0, (int) id);
|
||||
}
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.pickitem;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
|
||||
public class WrappedPacketInPickItem extends WrappedPacket {
|
||||
public WrappedPacketInPickItem(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public int getSlot() {
|
||||
return readInt(0);
|
||||
}
|
||||
|
||||
public void setSlot(int slot) {
|
||||
writeInt(0, slot);
|
||||
}
|
||||
}
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.resourcepackstatus;
|
||||
|
||||
import io.github.retrooper.packetevents.packettype.PacketTypeClasses;
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.enums.EnumUtil;
|
||||
import io.github.retrooper.packetevents.utils.reflection.SubclassUtil;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerVersion;
|
||||
|
||||
public class WrappedPacketInResourcePackStatus extends WrappedPacket {
|
||||
private static Class<? extends Enum<?>> enumResourcePackStatusClass;
|
||||
|
||||
public WrappedPacketInResourcePackStatus(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void load() {
|
||||
enumResourcePackStatusClass = SubclassUtil.getEnumSubClass(PacketTypeClasses.Play.Client.RESOURCE_PACK_STATUS, "EnumResourcePackStatus");
|
||||
}
|
||||
|
||||
public ResourcePackStatus getStatus() {
|
||||
Enum<?> enumConst = readEnumConstant(0, enumResourcePackStatusClass);
|
||||
return ResourcePackStatus.valueOf(enumConst.name());
|
||||
}
|
||||
|
||||
public void setStatus(ResourcePackStatus status) {
|
||||
Enum<?> enumConst = EnumUtil.valueOf(enumResourcePackStatusClass, status.name());
|
||||
writeEnumConstant(0, enumConst);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSupported() {
|
||||
return version.isNewerThan(ServerVersion.v_1_7_10);
|
||||
}
|
||||
|
||||
public enum ResourcePackStatus {
|
||||
SUCCESSFULLY_LOADED,
|
||||
DECLINED,
|
||||
FAILED_DOWNLOAD,
|
||||
ACCEPTED
|
||||
}
|
||||
}
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.setcreativeslot;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class WrappedPacketInSetCreativeSlot extends WrappedPacket {
|
||||
|
||||
public WrappedPacketInSetCreativeSlot(final NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public int getSlot() {
|
||||
return readInt(0);
|
||||
}
|
||||
|
||||
public void setSlot(int value) {
|
||||
writeInt(0, value);
|
||||
}
|
||||
|
||||
public ItemStack getClickedItem() {
|
||||
Object nmsItemStack = readObject(0, NMSUtils.nmsItemStackClass);
|
||||
return NMSUtils.toBukkitItemStack(nmsItemStack);
|
||||
}
|
||||
|
||||
public void setClickedItem(ItemStack stack) {
|
||||
Object nmsItemStack = NMSUtils.toNMSItemStack(stack);
|
||||
write(NMSUtils.nmsItemStackClass, 0, nmsItemStack);
|
||||
}
|
||||
}
|
||||
+161
@@ -0,0 +1,161 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.settings;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.enums.EnumUtil;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import io.github.retrooper.packetevents.utils.reflection.SubclassUtil;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerVersion;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class WrappedPacketInSettings extends WrappedPacket {
|
||||
private static Class<? extends Enum<?>> chatVisibilityEnumClass;
|
||||
|
||||
private static boolean isLowerThan_v_1_8;
|
||||
private Object chatVisibilityEnumObj;
|
||||
|
||||
public WrappedPacketInSettings(final NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void load() {
|
||||
isLowerThan_v_1_8 = version.isOlderThan(ServerVersion.v_1_8);
|
||||
|
||||
try {
|
||||
chatVisibilityEnumClass = NMSUtils.getNMSEnumClass("EnumChatVisibility");
|
||||
} catch (ClassNotFoundException e) {
|
||||
Class<?> entityHumanClass = NMSUtils.getNMSClassWithoutException("EntityHuman");
|
||||
//They are just on an outdated version
|
||||
chatVisibilityEnumClass = SubclassUtil.getEnumSubClass(entityHumanClass, "EnumChatVisibility");
|
||||
}
|
||||
}
|
||||
|
||||
public String getLocale() {
|
||||
return readString(0);
|
||||
}
|
||||
|
||||
public void setLocale(String locale) {
|
||||
writeString(0, locale);
|
||||
}
|
||||
|
||||
public int getViewDistance() {
|
||||
return readInt(0);
|
||||
}
|
||||
|
||||
public void setViewDistance(int viewDistance) {
|
||||
writeInt(0, viewDistance);
|
||||
}
|
||||
|
||||
public ChatVisibility getChatVisibility() {
|
||||
Enum<?> enumConst = readEnumConstant(0, chatVisibilityEnumClass);
|
||||
return ChatVisibility.valueOf(enumConst.name());
|
||||
}
|
||||
|
||||
public void setChatVisibility(ChatVisibility visibility) {
|
||||
Enum<?> enumConst = EnumUtil.valueByIndex(chatVisibilityEnumClass, visibility.ordinal()); //Ordinal is faster than name comparison.
|
||||
writeEnumConstant(0, enumConst);
|
||||
}
|
||||
|
||||
public boolean isChatColored() {
|
||||
return readBoolean(0);
|
||||
}
|
||||
|
||||
public void setChatColored(boolean chatColors) {
|
||||
writeBoolean(0, chatColors);
|
||||
}
|
||||
|
||||
public byte getDisplaySkinPartsMask() {
|
||||
byte mask = 0;
|
||||
if (isLowerThan_v_1_8) {
|
||||
boolean capeEnabled = readBoolean(1);
|
||||
if (capeEnabled) {
|
||||
mask |= 0x01;
|
||||
}
|
||||
} else {
|
||||
mask = (byte) readInt(1);
|
||||
}
|
||||
return mask;
|
||||
}
|
||||
|
||||
public void setDisplaySkinPartsMask(byte mask) {
|
||||
if (isLowerThan_v_1_8) {
|
||||
boolean capeEnabled = (mask & 0x01) == 0x01;
|
||||
writeBoolean(1, capeEnabled);
|
||||
} else {
|
||||
writeInt(1, mask);
|
||||
}
|
||||
}
|
||||
|
||||
public Set<DisplayedSkinPart> getDisplayedSkinParts() {
|
||||
Set<DisplayedSkinPart> displayedSkinParts = new HashSet<>();
|
||||
byte mask = getDisplaySkinPartsMask();
|
||||
for (DisplayedSkinPart part : DisplayedSkinPart.values()) {
|
||||
if ((mask & part.maskFlag) == part.maskFlag) {
|
||||
displayedSkinParts.add(part);
|
||||
}
|
||||
}
|
||||
return displayedSkinParts;
|
||||
}
|
||||
|
||||
public void setDisplayedSkinParts(Set<DisplayedSkinPart> displayedSkinParts) {
|
||||
byte mask = 0;
|
||||
for (DisplayedSkinPart part : displayedSkinParts) {
|
||||
mask |= part.maskFlag;
|
||||
}
|
||||
setDisplaySkinPartsMask(mask);
|
||||
}
|
||||
|
||||
public enum ChatVisibility {
|
||||
FULL, SYSTEM, HIDDEN
|
||||
}
|
||||
|
||||
public enum DisplayedSkinPart {
|
||||
CAPE(0x01),
|
||||
|
||||
@SupportedVersions(ranges = {ServerVersion.v_1_8, ServerVersion.ERROR})
|
||||
JACKET(0x02),
|
||||
@SupportedVersions(ranges = {ServerVersion.v_1_8, ServerVersion.ERROR})
|
||||
LEFT_SLEEVE(0x04),
|
||||
@SupportedVersions(ranges = {ServerVersion.v_1_8, ServerVersion.ERROR})
|
||||
RIGHT_SLEEVE(0x08),
|
||||
@SupportedVersions(ranges = {ServerVersion.v_1_8, ServerVersion.ERROR})
|
||||
LEFT_PANTS(0x10),
|
||||
@SupportedVersions(ranges = {ServerVersion.v_1_8, ServerVersion.ERROR})
|
||||
RIGHT_PANTS(0x20),
|
||||
@SupportedVersions(ranges = {ServerVersion.v_1_8, ServerVersion.ERROR})
|
||||
HAT(0x40);
|
||||
|
||||
final byte maskFlag;
|
||||
|
||||
DisplayedSkinPart(int maskFlag) {
|
||||
this.maskFlag = (byte) maskFlag;
|
||||
}
|
||||
}
|
||||
}
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.spectate;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public class WrappedPacketInSpectate extends WrappedPacket {
|
||||
public WrappedPacketInSpectate(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public UUID getUUID() {
|
||||
return readObject(0, UUID.class);
|
||||
}
|
||||
|
||||
public void setUUID(UUID uuid) {
|
||||
writeObject(0, uuid);
|
||||
}
|
||||
}
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.steervehicle;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
|
||||
public class WrappedPacketInSteerVehicle extends WrappedPacket {
|
||||
public WrappedPacketInSteerVehicle(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public float getSideValue() {
|
||||
return readFloat(0);
|
||||
}
|
||||
|
||||
public void setSideValue(float value) {
|
||||
writeFloat(0, value);
|
||||
}
|
||||
|
||||
public float getForwardValue() {
|
||||
return readFloat(1);
|
||||
}
|
||||
|
||||
public void setForwardValue(float value) {
|
||||
writeFloat(1, value);
|
||||
}
|
||||
|
||||
public boolean isJump() {
|
||||
return readBoolean(0);
|
||||
}
|
||||
|
||||
public void setJump(boolean isJump) {
|
||||
writeBoolean(0, isJump);
|
||||
}
|
||||
|
||||
public boolean isDismount() {
|
||||
return readBoolean(1);
|
||||
}
|
||||
|
||||
public void setDismount(boolean isDismount) {
|
||||
writeBoolean(1, isDismount);
|
||||
}
|
||||
}
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.tabcomplete;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
|
||||
public class WrappedPacketInTabComplete extends WrappedPacket {
|
||||
public WrappedPacketInTabComplete(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public String getText() {
|
||||
return readString(0);
|
||||
}
|
||||
|
||||
public void setText(String text) {
|
||||
writeString(0, text);
|
||||
}
|
||||
}
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.teleportaccept;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
|
||||
public class WrappedPacketInTeleportAccept extends WrappedPacket {
|
||||
public WrappedPacketInTeleportAccept(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public int getTeleportId() {
|
||||
return readInt(0);
|
||||
}
|
||||
|
||||
public void setTeleportId(int teleportId) {
|
||||
writeInt(0, teleportId);
|
||||
}
|
||||
}
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2020 retrooper
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.packetwrappers.play.in.transaction;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
|
||||
public final class WrappedPacketInTransaction extends WrappedPacket {
|
||||
public WrappedPacketInTransaction(final NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public int getWindowId() {
|
||||
return readInt(0);
|
||||
}
|
||||
|
||||
public void setWindowId(int windowID) {
|
||||
writeInt(0, windowID);
|
||||
}
|
||||
|
||||
public short getActionNumber() {
|
||||
return readShort(0);
|
||||
}
|
||||
|
||||
public void setActionNumber(short actionNumber) {
|
||||
writeShort(0, actionNumber);
|
||||
}
|
||||
|
||||
public boolean isAccepted() {
|
||||
return readBoolean(0);
|
||||
}
|
||||
|
||||
public void setAccepted(boolean isAccepted) {
|
||||
writeBoolean(0, isAccepted);
|
||||
}
|
||||
}
|
||||
Loaded 100 of 313 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user