mirror of
https://gitlab.com/cable-mc/cobblemon.git
synced 2026-10-22 23:26:25 -04:00
Compare commits
601
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b4588b55aa | ||
|
|
33a2a0a8e0 | ||
|
|
dac1b3cbf0 | ||
|
|
052fee56a1 | ||
|
|
15970f2ab0 | ||
|
|
3874867b74 | ||
|
|
ed6485f1d3 | ||
|
|
c7b1036bdf | ||
|
|
8730ff3a3e | ||
|
|
c8bd7c8604 | ||
|
|
b049a39680 | ||
|
|
6503b0806a | ||
|
|
ef0e785855 | ||
|
|
cccd30a284 | ||
|
|
be35e937d9 | ||
|
|
5a73456202 | ||
|
|
089e6c15da | ||
|
|
4f63c40096 | ||
|
|
218d33d78d | ||
|
|
dae5445c3a | ||
|
|
57f9d5b6dc | ||
|
|
fdfa10f5fe | ||
|
|
e12a1df252 | ||
|
|
69e74be5e5 | ||
|
|
8c9ee22547 | ||
|
|
c8074dd825 | ||
|
|
bda5e2ade2 | ||
|
|
0c5118b840 | ||
|
|
0d0eaf2465 | ||
|
|
4eb90400aa | ||
|
|
7387612f0e | ||
|
|
5188318f20 | ||
|
|
627ee5e9b2 | ||
|
|
7f3bd8bec2 | ||
|
|
db70a0f816 | ||
|
|
ab9a66c556 | ||
|
|
f5e1dfe080 | ||
|
|
175aa93284 | ||
|
|
b7926a70ab | ||
|
|
28f2caff58 | ||
|
|
128451785f | ||
|
|
0171ed9747 | ||
|
|
1fb09e27fc | ||
|
|
30a3d6ed83 | ||
|
|
18cecc68dd | ||
|
|
5036ed0db1 | ||
|
|
3b3150fc72 | ||
|
|
b9fb970ec4 | ||
|
|
761b306590 | ||
|
|
1e7dfce918 | ||
|
|
a453199eae | ||
|
|
f5267c832f | ||
|
|
7f6e0c0377 | ||
|
|
420d42b36d | ||
|
|
a45028d83b | ||
|
|
76ab7e998b | ||
|
|
cbbfa974aa | ||
|
|
9dc6649eb7 | ||
|
|
97ef0dda0a | ||
|
|
71334dc889 | ||
|
|
4d8c4b1d7b | ||
|
|
0701380a36 | ||
|
|
2b03e5660e | ||
|
|
b44a53efce | ||
|
|
5678776938 | ||
|
|
f3985d8250 | ||
|
|
b497c603ca | ||
|
|
b9807773ee | ||
|
|
aba02d7b53 | ||
|
|
0eef30af4a | ||
|
|
3a064c7269 | ||
|
|
1cece70687 | ||
|
|
c2d85df3e0 | ||
|
|
a7c0242575 | ||
|
|
97a7554e79 | ||
|
|
77108ae687 | ||
|
|
413271546f | ||
|
|
75e3c4be7a | ||
|
|
7891347d90 | ||
|
|
0a9b1c5c97 | ||
|
|
89d86aa6e3 | ||
|
|
fd45dacad2 | ||
|
|
a336f0968a | ||
|
|
df852ace9b | ||
|
|
9d6ae6952c | ||
|
|
19c6f98ea4 | ||
|
|
dbc1674416 | ||
|
|
3e8c0ed14e | ||
|
|
5f8ee45f1e | ||
|
|
5f3e1fb395 | ||
|
|
4befb0a16a | ||
|
|
aab55966a8 | ||
|
|
746c29c6f6 | ||
|
|
0c31f14b15 | ||
|
|
e565426291 | ||
|
|
6f115e44e3 | ||
|
|
dd161c2d53 | ||
|
|
50500ab204 | ||
|
|
169c406f03 | ||
|
|
985691958f | ||
|
|
d972b2f998 | ||
|
|
5dc03a71f6 | ||
|
|
6535dd950a | ||
|
|
840d7f50ee | ||
|
|
1d7da21e69 | ||
|
|
c33adf3a8b | ||
|
|
c39eeb69f4 | ||
|
|
32d6811884 | ||
|
|
fa7eb0d98c | ||
|
|
242fa3fed8 | ||
|
|
9364992979 | ||
|
|
488f9b995a | ||
|
|
05f58f86c2 | ||
|
|
3fa3f06a02 | ||
|
|
0a80269670 | ||
|
|
5e2373c656 | ||
|
|
60b95b6fa5 | ||
|
|
77d7bb0fe4 | ||
|
|
bf78e68831 | ||
|
|
49a6dd826a | ||
|
|
b0d80d6c96 | ||
|
|
ca1f008319 | ||
|
|
d22d7cc5b4 | ||
|
|
1ceba8973f | ||
|
|
558daea446 | ||
|
|
6f5a298a5c | ||
|
|
e016d48584 | ||
|
|
9540a4b3eb | ||
|
|
e7234daff6 | ||
|
|
7fbc2b5143 | ||
|
|
9d50dae3d1 | ||
|
|
655a467193 | ||
|
|
cbc6c56c9e | ||
|
|
360de79482 | ||
|
|
8e7ceae7e1 | ||
|
|
92221e0e98 | ||
|
|
27285e3e7f | ||
|
|
04612d58f3 | ||
|
|
ffd5dbb717 | ||
|
|
d7242d2895 | ||
|
|
51c2a418ce | ||
|
|
882a5921e8 | ||
|
|
9b58e229d6 | ||
|
|
d357c2cbcb | ||
|
|
5621326c43 | ||
|
|
9fd2b3f1d6 | ||
|
|
a89d428699 | ||
|
|
91eda647fa | ||
|
|
c0da612281 | ||
|
|
7dc76fdeb3 | ||
|
|
7e11497c64 | ||
|
|
81978f025b | ||
|
|
8dc3eaafc7 | ||
|
|
c0af1abf9f | ||
|
|
b2d56c339c | ||
|
|
bc49537e16 | ||
|
|
c4c59e6aa5 | ||
|
|
de3cac46fb | ||
|
|
995ad49336 | ||
|
|
1abe38f97b | ||
|
|
ff7fa49baa | ||
|
|
92b2612350 | ||
|
|
ba17f0d35f | ||
|
|
5a628b4c39 | ||
|
|
0b46516ed1 | ||
|
|
715b5d1a08 | ||
|
|
44ca37207f | ||
|
|
cd363e4ef7 | ||
|
|
9d234fa556 | ||
|
|
47e49993ad | ||
|
|
7afdbd2d4b | ||
|
|
38e699aa44 | ||
|
|
2b26e47876 | ||
|
|
2f07f33a71 | ||
|
|
eaec3612aa | ||
|
|
db0c2a0cc2 | ||
|
|
c431cf7b1e | ||
|
|
a5dd0eb924 | ||
|
|
466d91fcbf | ||
|
|
e1a3077780 | ||
|
|
5936ced1d7 | ||
|
|
3d6967d3c7 | ||
|
|
449a8cdb53 | ||
|
|
c91d4a9515 | ||
|
|
793f059f3c | ||
|
|
7200e87886 | ||
|
|
a1dc5c8340 | ||
|
|
2345e7efcc | ||
|
|
d32ed6309c | ||
|
|
72e9481946 | ||
|
|
f3ba7ef121 | ||
|
|
e9aca93f70 | ||
|
|
6f8e3bca29 | ||
|
|
49349848b8 | ||
|
|
bfe1afda4b | ||
|
|
bd54020c9c | ||
|
|
605d44f2c2 | ||
|
|
5c42b441fd | ||
|
|
2211232652 | ||
|
|
4ef8c40a83 | ||
|
|
99ca941c73 | ||
|
|
e5b977ff1a | ||
|
|
0e381ac098 | ||
|
|
ace08a5673 | ||
|
|
de00622235 | ||
|
|
e652b5773d | ||
|
|
ae1f6393b7 | ||
|
|
ddb0ad4dda | ||
|
|
83bc1292ea | ||
|
|
39075b843e | ||
|
|
7db59cc3bd | ||
|
|
5e5f35b306 | ||
|
|
65ef2076eb | ||
|
|
e8f6bbd742 | ||
|
|
5256bf1267 | ||
|
|
d2a5dfcdc0 | ||
|
|
124eb876de | ||
|
|
7b1f50b183 | ||
|
|
2c9705e230 | ||
|
|
b78d05611d | ||
|
|
4574e9ae65 | ||
|
|
4508f47c93 | ||
|
|
683d62f9e0 | ||
|
|
217b1cc561 | ||
|
|
b72f90551e | ||
|
|
30b146a59d | ||
|
|
1e4afe36be | ||
|
|
a76ec37e63 | ||
|
|
c3f397b508 | ||
|
|
d4f5b1c0ca | ||
|
|
ae4680f546 | ||
|
|
b0c14c686c | ||
|
|
4a59c02340 | ||
|
|
9754515ec6 | ||
|
|
f810cdb090 | ||
|
|
af8cfa8b3d | ||
|
|
c9de2b2bf1 | ||
|
|
f3bd112f3e | ||
|
|
2d3bd8c2af | ||
|
|
8a9a59fd3c | ||
|
|
c738f55078 | ||
|
|
2e39aa7f7f | ||
|
|
c65aaf03eb | ||
|
|
d3e18cb8c0 | ||
|
|
8de519ad3f | ||
|
|
d06c735585 | ||
|
|
c820a01db0 | ||
|
|
0d6f6221cb | ||
|
|
77e6070e78 | ||
|
|
46c5849842 | ||
|
|
72bca5b6fc | ||
|
|
94d12f69fe | ||
|
|
1f68bab455 | ||
|
|
390d214976 | ||
|
|
5b40c8bab2 | ||
|
|
7eee9117c0 | ||
|
|
49e1b6ac00 | ||
|
|
d356ad3a3d | ||
|
|
0f38eb5bca | ||
|
|
1d3e54a54a | ||
|
|
4792b14051 | ||
|
|
66d87d68de | ||
|
|
5d60825c7d | ||
|
|
4ca40b59d9 | ||
|
|
a9b6e02a71 | ||
|
|
055eaab819 | ||
|
|
1f467a72a6 | ||
|
|
14ee434e13 | ||
|
|
d317a4488e | ||
|
|
3b78d68ed0 | ||
|
|
2d234931d7 | ||
|
|
ff01cc1551 | ||
|
|
4ae49291ad | ||
|
|
268f219754 | ||
|
|
6d819a0507 | ||
|
|
41e0c1bf2d | ||
|
|
db8b5ab631 | ||
|
|
d7c531d51f | ||
|
|
03f690e450 | ||
|
|
6ffc6b98e5 | ||
|
|
a99865e0c6 | ||
|
|
2c7d5a937f | ||
|
|
37c9c7970a | ||
|
|
a9c1c318dc | ||
|
|
4e74e85976 | ||
|
|
30f9e506b2 | ||
|
|
72b17e3c04 | ||
|
|
ca00521ba8 | ||
|
|
3f289b1deb | ||
|
|
cbd86be78c | ||
|
|
c62e1bcc28 | ||
|
|
6c91bc273e | ||
|
|
76d9fae579 | ||
|
|
76de1f6076 | ||
|
|
b1971f90be | ||
|
|
e702d0088d | ||
|
|
332a0a6e1b | ||
|
|
58bf92eeab | ||
|
|
7787d749c9 | ||
|
|
b075145090 | ||
|
|
afe7fff061 | ||
|
|
6f3abd0986 | ||
|
|
2da2c41011 | ||
|
|
252a223e89 | ||
|
|
dcf8b22592 | ||
|
|
5c1dbfff7b | ||
|
|
e8c9ae1a64 | ||
|
|
b1f9796e21 | ||
|
|
02847c428d | ||
|
|
7552038d48 | ||
|
|
84d6a8b110 | ||
|
|
e9be40848a | ||
|
|
d8dd485d3f | ||
|
|
b27924bd4a | ||
|
|
be61d2d2ad | ||
|
|
647989944e | ||
|
|
e80facfd3b | ||
|
|
43dbc87a1e | ||
|
|
4b4ef77d4e | ||
|
|
cb431c0b5f | ||
|
|
f56960d15b | ||
|
|
41017342c9 | ||
|
|
9b218bb4f7 | ||
|
|
fbe37cf81a | ||
|
|
6ec091dfa5 | ||
|
|
e6a9c8e32e | ||
|
|
ba034be048 | ||
|
|
157fe0435b | ||
|
|
1123d10b05 | ||
|
|
8f7fa9a324 | ||
|
|
7cf60159c4 | ||
|
|
c5add81e90 | ||
|
|
5a6ada47b9 | ||
|
|
f4336c9227 | ||
|
|
123562c672 | ||
|
|
493101850e | ||
|
|
6bba26a848 | ||
|
|
46474f67b8 | ||
|
|
14f0a4643c | ||
|
|
037e667411 | ||
|
|
0a25c286cd | ||
|
|
5561270a60 | ||
|
|
1d499bbce8 | ||
|
|
6e8bf6999c | ||
|
|
5da8977ec0 | ||
|
|
fcb32062d3 | ||
|
|
9e74c7fd18 | ||
|
|
d3d73cc30d | ||
|
|
d9f76677c0 | ||
|
|
151999c2cd | ||
|
|
0460f17c1f | ||
|
|
2c69513d2b | ||
|
|
617efe6a58 | ||
|
|
2734f1d00c | ||
|
|
e66069b270 | ||
|
|
a661575451 | ||
|
|
a23017cd1f | ||
|
|
0df19ce18a | ||
|
|
5a751546ec | ||
|
|
ee9e1cabc1 | ||
|
|
d78b46155f | ||
|
|
1afd61d517 | ||
|
|
97a5083ff5 | ||
|
|
0d31e74790 | ||
|
|
02214196f4 | ||
|
|
aae268cfc5 | ||
|
|
20f37d8799 | ||
|
|
0b825bcda3 | ||
|
|
aba3bd22c7 | ||
|
|
b1fc33f5a1 | ||
|
|
f2033f5e33 | ||
|
|
6c600b7bdb | ||
|
|
e93bfb7f0f | ||
|
|
8976909742 | ||
|
|
30a9c2f53e | ||
|
|
ea60790865 | ||
|
|
f906fac8f3 | ||
|
|
05b324a3cb | ||
|
|
8ce1c7ccf5 | ||
|
|
a37f93241f | ||
|
|
6689663ca9 | ||
|
|
959b81a58f | ||
|
|
62e607b44e | ||
|
|
407bb6b977 | ||
|
|
a9efd327b8 | ||
|
|
64cb4d2ff8 | ||
|
|
54786fa82e | ||
|
|
ecab1b7825 | ||
|
|
75d7106f46 | ||
|
|
6f82c09afa | ||
|
|
778e5e219c | ||
|
|
f4682e0bd2 | ||
|
|
906d487ffc | ||
|
|
817b801bf7 | ||
|
|
e401b11ab9 | ||
|
|
165f70e01d | ||
|
|
fddfbfb4ed | ||
|
|
03e229c511 | ||
|
|
0b08372407 | ||
|
|
6d26b5de20 | ||
|
|
ef179410f9 | ||
|
|
194f6e019a | ||
|
|
1f933827b9 | ||
|
|
28765bb2ce | ||
|
|
136391db04 | ||
|
|
0cc39e71fc | ||
|
|
d65cc08793 | ||
|
|
a1729a0266 | ||
|
|
8505634df3 | ||
|
|
02047c1ec0 | ||
|
|
068fa4b2ef | ||
|
|
bfd266a40e | ||
|
|
6367d4e2aa | ||
|
|
f8a680f381 | ||
|
|
81750e6eb9 | ||
|
|
818cf682bf | ||
|
|
3112a0650f | ||
|
|
747ef94f04 | ||
|
|
dbacada48c | ||
|
|
26db8a40cc | ||
|
|
6e5feda00e | ||
|
|
f04330074b | ||
|
|
80d733d329 | ||
|
|
0099dcf5c5 | ||
|
|
0a30551b7d | ||
|
|
e4ee0227fd | ||
|
|
4ec7168499 | ||
|
|
650647e94b | ||
|
|
a5371f4b5d | ||
|
|
d47e7fb3c4 | ||
|
|
ef983e17fe | ||
|
|
d78975be6e | ||
|
|
19a264870c | ||
|
|
ee1753de67 | ||
|
|
742354b2cb | ||
|
|
e2f6aaa4de | ||
|
|
abc2911059 | ||
|
|
d76caf7093 | ||
|
|
bf859f8435 | ||
|
|
b31c10cc52 | ||
|
|
89e3c7d8b0 | ||
|
|
167b09f24f | ||
|
|
39165266d5 | ||
|
|
7405f2de75 | ||
|
|
762fe87454 | ||
|
|
ebbc81b605 | ||
|
|
12d41aada1 | ||
|
|
61fe9c23ce | ||
|
|
945c9c60a9 | ||
|
|
8413b0392e | ||
|
|
868edcd392 | ||
|
|
a3b2f9b6fc | ||
|
|
12b444bb41 | ||
|
|
0e814fd567 | ||
|
|
7b083aa038 | ||
|
|
4e0a4c84b5 | ||
|
|
2d9b47e645 | ||
|
|
39a2182736 | ||
|
|
5a996abbf3 | ||
|
|
a20def5161 | ||
|
|
030f370290 | ||
|
|
f3ade3cb82 | ||
|
|
315cb6a1ac | ||
|
|
60615d32f5 | ||
|
|
1d27d9cf5b | ||
|
|
2ba760d0f9 | ||
|
|
c31ec3b418 | ||
|
|
d0afab9604 | ||
|
|
4e9f8fe1c0 | ||
|
|
803f93aa73 | ||
|
|
853940d009 | ||
|
|
6ddb746d49 | ||
|
|
2b86b15132 | ||
|
|
5f0f5d0aa5 | ||
|
|
136aab872a | ||
|
|
a1d4702af0 | ||
|
|
b2777c13b8 | ||
|
|
26cb473b9d | ||
|
|
907c639e28 | ||
|
|
80d2eafed7 | ||
|
|
519122e5be | ||
|
|
c211768d5c | ||
|
|
908f318eeb | ||
|
|
0143f93577 | ||
|
|
f8615aeb82 | ||
|
|
b113448a9c | ||
|
|
2930a11c75 | ||
|
|
982de7f5c7 | ||
|
|
bfdb5e9787 | ||
|
|
d5ea945c6b | ||
|
|
5a18d038a2 | ||
|
|
d0389d6c9c | ||
|
|
c9bc6e24fe | ||
|
|
8b4a8e9534 | ||
|
|
5adfd00509 | ||
|
|
4090e038ae | ||
|
|
f3ab282fd1 | ||
|
|
40b97d3c1e | ||
|
|
829b97270d | ||
|
|
61111c8038 | ||
|
|
1f4fbaa177 | ||
|
|
9e8ef7e875 | ||
|
|
190d90a966 | ||
|
|
5a07c82a5d | ||
|
|
9c2e56ee8b | ||
|
|
c83f194dc9 | ||
|
|
b9bcb66d2a | ||
|
|
b72050da1d | ||
|
|
82522ad6ab | ||
|
|
d40e2e6103 | ||
|
|
96715770a7 | ||
|
|
48fa67c2e4 | ||
|
|
9a6217f755 | ||
|
|
f1f035b5f9 | ||
|
|
19aa53effc | ||
|
|
be7cb4583c | ||
|
|
887891f74d | ||
|
|
d83cd34bf4 | ||
|
|
bee41a90f9 | ||
|
|
79afe9d812 | ||
|
|
9fe55c5692 | ||
|
|
feddce2575 | ||
|
|
4ddc5e3a93 | ||
|
|
f63f1764ab | ||
|
|
7c694e9733 | ||
|
|
21b6977387 | ||
|
|
408735399c | ||
|
|
f6c856d161 | ||
|
|
8173cf13a8 | ||
|
|
7d0becf1bd | ||
|
|
9b4a87ce68 | ||
|
|
464c4d349d | ||
|
|
a35d3131f8 | ||
|
|
9d99d3c331 | ||
|
|
b100516b24 | ||
|
|
8da5396443 | ||
|
|
5d2a727311 | ||
|
|
d7f03215e2 | ||
|
|
d366471e71 | ||
|
|
e5163f154a | ||
|
|
cfc497d8ed | ||
|
|
35f8ab0257 | ||
|
|
e890743c86 | ||
|
|
ffec6e307d | ||
|
|
7c35db7eaa | ||
|
|
9f0c2296bc | ||
|
|
6b0a06c64d | ||
|
|
160186931f | ||
|
|
22c4a14fbe | ||
|
|
241a82764b | ||
|
|
6e4d48bb07 | ||
|
|
7a383f419a | ||
|
|
933b99d349 | ||
|
|
72d78084f6 | ||
|
|
fcee4d2774 | ||
|
|
61c7f3bc13 | ||
|
|
3830637f3c | ||
|
|
45f8049521 | ||
|
|
823774bcfe | ||
|
|
920e5211c0 | ||
|
|
7da61e3d8d | ||
|
|
754b60b15c | ||
|
|
839454bfd6 | ||
|
|
3b6a0667d6 | ||
|
|
f298adaea8 | ||
|
|
641206b811 | ||
|
|
93a94b4900 | ||
|
|
40363c2ea1 | ||
|
|
6f15d65d90 | ||
|
|
02f9b21cff | ||
|
|
79cf154304 | ||
|
|
a650683d45 | ||
|
|
311dc3dc9c | ||
|
|
bda1f80ecc | ||
|
|
817796bf40 | ||
|
|
8a48eeab8b | ||
|
|
0061104c0d | ||
|
|
5110a1be17 | ||
|
|
4cbb998106 | ||
|
|
17de3f496c | ||
|
|
b54181e93a | ||
|
|
eaf7edcd94 | ||
|
|
cdf1631e2b | ||
|
|
841f49553e | ||
|
|
57d7d5a1b9 | ||
|
|
b1f2ab2ed7 | ||
|
|
f629d95844 | ||
|
|
30904fbdda | ||
|
|
9a3be6a85a | ||
|
|
88c91d9bdd | ||
|
|
5d2efe3e6b | ||
|
|
d6354d3d94 | ||
|
|
4ddfdd828c | ||
|
|
06b70c6204 | ||
|
|
2dc9d11f79 | ||
|
|
fbb161c511 | ||
|
|
f84bc62d61 | ||
|
|
2e20554d1e | ||
|
|
bb9fcc64ed | ||
|
|
2d908468ea | ||
|
|
c9ae148d86 |
@@ -8,15 +8,104 @@
|
||||
- Added molang particle queries for getting distance to targeted entities.
|
||||
- Added debug renderer for poseable entity locators.
|
||||
- Added `baseScale` property to NPCs.
|
||||
- Added cry for Spinda.
|
||||
- Added the player to `PokerodReelEvent`.
|
||||
- Pokédex and Dialogue API screens now close when the inventory keybind is pressed.
|
||||
- Added Galarica Nuts, used for crafting Galarica Cuffs and Wreaths. Dropped from certain Pokémon.
|
||||
- Added specific compatibility with Repurposed Structures. (Thank you, TelepathicGrunt!)
|
||||
- Added an evolution method for Karrablast to evolve into Escavalier in single-player mode.
|
||||
- Pokédexes can now be placed in Chiseled Bookshelves.
|
||||
- Added crossover paintings from Close Combat, Premonition, Altar, Slumber, and Nomad.
|
||||
- Added optional box argument to the /pc command
|
||||
|
||||
### Changes
|
||||
- Pokémon will now be dynamically revealed to the Pokédex as they're seen instead of revealing entire parties at the end of battle regardless.
|
||||
- Unseen wild Pokémon will update their name from '???' to their real name as soon as a battle starts to reflect the battle UI showing the actual species name.
|
||||
- Pokémon under the illusion effect will reveal their disguise to the Pokédex first and then the base Pokémon once the disguise is broken.
|
||||
- Added more support for a variety of Fabric/NeoForge Convention tags.
|
||||
- Reformatted some tags to be more consistent.
|
||||
- Edited some recipes to utilize tags instead of direct item ids, for greater mod compatibility.
|
||||
- Berries will drop if broken at age 0
|
||||
- Improved Fortune drops on Mint Seeds
|
||||
- New Slowpoke shiny texture.
|
||||
- Updated drops for many Pokémon.
|
||||
- Completely resynced Pokémon move and stat data based on later games. Learnsets have changed considerably to maximise available moves.
|
||||
|
||||
### Pokémon Added
|
||||
|
||||
#### Gen 5
|
||||
- Ducklett
|
||||
- Swanna
|
||||
- Shelmet
|
||||
- Accelgor
|
||||
- Karrablast
|
||||
- Escavalier
|
||||
- Rufflet
|
||||
- Braviary
|
||||
- Foongus
|
||||
- Amoonguss
|
||||
|
||||
#### Gen 6
|
||||
- Binacle
|
||||
- Barbaracle
|
||||
|
||||
#### Gen 7
|
||||
- Dewpider
|
||||
- Araquanid
|
||||
- Alolan Geodude
|
||||
- Alolan Graveler
|
||||
- Alolan Golem
|
||||
|
||||
#### Gen 8
|
||||
- Galarian Slowpoke
|
||||
- Galarian Slowbro
|
||||
- Galarian Slowking
|
||||
|
||||
#### Gen 9
|
||||
- Paldean Tauros's
|
||||
|
||||
### Added cries to the following Pokémon
|
||||
- All Nidorans
|
||||
- Shellder, Cloyster
|
||||
- Pinsir
|
||||
- Tyrogue, Hitmontop
|
||||
- Spinda
|
||||
|
||||
### Animation updates for the following Pokémon
|
||||
- Primeape
|
||||
- Munchlax
|
||||
- Snorlax
|
||||
- Poliwrath
|
||||
- Goldeen
|
||||
- Seaking
|
||||
- Dondozo
|
||||
- Wobbuffet
|
||||
- Charcadet
|
||||
- Armarouge
|
||||
- Ceruledge
|
||||
- Geodude
|
||||
- Graveler
|
||||
- Golem
|
||||
- Sandile
|
||||
- Krokorok
|
||||
- Krookodile
|
||||
|
||||
### Model updates for the following Pokémon
|
||||
- Slowpoke
|
||||
- Slowbro
|
||||
- Slowking
|
||||
- Eiscue
|
||||
- Tauros
|
||||
- Goldeen
|
||||
- Seaking
|
||||
- Charcadet
|
||||
- Pinsir
|
||||
- Geodude
|
||||
- Graveler
|
||||
- Golem
|
||||
|
||||
### Cry updates for the following Pokémon
|
||||
- Sceptile
|
||||
|
||||
### Fixes
|
||||
- Fixed Pokédex sometimes crashing when switching forms.
|
||||
@@ -63,6 +152,12 @@
|
||||
- Fixed Vivichoke Dip and Leek and Potato Stew not returning a bowl upon consumption.
|
||||
- Fixed Fossil Restoration Machine not accepting Hay Bales.
|
||||
- Fixed Potion items so that they no longer apply over double their intended healing value.
|
||||
- Fixed Fast Ball capture rate applying to all Pokémon.
|
||||
- Fix "learned new move" messages appearing for already known moves on Pokémon evolutions.
|
||||
- Fix Pokémon Item Models breaking shadows nearby when being placed in Display Cases or Item Frames.
|
||||
|
||||
### Developer
|
||||
- Updated the Pokédex data updated events to always include a Pokemon instance, and optionally a DisguiseData instance.
|
||||
|
||||
### Molang & Datapacks
|
||||
- Added flows for:
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
plugins {
|
||||
id("java-gradle-plugin")
|
||||
kotlin("jvm") version "2.1.0"
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
gradlePluginPortal()
|
||||
maven("https://maven.architectury.dev/")
|
||||
maven("https://maven.fabricmc.net/")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation("net.neoforged:moddev-gradle:2.0.75")
|
||||
implementation("dev.architectury:at:1.0.1")
|
||||
implementation("net.fabricmc:access-widener:2.1.0")
|
||||
}
|
||||
|
||||
gradlePlugin {
|
||||
plugins {
|
||||
create("cobblemongradle") {
|
||||
id = "com.cobblemon.gradle"
|
||||
implementationClass = "com.cobblemon.gradle.CobblemonGradle"
|
||||
version = "1.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
dependencyResolutionManagement {
|
||||
versionCatalogs {
|
||||
create("libs") {
|
||||
from(files("../gradle/libs.versions.toml"))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,85 +0,0 @@
|
||||
package com.cobblemon.gradle
|
||||
|
||||
import com.cobblemon.gradle.extension.CobblemonGradleExtension
|
||||
import com.cobblemon.gradle.extension.tasks.ConvertAccessWidenersTask
|
||||
import com.cobblemon.gradle.extension.tasks.UnzipAccessWidenersTask
|
||||
import net.neoforged.nfrtgradle.CreateMinecraftArtifacts
|
||||
import org.gradle.api.Plugin
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.attributes.LibraryElements
|
||||
import org.gradle.language.jvm.tasks.ProcessResources
|
||||
|
||||
class CobblemonGradle : Plugin<Project> {
|
||||
override fun apply(project: Project) {
|
||||
val cobblemonExtension = project.extensions.create(
|
||||
CobblemonGradleExtension.EXTENSION_NAME,
|
||||
CobblemonGradleExtension::class.java
|
||||
)
|
||||
|
||||
//This exists because all of
|
||||
// - com.cobblemon:mod
|
||||
// - com.cobblemon:mod-resources
|
||||
// - com.cobblemon:accesswidener
|
||||
//technically point to the same dependency (the :common project). To pick the proper artifact from that project
|
||||
//we set attributes in that project and check for them here.
|
||||
val accessWideners = project.configurations.register("accessWidener") { configuration ->
|
||||
configuration.isCanBeConsumed = false
|
||||
configuration.isCanBeResolved = true
|
||||
configuration.isCanBeDeclared = true
|
||||
configuration.attributes {
|
||||
it.attribute(
|
||||
LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE,
|
||||
project.objects.named(LibraryElements::class.java, LibraryElements.OBJECTS)
|
||||
)
|
||||
}
|
||||
}
|
||||
val includeRootResources = project.configurations.register("includeRootResources") { configuration ->
|
||||
configuration.isCanBeConsumed = false
|
||||
configuration.isCanBeResolved = true
|
||||
configuration.isCanBeDeclared = true
|
||||
configuration.attributes {
|
||||
it.attribute(
|
||||
LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE,
|
||||
project.objects.named(LibraryElements::class.java, LibraryElements.RESOURCES)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
val unzipAwTask = project.tasks.register("unzipAccessWideners", UnzipAccessWidenersTask::class.java) {
|
||||
it.accessWidenerZips = accessWideners.get()
|
||||
}
|
||||
|
||||
|
||||
val convertAwTask = project.tasks.register(ConvertAccessWidenersTask.NAME, ConvertAccessWidenersTask::class.java) {
|
||||
it.enabled = cobblemonExtension.convertAccessWideners
|
||||
it.dependsOn(unzipAwTask)
|
||||
it.accessWideners = project.files(unzipAwTask).plus(project.files(cobblemonExtension.additionalAccessWideners))
|
||||
}
|
||||
|
||||
//Add root resources and access wideners to output jar
|
||||
project.tasks.named("processResources", ProcessResources::class.java) { task ->
|
||||
task.dependsOn(includeRootResources)
|
||||
if (cobblemonExtension.convertAccessWideners) {
|
||||
task.dependsOn(convertAwTask)
|
||||
task.from(convertAwTask)
|
||||
}
|
||||
else {
|
||||
task.dependsOn(unzipAwTask)
|
||||
task.from(unzipAwTask)
|
||||
}
|
||||
task.doLast {
|
||||
project.copy {
|
||||
it.from(project.provider {
|
||||
includeRootResources.get().resolve().map { project.zipTree(it) }
|
||||
})
|
||||
it.into(task.destinationDir)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
project.tasks.withType(CreateMinecraftArtifacts::class.java) {
|
||||
it.dependsOn(convertAwTask)
|
||||
it.accessTransformers.from(convertAwTask)
|
||||
}
|
||||
}
|
||||
}
|
||||
-12
@@ -1,12 +0,0 @@
|
||||
package com.cobblemon.gradle.extension
|
||||
|
||||
import org.gradle.api.file.FileCollection
|
||||
|
||||
abstract class CobblemonGradleExtension {
|
||||
var additionalAccessWideners: FileCollection? = null
|
||||
var convertAccessWideners = true
|
||||
|
||||
companion object {
|
||||
const val EXTENSION_NAME = "cobblemon"
|
||||
}
|
||||
}
|
||||
-82
@@ -1,82 +0,0 @@
|
||||
package com.cobblemon.gradle.extension.tasks
|
||||
|
||||
import dev.architectury.at.AccessChange
|
||||
import dev.architectury.at.AccessTransform
|
||||
import dev.architectury.at.AccessTransformSet
|
||||
import dev.architectury.at.ModifierChange
|
||||
import dev.architectury.at.io.AccessTransformFormats
|
||||
import net.fabricmc.accesswidener.AccessWidenerReader
|
||||
import net.fabricmc.accesswidener.AccessWidenerVisitor
|
||||
import org.cadixdev.bombe.type.signature.MethodSignature
|
||||
import org.gradle.api.DefaultTask
|
||||
import org.gradle.api.file.FileCollection
|
||||
import org.gradle.api.tasks.InputFiles
|
||||
import org.gradle.api.tasks.Internal
|
||||
import org.gradle.api.tasks.OutputFiles
|
||||
import org.gradle.api.tasks.TaskAction
|
||||
import java.io.Writer
|
||||
import java.nio.file.Files
|
||||
|
||||
abstract class ConvertAccessWidenersTask : DefaultTask() {
|
||||
abstract var accessWideners: FileCollection
|
||||
@InputFiles get
|
||||
|
||||
@Internal
|
||||
val accessTransformerDir = project.layout.buildDirectory.dir("access-transformers")
|
||||
|
||||
@OutputFiles
|
||||
val accessTransformers = project.files ({
|
||||
accessWideners.files.map {
|
||||
accessTransformerDir.get().file(it.name.replace("accesswidener", "accesstransformer.cfg"))
|
||||
}
|
||||
})
|
||||
|
||||
@TaskAction
|
||||
fun convertAccessWideners() {
|
||||
accessWideners.files.forEach { file ->
|
||||
val awFile = Files.newBufferedReader(file.toPath())
|
||||
val result = AccessTransformSet.create();
|
||||
|
||||
AccessWidenerReader(object : AccessWidenerVisitor {
|
||||
override fun visitClass(name: String, access: AccessWidenerReader.AccessType, transitive: Boolean) {
|
||||
result.getOrCreateClass(name).merge(toAt(access));
|
||||
}
|
||||
|
||||
override fun visitMethod(owner: String, name: String, descriptor: String, access: AccessWidenerReader.AccessType, transitive: Boolean) {
|
||||
result.getOrCreateClass(owner).mergeMethod(MethodSignature.of(name, descriptor), toAt(access));
|
||||
}
|
||||
|
||||
override fun visitField(owner: String, name: String, descriptor: String, access: AccessWidenerReader.AccessType, transitive: Boolean) {
|
||||
result.getOrCreateClass(owner).mergeField(name, toAt(access));
|
||||
}
|
||||
}).read(awFile)
|
||||
|
||||
val outputFile = accessTransformerDir.get().file(
|
||||
file.name.replace("accesswidener", "accesstransformer.cfg")
|
||||
)
|
||||
var outputWriter: Writer? = null
|
||||
try {
|
||||
outputWriter = outputFile.asFile.writer()
|
||||
AccessTransformFormats.FML.write(outputWriter, result)
|
||||
}
|
||||
finally {
|
||||
outputWriter?.flush()
|
||||
outputWriter?.close()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private fun toAt(access: AccessWidenerReader.AccessType): AccessTransform {
|
||||
return when (access) {
|
||||
AccessWidenerReader.AccessType.ACCESSIBLE -> AccessTransform.of(AccessChange.PUBLIC)
|
||||
AccessWidenerReader.AccessType.EXTENDABLE, AccessWidenerReader.AccessType.MUTABLE -> AccessTransform.of(
|
||||
AccessChange.PUBLIC,
|
||||
ModifierChange.REMOVE
|
||||
)
|
||||
}
|
||||
}
|
||||
companion object {
|
||||
const val NAME = "convertAccessWideners"
|
||||
}
|
||||
}
|
||||
-33
@@ -1,33 +0,0 @@
|
||||
package com.cobblemon.gradle.extension.tasks
|
||||
|
||||
import org.gradle.api.DefaultTask
|
||||
import org.gradle.api.Task
|
||||
import org.gradle.api.file.FileCollection
|
||||
import org.gradle.api.tasks.InputFiles
|
||||
import org.gradle.api.tasks.Internal
|
||||
import org.gradle.api.tasks.OutputFile
|
||||
import org.gradle.api.tasks.OutputFiles
|
||||
import org.gradle.api.tasks.TaskAction
|
||||
|
||||
abstract class UnzipAccessWidenersTask : DefaultTask() {
|
||||
abstract var accessWidenerZips: FileCollection
|
||||
@InputFiles get
|
||||
|
||||
@OutputFiles
|
||||
val outputFiles = project.provider {
|
||||
project.files(accessWidenerZips.flatMap { zip ->
|
||||
project.zipTree(zip).files.map { OUTPUT_DIR.get().file(it.name) }
|
||||
})
|
||||
}
|
||||
|
||||
@Internal
|
||||
val OUTPUT_DIR = project.layout.buildDirectory.dir("cobblemon-working/access-wideners")
|
||||
|
||||
@TaskAction
|
||||
fun run() {
|
||||
project.copy {
|
||||
it.from(accessWidenerZips.map(project::zipTree))
|
||||
it.into(OUTPUT_DIR)
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-3
@@ -1,14 +1,12 @@
|
||||
plugins {
|
||||
//id("cobblemon.root-conventions")
|
||||
id("cobblemon.root-conventions")
|
||||
id ("net.nemerosa.versioning") version "3.1.0"
|
||||
}
|
||||
|
||||
version = "${project.property("mod_version")}+${project.property("mc_version")}"
|
||||
|
||||
val isSnapshot = project.property("snapshot")?.equals("true") ?: false
|
||||
/*
|
||||
if (isSnapshot) {
|
||||
val fixedBranchName = versioning.info.branch.substringAfter("/")
|
||||
version = "$version-${fixedBranchName}-${versioning.info.build}"
|
||||
}
|
||||
*/
|
||||
+54
-90
@@ -1,102 +1,68 @@
|
||||
import java.time.OffsetDateTime
|
||||
import java.time.ZoneOffset
|
||||
import java.time.format.DateTimeFormatter
|
||||
import utilities.isSnapshot
|
||||
import utilities.version
|
||||
|
||||
/*
|
||||
*
|
||||
* * Copyright (C) 2023 Cobblemon Contributors
|
||||
* *
|
||||
* * This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* * License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* * file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
*/
|
||||
|
||||
plugins {
|
||||
kotlin("jvm") version "2.1.0"
|
||||
id ("net.neoforged.moddev") version "2.0.75"
|
||||
id("net.kyori.blossom") version "2.1.0"
|
||||
id("com.github.johnrengelman.shadow") version "8.1.1"
|
||||
id("com.cobblemon.gradle")
|
||||
id("cobblemon.base-conventions")
|
||||
id("cobblemon.publish-conventions")
|
||||
|
||||
id("net.kyori.blossom")
|
||||
id("org.jetbrains.gradle.plugin.idea-ext")
|
||||
id("net.nemerosa.versioning") version "3.1.0"
|
||||
}
|
||||
|
||||
cobblemon {
|
||||
additionalAccessWideners = files(sourceSets.main.get().resources).filter { it.extension == "accesswidener" }
|
||||
}
|
||||
|
||||
val rootResources = configurations.create("rootResources") {
|
||||
isCanBeConsumed = true
|
||||
isCanBeResolved = false
|
||||
attributes {
|
||||
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.RESOURCES))
|
||||
}
|
||||
}
|
||||
|
||||
val accessWidenerExport = configurations.create("accessWidenerExport") {
|
||||
isCanBeConsumed = true
|
||||
isCanBeResolved = false
|
||||
attributes {
|
||||
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.OBJECTS))
|
||||
}
|
||||
}
|
||||
|
||||
tasks.processResources {
|
||||
exclude("*.accesswidener")
|
||||
}
|
||||
|
||||
tasks.create<Zip>("zipResources") {
|
||||
dependsOn("processResources")
|
||||
from(tasks.processResources.get().destinationDir)
|
||||
this.archiveBaseName = "mod-resources"
|
||||
}
|
||||
|
||||
tasks.create<Zip>("zipAccessWideners") {
|
||||
from(sourceSets.main.get().resources)
|
||||
include("*.accesswidener")
|
||||
this.archiveBaseName = "mod-accesswideners"
|
||||
}
|
||||
|
||||
tasks.jar {
|
||||
archiveBaseName = "mod"
|
||||
manifest {
|
||||
attributes(mapOf("FMLModType" to "GAMELIBRARY"))
|
||||
}
|
||||
exclude {
|
||||
it.file in tasks.processResources.get().outputs.files
|
||||
}
|
||||
}
|
||||
|
||||
tasks.assemble {
|
||||
dependsOn(tasks.named("zipResources"))
|
||||
dependsOn(tasks.named("zipAccessWideners"))
|
||||
}
|
||||
|
||||
artifacts {
|
||||
add("rootResources", tasks.getByName<Zip>("zipResources"))
|
||||
add("accessWidenerExport", tasks.getByName("zipAccessWideners"))
|
||||
}
|
||||
|
||||
buildscript {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
gradlePluginPortal()
|
||||
maven("https://maven.architectury.dev/")
|
||||
maven("https://maven.fabricmc.net/")
|
||||
}
|
||||
architectury {
|
||||
common("neoforge", "fabric")
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven("https://maven.fabricmc.net/")
|
||||
maven("https://maven.blamejared.com/")
|
||||
maven("https://api.modrinth.com/maven")
|
||||
maven(url = "../deps")
|
||||
maven(url = "${rootProject.projectDir}/deps")
|
||||
maven(url = "https://api.modrinth.com/maven")
|
||||
maven(url = "https://maven.neoforged.net/releases")
|
||||
mavenLocal()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly(libs.bundles.mongo)
|
||||
compileOnly(libs.bundles.kotlin)
|
||||
compileOnly(libs.molang)
|
||||
compileOnly(libs.graal)
|
||||
compileOnly(libs.jei.api)
|
||||
compileOnly(libs.bundles.fabric.integrations.compileOnly) {
|
||||
implementation(libs.bundles.kotlin)
|
||||
modImplementation(libs.fabric.loader)
|
||||
modApi(libs.molang)
|
||||
|
||||
// Integrations
|
||||
compileOnlyApi(libs.jei.api)
|
||||
modCompileOnly(libs.bundles.fabric.integrations.compileOnly) {
|
||||
isTransitive = false
|
||||
}
|
||||
compileOnly("net.fabricmc:sponge-mixin:0.15.5+mixin.0.8.7")
|
||||
compileOnly("io.github.llamalad7:mixinextras-fabric:0.4.1")
|
||||
// Flywheel has no common dep so just pick one and don't use any platform specific code in common
|
||||
// modCompileOnly(libs.flywheelFabric)
|
||||
|
||||
// Showdown
|
||||
modCompileOnly(libs.graal)
|
||||
|
||||
// Data Storage
|
||||
modCompileOnly(libs.bundles.mongo)
|
||||
|
||||
// Unit Testing
|
||||
testImplementation(libs.bundles.unitTesting)
|
||||
}
|
||||
|
||||
neoForge {
|
||||
neoFormVersion = "1.21.1-20240808.144430"
|
||||
interfaceInjectionData.from("src/main/resources/interfaces.json")
|
||||
validateAccessTransformers = true
|
||||
tasks.withType<Test> {
|
||||
useJUnitPlatform()
|
||||
testLogging {
|
||||
setEvents(listOf("failed"))
|
||||
setExceptionFormat("full")
|
||||
}
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
@@ -106,7 +72,7 @@ sourceSets {
|
||||
fun generateLicenseHeader() : String {
|
||||
val builder = StringBuilder()
|
||||
builder.append("/*\n")
|
||||
project.projectDir.parentFile.resolve("HEADER").forEachLine {
|
||||
rootProject.file("HEADER").forEachLine {
|
||||
if(it.isEmpty()) {
|
||||
builder.append(" *").append("\n")
|
||||
} else {
|
||||
@@ -119,14 +85,12 @@ sourceSets {
|
||||
|
||||
property("license", generateLicenseHeader())
|
||||
property("modid", "cobblemon")
|
||||
property("version", project.version as String)
|
||||
property("isSnapshot", "true")
|
||||
/*
|
||||
property("version", project.version())
|
||||
property("isSnapshot", if(rootProject.isSnapshot()) "true" else "false")
|
||||
property("gitCommit", versioning.info.commit)
|
||||
property("branch", versioning.info.branch)
|
||||
System.getProperty("buildNumber")?.let { property("buildNumber", it) }
|
||||
property("timestamp", OffsetDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss")) + " UTC")
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
import java.time.OffsetDateTime
|
||||
import java.time.ZoneOffset
|
||||
import java.time.format.DateTimeFormatter
|
||||
import utilities.isSnapshot
|
||||
import utilities.version
|
||||
|
||||
/*
|
||||
*
|
||||
* * Copyright (C) 2023 Cobblemon Contributors
|
||||
* *
|
||||
* * This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* * License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* * file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*
|
||||
*/
|
||||
|
||||
plugins {
|
||||
id("cobblemon.base-conventions")
|
||||
id("cobblemon.publish-conventions")
|
||||
|
||||
id("net.kyori.blossom")
|
||||
id("org.jetbrains.gradle.plugin.idea-ext")
|
||||
id("net.nemerosa.versioning") version "3.1.0"
|
||||
}
|
||||
|
||||
architectury {
|
||||
common("neoforge", "fabric")
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven(url = "${rootProject.projectDir}/deps")
|
||||
maven(url = "https://api.modrinth.com/maven")
|
||||
maven(url = "https://maven.neoforged.net/releases")
|
||||
mavenLocal()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(libs.bundles.kotlin)
|
||||
modImplementation(libs.fabric.loader)
|
||||
modApi(libs.molang)
|
||||
|
||||
// Integrations
|
||||
compileOnlyApi(libs.jei.api)
|
||||
modCompileOnly(libs.bundles.fabric.integrations.compileOnly) {
|
||||
isTransitive = false
|
||||
}
|
||||
// Flywheel has no common dep so just pick one and don't use any platform specific code in common
|
||||
// modCompileOnly(libs.flywheelFabric)
|
||||
|
||||
// Showdown
|
||||
modCompileOnly(libs.graal)
|
||||
|
||||
// Data Storage
|
||||
modCompileOnly(libs.bundles.mongo)
|
||||
|
||||
// Unit Testing
|
||||
testImplementation(libs.bundles.unitTesting)
|
||||
}
|
||||
|
||||
tasks.withType<Test> {
|
||||
useJUnitPlatform()
|
||||
testLogging {
|
||||
setEvents(listOf("failed"))
|
||||
setExceptionFormat("full")
|
||||
}
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main {
|
||||
blossom {
|
||||
kotlinSources {
|
||||
fun generateLicenseHeader() : String {
|
||||
val builder = StringBuilder()
|
||||
builder.append("/*\n")
|
||||
rootProject.file("HEADER").forEachLine {
|
||||
if(it.isEmpty()) {
|
||||
builder.append(" *").append("\n")
|
||||
} else {
|
||||
builder.append(" * ").append(it).append("\n")
|
||||
}
|
||||
}
|
||||
|
||||
return builder.append(" */").append("\n").toString()
|
||||
}
|
||||
|
||||
property("license", generateLicenseHeader())
|
||||
property("modid", "cobblemon")
|
||||
property("version", project.version())
|
||||
property("isSnapshot", if(rootProject.isSnapshot()) "true" else "false")
|
||||
property("gitCommit", versioning.info.commit)
|
||||
property("branch", versioning.info.branch)
|
||||
System.getProperty("buildNumber")?.let { property("buildNumber", it) }
|
||||
property("timestamp", OffsetDateTime.now(ZoneOffset.UTC).format(DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm:ss")) + " UTC")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,95 +0,0 @@
|
||||
[versions]
|
||||
# Kotlin
|
||||
kotlin = "2.0.0"
|
||||
|
||||
# Plugins
|
||||
licenser = "0.6.1"
|
||||
shadow = "8.1.1"
|
||||
blossom = "2.1.0"
|
||||
idea-ext = "1.1.7"
|
||||
|
||||
# Loom
|
||||
loom = "1.7-SNAPSHOT"
|
||||
architectury-plugin = "3.4-SNAPSHOT"
|
||||
|
||||
# Common
|
||||
molang = "1.1.18"
|
||||
graal = "22.3.0"
|
||||
icu4j = "71.1"
|
||||
jei-api = "19.8.2.99"
|
||||
|
||||
# Fabric
|
||||
fabric-loader = "0.16.5"
|
||||
fabric-api = "0.104.0+1.21.1"
|
||||
fabric-kotlin = "1.11.0+kotlin.2.0.0"
|
||||
fabric-permissions-api = "0.2-SNAPSHOT"
|
||||
lambDynamicLights = "3.0.1+1.21.1"
|
||||
debugutils-fabric = "1.21-1.0.6-fabric"
|
||||
|
||||
# NeoForge
|
||||
neoforge = "21.1.66"
|
||||
neo-kotlin-for-forge = "5.5.0"
|
||||
debugutils-forge = "1.21-1.0.6-neoforge"
|
||||
|
||||
# Data Storage
|
||||
mongo = "4.10.2"
|
||||
|
||||
# Testing
|
||||
junit = "5.9.0"
|
||||
mockito = "5.2.0"
|
||||
mockk = "1.12.1"
|
||||
classgraph = "4.8.153"
|
||||
|
||||
[libraries]
|
||||
# General Buildscript Plugins
|
||||
kotlin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" }
|
||||
loom = { group = "dev.architectury", name = "architectury-loom", version.ref = "loom" }
|
||||
architectury = { group = "architectury-plugin", name = "architectury-plugin.gradle.plugin", version.ref = "architectury-plugin" }
|
||||
shadow = { group = "com.github.johnrengelman", name = "shadow", version.ref = "shadow" }
|
||||
blossom = { group = "net.kyori", name = "blossom", version.ref = "blossom" }
|
||||
ideaExt = { group = "org.jetbrains.gradle.plugin.idea-ext", name = "org.jetbrains.gradle.plugin.idea-ext.gradle.plugin", version.ref = "idea-ext"}
|
||||
licenser = { group = "gradle.plugin.org.cadixdev.gradle", name = "licenser", version.ref = "licenser" }
|
||||
|
||||
# Kotlin
|
||||
kotlin-stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-jdk8", version.ref = "kotlin" }
|
||||
kotlin-reflect = { group = "org.jetbrains.kotlin", name = "kotlin-reflect", version.ref = "kotlin" }
|
||||
|
||||
# Common
|
||||
jei-api = { group = "mezz.jei", name = "jei-1.21-common-api", version.ref = "jei-api"}
|
||||
molang = { group = "local.com.bedrockk", name = "molang", version.ref = "molang" }
|
||||
graal = { group = "org.graalvm.js", name = "js", version.ref = "graal" }
|
||||
icu4j = { group = "com.ibm.icu", name = "icu4j", version.ref = "icu4j" }
|
||||
|
||||
# Fabric
|
||||
fabric-loader = { group = "net.fabricmc", name = "fabric-loader", version.ref = "fabric-loader" }
|
||||
fabric-api = { group = "net.fabricmc.fabric-api", name = "fabric-api", version.ref = "fabric-api" }
|
||||
fabric-kotlin = { group = "net.fabricmc", name = "fabric-language-kotlin", version.ref = "fabric-kotlin" }
|
||||
fabric-permissions = { group = "me.lucko", name = "fabric-permissions-api", version.ref = "fabric-permissions-api" }
|
||||
adorn-fabric = { group = "maven.modrinth", name = "adorn", version = "6.0.0-neoforge"}
|
||||
lambDynamicLights = { group = "maven.modrinth", name = "lambdynamiclights", version.ref = "lambDynamicLights"}
|
||||
jei-api-fabric = { group = "mezz.jei", name = "jei-1.21-fabric-api", version.ref = "jei-api" }
|
||||
jei-fabric = { group = "mezz.jei", name = "jei-1.21-fabric", version.ref = "jei-api"}
|
||||
fabric-debugutils = { group = "maven.modrinth", name = "debugutils", version.ref = "debugutils-fabric"}
|
||||
|
||||
# NeoForge
|
||||
neoforge = { group = "net.neoforged", name = "neoforge", version.ref = "neoforge" }
|
||||
neo-kotlin-forge = { group = "thedarkcolour", name = "kotlinforforge-neoforge", version.ref = "neo-kotlin-for-forge" }
|
||||
neoforge-debugutils = { group = "maven.modrinth", name = "debugutils", version.ref = "debugutils-forge"}
|
||||
|
||||
# Data Storage
|
||||
mongo-driver-core = { group = "org.mongodb", name = "mongodb-driver-core", version.ref = "mongo" }
|
||||
mongo-driver-sync = { group = "org.mongodb", name = "mongodb-driver-sync", version.ref = "mongo" }
|
||||
|
||||
# Testing
|
||||
junit = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junit" }
|
||||
mockito-core = { group = "org.mockito", name = "mockito-core", version.ref = "mockito" }
|
||||
mock-kotlin = { group = "io.mockk", name = "mockk", version.ref = "mockk" }
|
||||
classgraph = { group = "io.github.classgraph", name = "classgraph", version.ref = "classgraph" }
|
||||
|
||||
[bundles]
|
||||
kotlin = [ "kotlin-stdlib", "kotlin-reflect" ]
|
||||
fabric = [ "fabric-kotlin", "fabric-permissions" ]
|
||||
fabric-integrations-compileOnly = [ "adorn-fabric", "lambDynamicLights", "jei-api-fabric" ]
|
||||
fabric-integrations-runtimeOnly = [ "jei-fabric" ]
|
||||
mongo = [ "mongo-driver-core", "mongo-driver-sync" ]
|
||||
unitTesting = [ "junit", "mockito-core", "mock-kotlin", "classgraph" ]
|
||||
@@ -14,6 +14,7 @@ import com.cobblemon.mod.common.api.events.CobblemonEvents;
|
||||
import com.cobblemon.mod.common.api.events.item.LeftoversCreatedEvent;
|
||||
import com.cobblemon.mod.common.api.pokemon.PokemonSpecies;
|
||||
import com.cobblemon.mod.common.api.storage.party.PartyStore;
|
||||
import com.cobblemon.mod.common.api.storage.party.PlayerPartyStore;
|
||||
import com.cobblemon.mod.common.api.tags.CobblemonItemTags;
|
||||
import com.cobblemon.mod.common.pokedex.scanner.PokedexEntityData;
|
||||
import com.cobblemon.mod.common.pokedex.scanner.ScannableEntity;
|
||||
@@ -178,10 +179,10 @@ public abstract class PlayerMixin extends LivingEntity implements ScannableEntit
|
||||
|
||||
@Override @Nullable
|
||||
public PokedexEntityData resolvePokemonScan() {
|
||||
if(CompoundTagUtilities.isShoulderPokemon(this.getShoulderEntityRight())){
|
||||
if (CompoundTagUtilities.isShoulderPokemon(this.getShoulderEntityRight())){
|
||||
return getDataFromShoulderPokemon(this.getShoulderEntityRight());
|
||||
}
|
||||
if(CompoundTagUtilities.isShoulderPokemon(this.getShoulderEntityLeft())){
|
||||
if (CompoundTagUtilities.isShoulderPokemon(this.getShoulderEntityLeft())){
|
||||
return getDataFromShoulderPokemon(this.getShoulderEntityLeft());
|
||||
}
|
||||
return null;
|
||||
@@ -190,30 +191,34 @@ public abstract class PlayerMixin extends LivingEntity implements ScannableEntit
|
||||
@Nullable @Unique
|
||||
private PokedexEntityData getDataFromShoulderPokemon(CompoundTag shoulderTag) {
|
||||
CompoundTag pokemonTag = shoulderTag.getCompound(DataKeys.POKEMON);
|
||||
if(pokemonTag.isEmpty()) return null;
|
||||
if (pokemonTag.isEmpty()) return null;
|
||||
Species species = PokemonSpecies.INSTANCE.getByIdentifier(ResourceLocation.parse(pokemonTag.getString(DataKeys.POKEMON_SPECIES_IDENTIFIER)));
|
||||
if(species == null) return null;
|
||||
if (species == null) return null;
|
||||
String formId = pokemonTag.getString(DataKeys.POKEMON_FORM_ID);
|
||||
FormData form = species.getStandardForm();
|
||||
List<FormData> formList = species.getForms().stream().filter(it -> it.formOnlyShowdownId().equals(formId)).toList();
|
||||
if(!formList.isEmpty()) form = formList.getFirst();
|
||||
if(form == null) return null;
|
||||
if (!formList.isEmpty()) form = formList.getFirst();
|
||||
if (form == null) return null;
|
||||
String genderString = pokemonTag.getString(DataKeys.POKEMON_GENDER);
|
||||
if(genderString.isEmpty()) return null;
|
||||
if (genderString.isEmpty()) return null;
|
||||
Gender gender = Gender.valueOf(genderString);
|
||||
boolean shiny = pokemonTag.getBoolean(DataKeys.POKEMON_SHINY);
|
||||
int level = pokemonTag.getInt(DataKeys.POKEMON_LEVEL);
|
||||
Set<String> aspects = shoulderTag.getList(DataKeys.SHOULDER_ASPECTS, Tag.TAG_STRING).stream().map(Tag::getAsString).collect(Collectors.toSet());
|
||||
|
||||
return new PokedexEntityData(
|
||||
species,
|
||||
form,
|
||||
gender,
|
||||
aspects,
|
||||
shiny,
|
||||
level,
|
||||
this.getUUID()
|
||||
);
|
||||
Pokemon pokemon = new Pokemon();
|
||||
if (level().isClientSide) {
|
||||
pokemon.setSpecies(species);
|
||||
pokemon.setForm(form);
|
||||
pokemon.setGender(gender);
|
||||
pokemon.setShiny(shiny);
|
||||
pokemon.setLevel(level);
|
||||
pokemon.setForcedAspects(aspects);
|
||||
} else {
|
||||
PlayerPartyStore party = Cobblemon.INSTANCE.getStorage().getParty(this.getUUID(), this.registryAccess());
|
||||
pokemon = party.get(shoulderTag.getUUID(DataKeys.SHOULDER_UUID));
|
||||
}
|
||||
return new PokedexEntityData(pokemon, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -14,6 +14,7 @@ import com.cobblemon.mod.common.api.SeasonResolver
|
||||
import com.cobblemon.mod.common.api.data.DataProvider
|
||||
import com.cobblemon.mod.common.api.drop.CommandDropEntry
|
||||
import com.cobblemon.mod.common.api.drop.DropEntry
|
||||
import com.cobblemon.mod.common.api.drop.EvolutionItemDropEntry
|
||||
import com.cobblemon.mod.common.api.drop.ItemDropEntry
|
||||
import com.cobblemon.mod.common.api.events.CobblemonEvents
|
||||
import com.cobblemon.mod.common.api.events.CobblemonEvents.DATA_SYNCHRONIZED
|
||||
@@ -200,6 +201,7 @@ object Cobblemon {
|
||||
|
||||
DropEntry.register("command", CommandDropEntry::class.java)
|
||||
DropEntry.register("item", ItemDropEntry::class.java, isDefault = true)
|
||||
DropEntry.register("evolution", EvolutionItemDropEntry::class.java)
|
||||
|
||||
ExperienceGroups.registerDefaults()
|
||||
CaptureCalculators.registerDefaults()
|
||||
|
||||
@@ -32,6 +32,7 @@ object CobblemonCommands {
|
||||
HealPokemonCommand.register(dispatcher)
|
||||
StopBattleCommand.register(dispatcher)
|
||||
CheckSpawnsCommand.register(dispatcher)
|
||||
CheckFishingSpawnsCommand.register(dispatcher)
|
||||
GetNBT.register(dispatcher)
|
||||
OpenStarterScreenCommand.register(dispatcher)
|
||||
SpawnAllPokemon.register(dispatcher)
|
||||
|
||||
@@ -317,6 +317,7 @@ object CobblemonItems : PlatformRegistry<Registry<Item>, ResourceKey<Registry<It
|
||||
@JvmField val RAZOR_FANG = noSettingsItem("razor_fang")
|
||||
@JvmField val AUSPICIOUS_ARMOR = heldItem("auspicious_armor")
|
||||
@JvmField val MALICIOUS_ARMOR = heldItem("malicious_armor")
|
||||
@JvmField val SHELL_HELMET = heldItem("shell_helmet")
|
||||
|
||||
private val berries = mutableMapOf<ResourceLocation, BerryItem>()
|
||||
// Plants
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
package com.cobblemon.mod.common.api.drop
|
||||
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
@@ -40,17 +41,23 @@ interface DropEntry {
|
||||
* to be dropped.
|
||||
*/
|
||||
val percentage: Float
|
||||
|
||||
/**
|
||||
* The drop's quantity when doing selection from the [DropTable]. See the drop table documentation for more on how
|
||||
* this works.
|
||||
*/
|
||||
val quantity: Int
|
||||
|
||||
/**
|
||||
* The maximum number of times the item can be selected drop the [DropTable]. In most cases this will just be 1,
|
||||
* meaning that the item, once picked, cannot be picked again. A larger value will allow the same [DropEntry] from
|
||||
* appearing multiple times in a drop action.
|
||||
*/
|
||||
val maxSelectableTimes: Int
|
||||
|
||||
/** Whether this is considered a possible drop at the moment or not */
|
||||
fun canDrop(pokemon: Pokemon?): Boolean = true
|
||||
|
||||
/** The logic to use to actually drop the thing. */
|
||||
fun drop(entity: LivingEntity?, world: ServerLevel, pos: Vec3, player: ServerPlayer?)
|
||||
}
|
||||
@@ -11,11 +11,13 @@ package com.cobblemon.mod.common.api.drop
|
||||
import com.cobblemon.mod.common.api.events.CobblemonEvents.LOOT_DROPPED
|
||||
import com.cobblemon.mod.common.api.events.drops.LootDroppedEvent
|
||||
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import kotlin.random.Random
|
||||
import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
/**
|
||||
@@ -45,9 +47,11 @@ class DropTable {
|
||||
* Gets a drop list from this table as a list of [DropEntry]. You can specify the range of drop quantity totals
|
||||
* that will be possible, or if you leave it blank it will use [DropTable.amount].
|
||||
*/
|
||||
fun getDrops(amount: IntRange = this.amount): List<DropEntry> {
|
||||
fun getDrops(amount: IntRange = this.amount, pokemon: Pokemon? = null): List<DropEntry> {
|
||||
val chosenAmount = amount.random()
|
||||
val possibleDrops = entries.filter { it.quantity <= chosenAmount }.toMutableList()
|
||||
val possibleDrops = entries.filter {
|
||||
it.quantity <= chosenAmount && it.canDrop(pokemon)
|
||||
}.toMutableList()
|
||||
|
||||
if (possibleDrops.isEmpty()) {
|
||||
return emptyList()
|
||||
@@ -87,11 +91,12 @@ class DropTable {
|
||||
world: ServerLevel,
|
||||
pos: Vec3,
|
||||
player: ServerPlayer?,
|
||||
amount: IntRange = this.amount
|
||||
amount: IntRange = this.amount,
|
||||
pokemon: Pokemon? = null,
|
||||
) {
|
||||
val drops = getDrops(amount).toMutableList()
|
||||
val heldItem = (entity as PokemonEntity).pokemon.heldItemNoCopy()
|
||||
if (!heldItem.isEmpty) entity.spawnAtLocation(heldItem.item)
|
||||
val drops = getDrops(amount, pokemon).toMutableList()
|
||||
val heldItem = (entity as PokemonEntity?)?.pokemon?.heldItemNoCopy() ?: ItemStack.EMPTY
|
||||
if (!heldItem.isEmpty) entity?.spawnAtLocation(heldItem.item)
|
||||
LOOT_DROPPED.postThen(
|
||||
event = LootDroppedEvent(this, player, entity, drops),
|
||||
ifSucceeded = { it.drops.forEach { it.drop(entity, world, pos, player) } }
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.api.drop
|
||||
|
||||
import com.cobblemon.mod.common.api.pokemon.evolution.requirement.EvolutionRequirement
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
|
||||
class EvolutionItemDropEntry : ItemDropEntry() {
|
||||
val requirements: MutableSet<EvolutionRequirement> = mutableSetOf()
|
||||
|
||||
override fun canDrop(pokemon: Pokemon?): Boolean = pokemon != null && requirements.all { it.check(pokemon) }
|
||||
}
|
||||
+4
-6
@@ -18,19 +18,17 @@ import net.minecraft.server.level.ServerPlayer
|
||||
import net.minecraft.world.entity.LivingEntity
|
||||
|
||||
data class PokemonScannedEvent(val player: ServerPlayer, val scannedPokemonEntityData: PokedexEntityData, val scannedEntity: ScannableEntity) {
|
||||
val pokedexEntityData: PokedexEntityData
|
||||
get() = scannedPokemonEntityData
|
||||
|
||||
val isOwned: Boolean
|
||||
get() = scannedPokemonEntityData.ownerUUID == player.uuid
|
||||
get() = scannedPokemonEntityData.pokemon.getOwnerUUID() == player.uuid
|
||||
|
||||
val context = mutableMapOf(
|
||||
"player" to player.asMoLangValue(),
|
||||
"pokemon" to scannedPokemonEntityData.struct,
|
||||
"pokemon" to scannedPokemonEntityData.pokemon.struct,
|
||||
"disguise" to (scannedPokemonEntityData.disguise?.struct ?: DoubleValue.ZERO),
|
||||
"entity" to {
|
||||
when (scannedEntity) {
|
||||
is LivingEntity -> scannedEntity.asMostSpecificMoLangValue()
|
||||
else -> DoubleValue(0.0)
|
||||
else -> DoubleValue.ZERO
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
+5
-7
@@ -17,16 +17,14 @@ import com.cobblemon.mod.common.api.pokedex.AbstractPokedexManager
|
||||
import com.cobblemon.mod.common.api.pokedex.FormDexRecord
|
||||
import com.cobblemon.mod.common.api.pokedex.PokedexEntryProgress
|
||||
import com.cobblemon.mod.common.pokedex.scanner.PokedexEntityData
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.util.getPlayer
|
||||
import com.mojang.datafixers.util.Either
|
||||
import java.util.UUID
|
||||
|
||||
/**
|
||||
* Event that fires when a Pokémon's information is gained or updated in the Pokédex.
|
||||
*/
|
||||
sealed interface PokedexDataChangedEvent {
|
||||
val dataSource: Either<PokedexEntityData, Pokemon>
|
||||
val dataSource: PokedexEntityData
|
||||
val knowledge: PokedexEntryProgress
|
||||
val playerUUID: UUID
|
||||
val record: FormDexRecord
|
||||
@@ -37,22 +35,22 @@ sealed interface PokedexDataChangedEvent {
|
||||
fun getContext(): MutableMap<String, MoValue> {
|
||||
return mutableMapOf(
|
||||
"player" to (playerUUID.getPlayer()?.asMoLangValue() ?: DoubleValue.ZERO),
|
||||
"pokemon" to dataSource.map({ DoubleValue.ZERO }, { it.struct }),
|
||||
"data" to dataSource.map({ it.struct }, { DoubleValue.ZERO }),
|
||||
"pokemon" to dataSource.pokemon.struct,
|
||||
"disguise" to (dataSource.disguise?.struct ?: DoubleValue.ZERO),
|
||||
"knowledge" to StringValue(knowledge.name.lowercase()),
|
||||
"pokedex" to pokedexManager.struct
|
||||
)
|
||||
}
|
||||
|
||||
class Pre(
|
||||
override val dataSource: Either<PokedexEntityData, Pokemon>,
|
||||
override val dataSource: PokedexEntityData,
|
||||
override val knowledge: PokedexEntryProgress,
|
||||
override val playerUUID: UUID,
|
||||
override val record: FormDexRecord
|
||||
) : PokedexDataChangedEvent, Cancelable()
|
||||
|
||||
class Post(
|
||||
override val dataSource: Either<PokedexEntityData, Pokemon>,
|
||||
override val dataSource: PokedexEntityData,
|
||||
override val knowledge: PokedexEntryProgress,
|
||||
override val playerUUID: UUID,
|
||||
override val record: FormDexRecord
|
||||
|
||||
@@ -54,7 +54,15 @@ class BenchedMoves : Iterable<BenchedMove> {
|
||||
}
|
||||
}
|
||||
|
||||
fun add(benchedMove: BenchedMove) = doThenEmit { benchedMoves.add(benchedMove) }
|
||||
fun add(benchedMove: BenchedMove): Boolean {
|
||||
if (any { it.moveTemplate == benchedMove.moveTemplate }) {
|
||||
return false
|
||||
}
|
||||
|
||||
doThenEmit { benchedMoves.add(benchedMove) }
|
||||
return true
|
||||
}
|
||||
|
||||
fun addAll(benchedMoves: Iterable<BenchedMove>) = doThenEmit { this.benchedMoves.addAll(benchedMoves) }
|
||||
fun clear() = doThenEmit { benchedMoves.clear() }
|
||||
fun remove(benchedMove: BenchedMove) = doThenEmit { benchedMoves.remove(benchedMove) }
|
||||
|
||||
@@ -134,18 +134,21 @@ class MoveSet : Iterable<Move> {
|
||||
return json
|
||||
}
|
||||
|
||||
fun add(move: Move) {
|
||||
fun add(move: Move): Boolean {
|
||||
if (any { it.template == move.template }) {
|
||||
return
|
||||
return false
|
||||
}
|
||||
|
||||
for (i in 0 until MOVE_COUNT) {
|
||||
if (moves[i] == null) {
|
||||
moves[i] = move
|
||||
move.observable.subscribe { this.update() }
|
||||
update()
|
||||
return
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
fun update() {
|
||||
|
||||
+4
-1
@@ -42,7 +42,10 @@ class BaseStatModifier(
|
||||
|
||||
override fun behavior(thrower: LivingEntity, pokemon: Pokemon): CatchRateModifier.Behavior = CatchRateModifier.Behavior.MULTIPLY
|
||||
|
||||
override fun isValid(thrower: LivingEntity, pokemon: Pokemon): Boolean = pokemon.form.baseStats[this.stat] != null
|
||||
override fun isValid(thrower: LivingEntity, pokemon: Pokemon): Boolean {
|
||||
val valStat = pokemon.form.baseStats[this.stat] ?: return false
|
||||
return comparator(valStat)
|
||||
}
|
||||
|
||||
override fun modifyCatchRate(currentCatchRate: Float, thrower: LivingEntity, pokemon: Pokemon): Float = this.behavior(thrower, pokemon).mutator(currentCatchRate, this.value(thrower, pokemon))
|
||||
|
||||
|
||||
+9
-3
@@ -96,15 +96,21 @@ abstract class AbstractPokedexManager {
|
||||
}
|
||||
|
||||
fun getNewInformation(pokedexEntityData: PokedexEntityData): PokedexLearnedInformation {
|
||||
val speciesRecord = getSpeciesRecord(pokedexEntityData.species.resourceIdentifier)
|
||||
val speciesRecord = getSpeciesRecord(pokedexEntityData.getApparentSpecies().resourceIdentifier)
|
||||
if (speciesRecord == null || speciesRecord.getKnowledge() == PokedexEntryProgress.NONE) {
|
||||
return PokedexLearnedInformation.SPECIES
|
||||
}
|
||||
val formRecord = speciesRecord.getFormRecord(pokedexEntityData.form.name)
|
||||
val formRecord = speciesRecord.getFormRecord(pokedexEntityData.getApparentForm().name)
|
||||
if (formRecord == null || formRecord.knowledge == PokedexEntryProgress.NONE) {
|
||||
return PokedexLearnedInformation.FORM
|
||||
}
|
||||
if (pokedexEntityData.aspects.any{ !speciesRecord.hasAspect(it) } || pokedexEntityData.gender !in formRecord.getGenders() || !formRecord.hasSeenShinyState(pokedexEntityData.shiny)) {
|
||||
|
||||
// Can't update aspects on a disguise
|
||||
if (pokedexEntityData.disguise != null) {
|
||||
return PokedexLearnedInformation.NONE
|
||||
}
|
||||
|
||||
if (pokedexEntityData.pokemon.aspects.any { !speciesRecord.hasAspect(it) } || pokedexEntityData.pokemon.gender !in formRecord.getGenders() || !formRecord.hasSeenShinyState(pokedexEntityData.pokemon.shiny)) {
|
||||
return PokedexLearnedInformation.VARIATION
|
||||
}
|
||||
return PokedexLearnedInformation.NONE
|
||||
|
||||
@@ -89,21 +89,15 @@ class FormDexRecord {
|
||||
it.knowledge = knowledge
|
||||
}
|
||||
|
||||
fun encountered(pokemon: Pokemon) {
|
||||
if (wouldBeDifferent(pokemon, PokedexEntryProgress.ENCOUNTERED)) {
|
||||
addInformation(pokemon, PokedexEntryProgress.ENCOUNTERED)
|
||||
}
|
||||
}
|
||||
|
||||
fun encountered(pokedexEntityData: PokedexEntityData) {
|
||||
if (wouldBeDifferent(pokedexEntityData, PokedexEntryProgress.ENCOUNTERED)) {
|
||||
addInformation(pokedexEntityData, PokedexEntryProgress.ENCOUNTERED)
|
||||
}
|
||||
}
|
||||
|
||||
fun caught(pokemon: Pokemon) {
|
||||
if (wouldBeDifferent(pokemon, PokedexEntryProgress.CAUGHT)) {
|
||||
addInformation(pokemon, PokedexEntryProgress.CAUGHT)
|
||||
fun caught(pokedexEntityData: PokedexEntityData) {
|
||||
if (wouldBeDifferent(pokedexEntityData, PokedexEntryProgress.CAUGHT)) {
|
||||
addInformation(pokedexEntityData, PokedexEntryProgress.CAUGHT)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -125,47 +119,18 @@ class FormDexRecord {
|
||||
speciesDexRecord.onFormRecordUpdated(this)
|
||||
}
|
||||
|
||||
private fun addInformation(pokemon: Pokemon, knowledge: PokedexEntryProgress) {
|
||||
(speciesDexRecord.pokedexManager as? PokedexManager)?.let { pokedexManager ->
|
||||
CobblemonEvents.POKEDEX_DATA_CHANGED_PRE.postThen(
|
||||
PokedexDataChangedEvent.Pre(
|
||||
Either.right(pokemon),
|
||||
knowledge,
|
||||
pokedexManager.uuid,
|
||||
this
|
||||
),
|
||||
ifSucceeded = {
|
||||
genders.add(pokemon.gender)
|
||||
seenShinyStates.add(if (pokemon.shiny) "shiny" else "normal")
|
||||
if (knowledge.ordinal > this.knowledge.ordinal) {
|
||||
this.knowledge = knowledge
|
||||
}
|
||||
speciesDexRecord.addInformation(pokemon, knowledge)
|
||||
speciesDexRecord.onFormRecordUpdated(this)
|
||||
CobblemonEvents.POKEDEX_DATA_CHANGED_POST.post(
|
||||
PokedexDataChangedEvent.Post(
|
||||
Either.right(pokemon),
|
||||
knowledge,
|
||||
pokedexManager.uuid,
|
||||
this
|
||||
)
|
||||
)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
private fun addInformation(pokedexEntityData: PokedexEntityData, knowledge: PokedexEntryProgress) {
|
||||
(speciesDexRecord.pokedexManager as? PokedexManager)?.let { pokedexManager ->
|
||||
CobblemonEvents.POKEDEX_DATA_CHANGED_PRE.postThen(
|
||||
PokedexDataChangedEvent.Pre(
|
||||
Either.left(pokedexEntityData),
|
||||
knowledge,
|
||||
pokedexManager.uuid,
|
||||
this
|
||||
pokedexEntityData,
|
||||
knowledge,
|
||||
pokedexManager.uuid,
|
||||
this
|
||||
),
|
||||
ifSucceeded = {
|
||||
genders.add(pokedexEntityData.gender)
|
||||
seenShinyStates.add(if (pokedexEntityData.shiny) "shiny" else "normal")
|
||||
genders.add(pokedexEntityData.pokemon.gender)
|
||||
seenShinyStates.add(if (pokedexEntityData.pokemon.shiny) "shiny" else "normal")
|
||||
if (knowledge.ordinal > this.knowledge.ordinal) {
|
||||
this.knowledge = knowledge
|
||||
}
|
||||
@@ -173,10 +138,10 @@ class FormDexRecord {
|
||||
speciesDexRecord.onFormRecordUpdated(this)
|
||||
CobblemonEvents.POKEDEX_DATA_CHANGED_POST.post(
|
||||
PokedexDataChangedEvent.Post(
|
||||
Either.left(pokedexEntityData),
|
||||
knowledge,
|
||||
pokedexManager.uuid,
|
||||
this
|
||||
pokedexEntityData,
|
||||
knowledge,
|
||||
pokedexManager.uuid,
|
||||
this
|
||||
)
|
||||
)
|
||||
}
|
||||
@@ -184,19 +149,10 @@ class FormDexRecord {
|
||||
}
|
||||
}
|
||||
|
||||
/** Returns whether the given [Pokemon] and [knowledge] would add new information to the Pokédex.*/
|
||||
fun wouldBeDifferent(pokemon: Pokemon, knowledge: PokedexEntryProgress): Boolean {
|
||||
return pokemon.gender !in genders
|
||||
|| (pokemon.shiny && "shiny" !in seenShinyStates)
|
||||
|| (!pokemon.shiny && "normal" !in seenShinyStates)
|
||||
|| knowledge.ordinal > this.knowledge.ordinal
|
||||
|| speciesDexRecord.wouldBeDifferent(pokemon)
|
||||
}
|
||||
|
||||
fun wouldBeDifferent(pokedexEntityData: PokedexEntityData, knowledge: PokedexEntryProgress): Boolean {
|
||||
return pokedexEntityData.gender !in genders
|
||||
|| (pokedexEntityData.shiny && "shiny" !in seenShinyStates)
|
||||
|| (!pokedexEntityData.shiny && "normal" !in seenShinyStates)
|
||||
return pokedexEntityData.pokemon.gender !in genders
|
||||
|| (pokedexEntityData.pokemon.shiny && "shiny" !in seenShinyStates)
|
||||
|| (!pokedexEntityData.pokemon.shiny && "normal" !in seenShinyStates)
|
||||
|| knowledge.ordinal > this.knowledge.ordinal
|
||||
|| speciesDexRecord.wouldBeDifferent(pokedexEntityData)
|
||||
}
|
||||
|
||||
@@ -30,19 +30,19 @@ class PokedexManager(
|
||||
fun encounter(pokemon: Pokemon) {
|
||||
val speciesId = pokemon.species.resourceIdentifier
|
||||
val formName = pokemon.form.name
|
||||
getOrCreateSpeciesRecord(speciesId).getOrCreateFormRecord(formName).encountered(pokemon)
|
||||
getOrCreateSpeciesRecord(speciesId).getOrCreateFormRecord(formName).encountered(PokedexEntityData(pokemon = pokemon, disguise = null))
|
||||
}
|
||||
|
||||
fun encounter(pokedexEntityData: PokedexEntityData) {
|
||||
val speciesId = pokedexEntityData.species.resourceIdentifier
|
||||
val formName = pokedexEntityData.form.name
|
||||
val speciesId = pokedexEntityData.getApparentSpecies().resourceIdentifier
|
||||
val formName = pokedexEntityData.getApparentForm().name
|
||||
getOrCreateSpeciesRecord(speciesId).getOrCreateFormRecord(formName).encountered(pokedexEntityData)
|
||||
}
|
||||
|
||||
fun catch(pokemon: Pokemon) {
|
||||
val speciesId = pokemon.species.resourceIdentifier
|
||||
val formName = pokemon.form.name
|
||||
getOrCreateSpeciesRecord(speciesId).getOrCreateFormRecord(formName).caught(pokemon)
|
||||
getOrCreateSpeciesRecord(speciesId).getOrCreateFormRecord(formName).caught(PokedexEntityData(pokemon = pokemon, disguise = null))
|
||||
}
|
||||
|
||||
override fun markDirty() {
|
||||
|
||||
@@ -97,7 +97,7 @@ class SpeciesDexRecord {
|
||||
}
|
||||
|
||||
fun addInformation(pokedexEntityData: PokedexEntityData, knowledge: PokedexEntryProgress) {
|
||||
aspects.addAll(pokedexEntityData.aspects)
|
||||
aspects.addAll(pokedexEntityData.pokemon.aspects)
|
||||
}
|
||||
|
||||
fun addAspects(addedAspects: Set<String>) {
|
||||
@@ -107,7 +107,7 @@ class SpeciesDexRecord {
|
||||
/** Returns true if the given Pokémon contains new information. Internal because it's only to be called from [FormDexRecord.wouldBeDifferent]. */
|
||||
internal fun wouldBeDifferent(pokemon: Pokemon) = pokemon.aspects.any { it !in aspects }
|
||||
|
||||
internal fun wouldBeDifferent(pokedexEntityData: PokedexEntityData) = pokedexEntityData.aspects.any { it !in aspects }
|
||||
internal fun wouldBeDifferent(pokedexEntityData: PokedexEntityData) = pokedexEntityData.pokemon.aspects.any { it !in aspects }
|
||||
|
||||
fun getOrCreateFormRecord(formName: String): FormDexRecord {
|
||||
return formRecords.getOrPut(formName.lowercase()) {
|
||||
|
||||
@@ -468,6 +468,10 @@ open class PokemonProperties {
|
||||
return this.commonMatches(pokemonEntity.pokemon) && this.customProperties.none { !it.matches(pokemonEntity) }
|
||||
}
|
||||
|
||||
fun matches(properties: PokemonProperties): Boolean {
|
||||
return properties.asString() == this.asString()
|
||||
}
|
||||
|
||||
private fun commonMatches(pokemon: Pokemon): Boolean {
|
||||
level?.takeIf { it != pokemon.level }?.let { return false }
|
||||
shiny?.takeIf { it != pokemon.shiny }?.let { return false }
|
||||
|
||||
+33
-10
@@ -13,6 +13,7 @@ import com.cobblemon.mod.common.CobblemonItems
|
||||
import com.cobblemon.mod.common.CobblemonSounds
|
||||
import com.cobblemon.mod.common.advancement.CobblemonCriteria
|
||||
import com.cobblemon.mod.common.advancement.criterion.EvolvePokemonContext
|
||||
import com.cobblemon.mod.common.api.drop.DropTable
|
||||
import com.cobblemon.mod.common.api.events.CobblemonEvents
|
||||
import com.cobblemon.mod.common.api.events.pokemon.PokemonGainedEvent
|
||||
import com.cobblemon.mod.common.api.events.pokemon.evolution.EvolutionCompleteEvent
|
||||
@@ -32,9 +33,8 @@ import com.cobblemon.mod.common.pokemon.evolution.variants.LevelUpEvolution
|
||||
import com.cobblemon.mod.common.pokemon.evolution.variants.TradeEvolution
|
||||
import com.cobblemon.mod.common.util.lang
|
||||
import com.cobblemon.mod.common.util.party
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.core.registries.BuiltInRegistries
|
||||
import net.minecraft.network.protocol.game.ClientboundSoundPacket
|
||||
import com.cobblemon.mod.common.world.gamerules.CobblemonGameRules
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.sounds.SoundSource
|
||||
import net.minecraft.world.entity.Entity
|
||||
import net.minecraft.world.item.ItemStack
|
||||
@@ -80,6 +80,11 @@ interface Evolution : EvolutionLike {
|
||||
*/
|
||||
val learnableMoves: MutableSet<MoveTemplate>
|
||||
|
||||
/**
|
||||
* The items that will drop once the evolution finishes.
|
||||
*/
|
||||
val drops: DropTable
|
||||
|
||||
/**
|
||||
* Checks if the given [Pokemon] passes all the conditions and is ready to evolve.
|
||||
*
|
||||
@@ -198,19 +203,37 @@ interface Evolution : EvolutionLike {
|
||||
|
||||
val movesToLearn = previousSpeciesLearnableMoves + this.learnableMoves
|
||||
movesToLearn.forEach { move ->
|
||||
if (pokemon.moveSet.hasSpace()) {
|
||||
pokemon.moveSet.add(move.create())
|
||||
} else {
|
||||
pokemon.benchedMoves.add(BenchedMove(move, 0))
|
||||
}
|
||||
val couldAddMove =
|
||||
if (pokemon.moveSet.hasSpace()) {
|
||||
pokemon.moveSet.add(move.create())
|
||||
} else {
|
||||
pokemon.benchedMoves.add(BenchedMove(move, 0))
|
||||
}
|
||||
|
||||
pokemon.getOwnerPlayer()?.sendSystemMessage(lang("experience.learned_move", pokemon.getDisplayName(), move.displayName))
|
||||
val previousSpeciesKnewMove = previousSpeciesLearnableMoves.any { move.name == it.name }
|
||||
|
||||
if (couldAddMove && !previousSpeciesKnewMove) {
|
||||
pokemon.getOwnerPlayer()?.sendSystemMessage(lang("experience.learned_move", pokemon.getDisplayName(), move.displayName))
|
||||
}
|
||||
}
|
||||
|
||||
// we want to instantly tick for example you might only evolve your Bulbasaur at level 34 so Venusaur should be immediately available
|
||||
pokemon.evolutions.filterIsInstance<PassiveEvolution>().forEach { evolution -> evolution.attemptEvolution(pokemon) }
|
||||
pokemon.lockedEvolutions.filterIsInstance<PassiveEvolution>().forEach { evolution -> evolution.attemptEvolution(pokemon) }
|
||||
|
||||
this.shed(pokemon)
|
||||
|
||||
val ownerPlayer = pokemon.getOwnerPlayer()
|
||||
if (ownerPlayer != null && ownerPlayer.level().gameRules.getBoolean(CobblemonGameRules.DO_POKEMON_LOOT)) {
|
||||
drops.drop(
|
||||
pokemon.entity,
|
||||
ownerPlayer.level() as ServerLevel,
|
||||
pokemon.entity?.position() ?: ownerPlayer.position(),
|
||||
ownerPlayer,
|
||||
pokemon = pokemon
|
||||
)
|
||||
}
|
||||
|
||||
CobblemonEvents.EVOLUTION_COMPLETE.post(EvolutionCompleteEvent(pokemon, this))
|
||||
CobblemonEvents.POKEMON_GAINED.post(PokemonGainedEvent(pokemon.getOwnerUUID()!!, pokemon))
|
||||
}
|
||||
@@ -218,4 +241,4 @@ interface Evolution : EvolutionLike {
|
||||
fun applyTo(pokemon: Pokemon) {
|
||||
result.apply(pokemon)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+54
-26
@@ -21,6 +21,12 @@ object CobblemonPokemonLabels {
|
||||
*/
|
||||
const val LEGENDARY = "legendary"
|
||||
|
||||
/**
|
||||
* Represents a Pokémon who is typically banned or has restricted usage in competitive sanctions.
|
||||
* For example usage see this [VGC](https://www.pokemon.com/us/pokemon-news/trainers-can-once-again-use-a-restricted-pokemon-in-ranked-battles-series-10-starting-august-1-2021) page.
|
||||
*/
|
||||
const val RESTRICTED = "restricted"
|
||||
|
||||
/**
|
||||
* Represents a mythical Pokémon.
|
||||
* In Cobblemon terms they do not exist since we do not share the concept of timed event only Pokémon but the official ones are still tagged.
|
||||
@@ -28,14 +34,21 @@ object CobblemonPokemonLabels {
|
||||
const val MYTHICAL = "mythical"
|
||||
|
||||
/**
|
||||
* Represents Pokémon that originate from Ultra Space.
|
||||
* Represents Pokémon that receive a boosted catch rate from the Beast Ball. (Due to Beast Boost)
|
||||
* Does not include [thematically related](https://bulbapedia.bulbagarden.net/wiki/Ultra_Beast#Related_Pok%C3%A9mon) beasts.
|
||||
*/
|
||||
const val ULTRA_BEAST = "ultra_beast"
|
||||
|
||||
/**
|
||||
* Represents the pseudo legendary Pokémon.
|
||||
* Represents a Pokémon whose family could be derived from resurrecting a fossil.
|
||||
*/
|
||||
const val PSEUDO_LEGENDARY = "pseudo_legendary"
|
||||
const val FOSSIL = "fossil"
|
||||
|
||||
/**
|
||||
* Represents the "pseudo-legendary" Pokémon. (Slow-rate three-stage lines with a base stat total of 600)
|
||||
* Term reference on this [Pokémon Center](https://www.pokemoncenter.com/search/powerhouse) page.
|
||||
*/
|
||||
const val POWERHOUSE = "powerhouse"
|
||||
|
||||
/**
|
||||
* Represents a baby Pokémon, this is not just a first stage Pokémon species, it is also unable to breed.
|
||||
@@ -52,52 +65,55 @@ object CobblemonPokemonLabels {
|
||||
/**
|
||||
* See [REGIONAL], this has no official regionals but it consists of the "base" form that comes from the region.
|
||||
*/
|
||||
const val REGIONAL_OF_KANTO = "kanto_regional"
|
||||
const val KANTONIAN_FORM = "kantonian_form"
|
||||
|
||||
/**
|
||||
* See [REGIONAL], this has no official regionals but it consists of the "base" form that comes from the region.
|
||||
* Source for adjectival form: [Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Johto#Trivia)
|
||||
*/
|
||||
const val JOHTONIAN_FORM = "johtonian_form"
|
||||
|
||||
/**
|
||||
* See [REGIONAL], this has no official regionals but it consists of the "base" form that comes from the region.
|
||||
* Source for adjectival form:[Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Hoenn#Trivia)
|
||||
*/
|
||||
const val HOENNIAN_FORM = "hoennian_form"
|
||||
|
||||
/**
|
||||
* See [REGIONAL], this has no official regionals but it consists of the "base" form that comes from the region.
|
||||
* Source for adjectival form:[Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Sinnoh#Trivia)
|
||||
*/
|
||||
const val SINNOHAN_FORM = "sinnohan_form"
|
||||
|
||||
/**
|
||||
* See [REGIONAL], this has no official regionals but it consists of the "base" form that comes from the region.
|
||||
*/
|
||||
const val REGIONAL_OF_JOHTO = "johto_regional"
|
||||
const val UNOVAN_FORM = "unovan_form"
|
||||
|
||||
/**
|
||||
* See [REGIONAL], this has no official regionals but it consists of the "base" form that comes from the region.
|
||||
*/
|
||||
const val REGIONAL_OF_HOENN = "hoenn_regional"
|
||||
|
||||
/**
|
||||
* See [REGIONAL], this has no official regionals but it consists of the "base" form that comes from the region.
|
||||
*/
|
||||
const val REGIONAL_OF_SINNOH = "sinnoh_regional"
|
||||
|
||||
/**
|
||||
* See [REGIONAL], this has no official regionals but it consists of the "base" form that comes from the region.
|
||||
*/
|
||||
const val REGIONAL_OF_UNOVA = "unova_regional"
|
||||
|
||||
/**
|
||||
* See [REGIONAL], this has no official regionals but it consists of the "base" form that comes from the region.
|
||||
*/
|
||||
const val REGIONAL_OF_KALOS = "kalos_regional"
|
||||
const val KALOSIAN_FORM = "kalosian_form"
|
||||
|
||||
/**
|
||||
* See [REGIONAL] and this [Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Regional_form#Alolan_Form) page.
|
||||
*/
|
||||
const val REGIONAL_OF_ALOLA = "alola_regional"
|
||||
const val ALOLAN_FORM = "alolan_form"
|
||||
|
||||
/**
|
||||
* See [REGIONAL] and this [Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Regional_form#Galarian_Form) page.
|
||||
*/
|
||||
const val REGIONAL_OF_GALAR = "galar_regional"
|
||||
const val GALARIAN_FORM = "galarian_form"
|
||||
|
||||
/**
|
||||
* See [REGIONAL] and this [Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Regional_form#Hisuian_Form) page.
|
||||
*/
|
||||
const val REGIONAL_OF_HISUI = "hisui_regional"
|
||||
const val HISUIAN_FORM = "hisuian_form"
|
||||
|
||||
/**
|
||||
* See [REGIONAL] and this [Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Regional_form#Paldean_Form) page.
|
||||
*/
|
||||
const val REGIONAL_OF_PALDEA = "paldea_regional"
|
||||
const val PALDEAN_FORM = "paldean_form"
|
||||
|
||||
/**
|
||||
* Represents a mega evolution.
|
||||
@@ -124,7 +140,7 @@ object CobblemonPokemonLabels {
|
||||
const val TOTEM = "totem"
|
||||
|
||||
/**
|
||||
* Represents a Paradox species.
|
||||
* Represents Pokémon that trigger the Booster Energy item (due to Protosynthesis/Quark Drive)
|
||||
* For more information see the [Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/Paradox_Pok%C3%A9mon) page.
|
||||
*/
|
||||
const val PARADOX = "paradox"
|
||||
@@ -171,12 +187,24 @@ object CobblemonPokemonLabels {
|
||||
*/
|
||||
const val GENERATION_7 = "gen7"
|
||||
|
||||
/**
|
||||
* The "official" designation for Pokémon from Gen 7 (Unknown) and not the Alola region
|
||||
* This may also include forms of Pokémon that had been previously introduced
|
||||
*/
|
||||
const val GENERATION_7B = "gen7b"
|
||||
|
||||
/**
|
||||
* Pokémon from the national Pokédex of 810 to 905
|
||||
* This may also include forms of Pokémon that had been previously introduced
|
||||
*/
|
||||
const val GENERATION_8 = "gen8"
|
||||
|
||||
/**
|
||||
* The "official" designation for Pokémon from Gen 8 (Hisui) and not the Galar region
|
||||
* This may also include forms of Pokémon that had been previously introduced
|
||||
*/
|
||||
const val GENERATION_8A = "gen8a"
|
||||
|
||||
/**
|
||||
* Pokémon from the national Pokédex from 906 to 1008
|
||||
* This may also include forms of Pokémon that had been previously introduced
|
||||
|
||||
@@ -53,7 +53,7 @@ enum class Stats(override val identifier: ResourceLocation, override val display
|
||||
fun getStat(statKey: String) = when(statKey.lowercase()) {
|
||||
"hp" -> HP
|
||||
"atk", "attack" -> ATTACK // Hyper Cutter states the full stat name "Attack"
|
||||
"def", "defense" -> DEFENCE // Big Pecks states the full stat name "Defense"
|
||||
"def", "defense", "defence" -> DEFENCE // Big Pecks states the full stat name "Defense"
|
||||
"spa" -> SPECIAL_ATTACK
|
||||
"spd" -> SPECIAL_DEFENCE
|
||||
"spe", "speed" -> SPEED
|
||||
|
||||
+2
-2
@@ -53,7 +53,7 @@ class BestSpawnerConfig {
|
||||
.create()
|
||||
|
||||
const val CONFIG_NAME = "best-spawner-config"
|
||||
const val INTERNAL_PATH = "data/${Cobblemon.MODID}/spawning/$CONFIG_NAME.json"
|
||||
const val INTERNAL_PATH = "/data/${Cobblemon.MODID}/spawning/$CONFIG_NAME.json"
|
||||
const val EXTERNAL_PATH = "config/${Cobblemon.MODID}/spawning/$CONFIG_NAME.json"
|
||||
|
||||
fun load(): BestSpawnerConfig {
|
||||
@@ -77,7 +77,7 @@ class BestSpawnerConfig {
|
||||
}
|
||||
|
||||
private fun loadInternal(): BestSpawnerConfig {
|
||||
val reader = InputStreamReader(Cobblemon.javaClass.classLoader.getResourceAsStream(INTERNAL_PATH)!!)
|
||||
val reader = InputStreamReader(Cobblemon::class.java.getResourceAsStream(INTERNAL_PATH)!!)
|
||||
val config = GSON.fromJson(reader, BestSpawnerConfig::class.java)
|
||||
reader.close()
|
||||
return config
|
||||
|
||||
+14
-14
@@ -27,15 +27,15 @@ import net.minecraft.world.entity.player.Player
|
||||
* @since February 21, 2024
|
||||
*/
|
||||
|
||||
class PlayerInstancedDataStoreManager {
|
||||
open class PlayerInstancedDataStoreManager {
|
||||
val factories = mutableMapOf<PlayerInstancedDataStoreType, PlayerInstancedDataFactory<*>>()
|
||||
val saveTasks = mutableMapOf<PlayerInstancedDataStoreType, ScheduledTask>()
|
||||
fun setFactory(factory: PlayerInstancedDataFactory<*>, dataType: PlayerInstancedDataStoreType) {
|
||||
open fun setFactory(factory: PlayerInstancedDataFactory<*>, dataType: PlayerInstancedDataStoreType) {
|
||||
factories[dataType] = factory
|
||||
}
|
||||
|
||||
|
||||
fun setup(server: MinecraftServer) {
|
||||
open fun setup(server: MinecraftServer) {
|
||||
factories.values.forEach {
|
||||
it.setup(server)
|
||||
}
|
||||
@@ -57,62 +57,62 @@ class PlayerInstancedDataStoreManager {
|
||||
.build()
|
||||
}
|
||||
|
||||
fun get(playerId: UUID, dataType: PlayerInstancedDataStoreType): InstancedPlayerData {
|
||||
open fun get(playerId: UUID, dataType: PlayerInstancedDataStoreType): InstancedPlayerData {
|
||||
if (!factories.contains(dataType)) {
|
||||
throw UnsupportedOperationException("No factory registered for $dataType")
|
||||
}
|
||||
return factories[dataType]!!.getForPlayer(playerId)
|
||||
}
|
||||
|
||||
fun get(player: Player, dataType: PlayerInstancedDataStoreType): InstancedPlayerData {
|
||||
open fun get(player: Player, dataType: PlayerInstancedDataStoreType): InstancedPlayerData {
|
||||
return get(player.uuid, dataType)
|
||||
}
|
||||
|
||||
fun saveAllOfOneType(dataType: PlayerInstancedDataStoreType) {
|
||||
open fun saveAllOfOneType(dataType: PlayerInstancedDataStoreType) {
|
||||
if (!factories.contains(dataType)) {
|
||||
throw UnsupportedOperationException("No factory registered for $dataType")
|
||||
}
|
||||
return factories[dataType]!!.saveAll()
|
||||
}
|
||||
|
||||
fun saveSingle(playerData: InstancedPlayerData, dataType: PlayerInstancedDataStoreType) {
|
||||
open fun saveSingle(playerData: InstancedPlayerData, dataType: PlayerInstancedDataStoreType) {
|
||||
if (!factories.contains(dataType)) {
|
||||
throw UnsupportedOperationException("No factory registered for $dataType")
|
||||
}
|
||||
return factories[dataType]!!.saveSingle(playerData.uuid)
|
||||
}
|
||||
|
||||
fun onPlayerDisconnect(player: ServerPlayer) {
|
||||
open fun onPlayerDisconnect(player: ServerPlayer) {
|
||||
factories.values.forEach {
|
||||
it.onPlayerDisconnect(player)
|
||||
}
|
||||
}
|
||||
|
||||
fun syncAllToPlayer(player: ServerPlayer) {
|
||||
open fun syncAllToPlayer(player: ServerPlayer) {
|
||||
factories.values.forEach {
|
||||
it.sendToPlayer(player)
|
||||
}
|
||||
}
|
||||
|
||||
fun saveAllStores() {
|
||||
open fun saveAllStores() {
|
||||
factories.values.forEach {
|
||||
it.saveAll()
|
||||
}
|
||||
}
|
||||
|
||||
fun getGenericData(player: ServerPlayer): GeneralPlayerData {
|
||||
open fun getGenericData(player: ServerPlayer): GeneralPlayerData {
|
||||
return getGenericData(player.uuid)
|
||||
}
|
||||
|
||||
fun getGenericData(playerId: UUID): GeneralPlayerData {
|
||||
open fun getGenericData(playerId: UUID): GeneralPlayerData {
|
||||
return get(playerId, PlayerInstancedDataStoreTypes.GENERAL) as GeneralPlayerData
|
||||
}
|
||||
|
||||
fun getPokedexData(player: ServerPlayer): PokedexManager {
|
||||
open fun getPokedexData(player: ServerPlayer): PokedexManager {
|
||||
return getPokedexData(player.uuid)
|
||||
}
|
||||
|
||||
fun getPokedexData(playerId: UUID): PokedexManager {
|
||||
open fun getPokedexData(playerId: UUID): PokedexManager {
|
||||
return get(playerId, PlayerInstancedDataStoreTypes.POKEDEX) as PokedexManager
|
||||
}
|
||||
}
|
||||
@@ -23,30 +23,72 @@ object CobblemonBlockTags {
|
||||
|
||||
@JvmField val ALL_HANGING_SIGNS = createTag("all_hanging_signs")
|
||||
@JvmField val ALL_SIGNS = createTag("all_signs")
|
||||
@JvmField val ANCIENT_CITY_BLOCKS = createTag("ancient_city_blocks")
|
||||
@JvmField val APRICORN_LEAVES = createTag("apricorn_leaves")
|
||||
@JvmField val APRICORN_LOGS = createTag("apricorn_logs")
|
||||
@JvmField val APRICORN_SAPLINGS = createTag("apricorn_saplings")
|
||||
@JvmField val APRICORNS = createTag("apricorns")
|
||||
@JvmField val BERRY_WILD_SOIL = createTag("berry_wild_soil")
|
||||
@JvmField val BERRY_SOIL = createTag("berry_soil")
|
||||
@JvmField val BERRIES = createTag("berries")
|
||||
@JvmField val BERRY_REPLACEABLE = createTag("berry_replaceable")
|
||||
@JvmField val BERRY_SOIL = createTag("berry_soil")
|
||||
@JvmField val BERRY_WILD_SOIL = createTag("berry_wild_soil")
|
||||
@JvmField val BLACK_TUMBLESTONE_BRICKS = createTag("black_tumblestone_bricks")
|
||||
@JvmField val BLACK_TUMBLESTONES = createTag("black_tumblestones")
|
||||
@JvmField val BLUE_FLOWERS = createTag("blue_flowers")
|
||||
@JvmField val CEILING_HANGING_SIGNS = createTag("ceiling_hanging_signs")
|
||||
@JvmField val CROPS = createTag("crops")
|
||||
@JvmField val DAWN_STONE_ORES = createTag("dawn_stone_ores")
|
||||
@JvmField val DESERT_PYRAMID_BLOCKS = createTag("desert_pyramid_blocks")
|
||||
@JvmField val DRIPSTONE_GROWABLE = createTag("dripstone_growable")
|
||||
@JvmField val DRIPSTONE_REPLACEABLES = createTag("dripstone_replaceables")
|
||||
@JvmField val DUSK_STONE_ORES = createTag("dusk_stone_ores")
|
||||
@JvmField val END_CITY_BLOCKS = createTag("end_city_blocks")
|
||||
@JvmField val EVOLUTION_STONE_BLOCKS = createTag("evolution_stone_blocks")
|
||||
@JvmField val FIRE_STONE_ORES = createTag("fire_stone_ores")
|
||||
@JvmField val FLOWERS = createTag("flowers")
|
||||
@JvmField val FOSSIL_MACHINE_PARTS = createTag("fossil_machine_parts")
|
||||
@JvmField val GEMSTONES = createTag("gemstones")
|
||||
@JvmField val GILDED_CHESTS = createTag("gilded_chests")
|
||||
@JvmField val GLAZED_TERRACOTTA_BLOCKS = createTag("glazed_terracotta_blocks")
|
||||
@JvmField val ICE_STONE_ORES = createTag("ice_stone_ores")
|
||||
@JvmField val JUNGLE_PYRAMID_BLOCKS = createTag("jungle_pyramid_blocks")
|
||||
@JvmField val LEAF_STONE_ORES = createTag("leaf_stone_ores")
|
||||
@JvmField val MACHINES = createTag("machines")
|
||||
@JvmField val MANSION_BLOCKS = createTag("mansion_blocks")
|
||||
@JvmField val MEDICINAL_LEEK_PLANTABLE = createTag("medicinal_leek_plantable")
|
||||
@JvmField val MINTS = createTag("mints")
|
||||
@JvmField val ROOTS_SPREADABLE = createTag("roots_spreadable")
|
||||
@JvmField val SIGNS = createTag("signs")
|
||||
@JvmField val SMALL_FLOWERS = createTag("small_flowers")
|
||||
@JvmField val SEES_SKY = createTag("sees_sky")
|
||||
@JvmField val SNOW_BLOCK = createTag("snow_block")
|
||||
@JvmField val MOON_STONE_ORES = createTag("moon_stone_ores")
|
||||
@JvmField val NATURAL = createTag("natural")
|
||||
@JvmField val NETHER_STRUCTURE_BLOCKS = createTag("nether_structure_blocks")
|
||||
@JvmField val PINK_FLOWERS = createTag("pink_flowers")
|
||||
@JvmField val RED_FLOWERS = createTag("red_flowers")
|
||||
@JvmField val RED_TUMBLESTONE_BRICKS = createTag("red_tumblestone_bricks")
|
||||
@JvmField val RED_TUMBLESTONES = createTag("red_tumblestones")
|
||||
@JvmField val REDSTONE_BLOCKS = createTag("redstone_blocks")
|
||||
@JvmField val ROOTS = createTag("roots")
|
||||
@JvmField val ROOTS_SPREADABLE = createTag("roots_spreadable")
|
||||
@JvmField val RUINED_PORTAL_BLOCKS = createTag("ruined_portal_blocks")
|
||||
@JvmField val SEES_SKY = createTag("sees_sky")
|
||||
@JvmField val SHINY_STONE_ORES = createTag("shiny_stone_ores")
|
||||
@JvmField val SIGNS = createTag("signs")
|
||||
@JvmField val SKY_TUMBLESTONE_BRICKS = createTag("sky_tumblestone_bricks")
|
||||
@JvmField val SKY_TUMBLESTONES = createTag("sky_tumblestones")
|
||||
@JvmField val SMALL_FLOWERS = createTag("small_flowers")
|
||||
@JvmField val SNOW_BLOCK = createTag("snow_block")
|
||||
@JvmField val STANDING_SIGNS = createTag("standing_signs")
|
||||
@JvmField val SUN_STONE_ORES = createTag("sun_stone_ores")
|
||||
@JvmField val THUNDER_STONE_ORES = createTag("thunder_stone_ores")
|
||||
@JvmField val TRAIL_RUINS_BLOCKS = createTag("trail_ruins_blocks")
|
||||
@JvmField val TRASH = createTag("trash")
|
||||
@JvmField val TREES = createTag("trees")
|
||||
@JvmField val TUMBLESTONE_BRICKS = createTag("tumblestone_bricks")
|
||||
@JvmField val TUMBLESTONES = createTag("tumblestones")
|
||||
@JvmField val TUMBLESTONE_HEAT_SOURCE = createTag("tumblestone_heat_source")
|
||||
@JvmField val WALL_HANGING_SIGNS = createTag("wall_hanging_signs")
|
||||
@JvmField val WALL_SIGNS = createTag("wall_signs")
|
||||
@JvmField val WATER_STONE_ORES = createTag("water_stone_ores")
|
||||
@JvmField val WHITE_FLOWERS = createTag("white_flowers")
|
||||
@JvmField val YELLOW_FLOWERS = createTag("yellow_flowers")
|
||||
|
||||
private fun createTag(name: String) = TagKey.create(Registries.BLOCK, cobblemonResource(name))
|
||||
|
||||
|
||||
@@ -21,137 +21,108 @@ import net.minecraft.tags.TagKey
|
||||
*/
|
||||
@Suppress("unused", "HasPlatformType")
|
||||
object CobblemonItemTags {
|
||||
@JvmField
|
||||
val ANCIENT_POKE_BALLS = create("ancient_poke_balls")
|
||||
@JvmField
|
||||
val APRICORN_LOGS = create("apricorn_logs")
|
||||
@JvmField
|
||||
val APRICORN_SPROUTS = create("apricorn_sprouts")
|
||||
@JvmField
|
||||
val APRICORNS = create("apricorns")
|
||||
@JvmField
|
||||
val POKEDEX = create("pokedex")
|
||||
/**
|
||||
* This tag is only used for a Torterra aspect based easter egg evolution at the moment.
|
||||
* It simply includes the 'minecraft:azalea' and 'minecraft:flowering_azalea' items by default.
|
||||
*/
|
||||
@JvmField
|
||||
val AZALEA_TREE = create("azalea_tree")
|
||||
@JvmField
|
||||
val BERRIES = create("berries")
|
||||
@JvmField
|
||||
val BOATS = create("boats")
|
||||
@JvmField
|
||||
val COBBLEMON_SEEDS = create("cobblemon_seeds")
|
||||
/**
|
||||
* This tag is used for Fossil Machine natural materials
|
||||
*/
|
||||
@JvmField
|
||||
val COOKED_MEAT = create("cooked_meat")
|
||||
@JvmField
|
||||
val DAWN_STONE_ORES = create("dawn_stone_ores")
|
||||
@JvmField
|
||||
val DUSK_STONE_ORES = create("dusk_stone_ores")
|
||||
@JvmField
|
||||
val EVOLUTION_ITEMS = create("evolution_items")
|
||||
@JvmField
|
||||
val EVOLUTION_STONES = create("evolution_stones")
|
||||
@JvmField
|
||||
val EXPERIENCE_CANDIES = create("experience_candies")
|
||||
@JvmField
|
||||
val FIRE_STONE_ORES = create("fire_stone_ores")
|
||||
@JvmField
|
||||
val FOSSILS = create("fossils")
|
||||
@JvmField
|
||||
val HANGING_SIGNS = create("hanging_signs")
|
||||
@JvmField
|
||||
val HERBS = create("herbs")
|
||||
@JvmField
|
||||
val ICE_STONE_ORES = create("ice_stone_ores")
|
||||
@JvmField
|
||||
val LEAF_STONE_ORES = create("leaf_stone_ores")
|
||||
@JvmField
|
||||
val MINT_LEAF = create("mint_leaf")
|
||||
@JvmField
|
||||
val MINT_SEEDS = create("mint_seeds")
|
||||
@JvmField
|
||||
val MINTS = create("mints")
|
||||
@JvmField
|
||||
val MOON_STONE_ORES = create("moon_stone_ores")
|
||||
@JvmField
|
||||
val MUTATED_BERRIES = create("mutated_berries")
|
||||
@JvmField
|
||||
val PLANTS = create("plants")
|
||||
@JvmField
|
||||
val POKE_BALLS = create("poke_balls")
|
||||
@JvmField
|
||||
val PROTEIN_INGREDIENTS = create("protein_ingredients")
|
||||
@JvmField val ABILITY_CHANGERS = create("ability_changers")
|
||||
@JvmField val ANCIENT_POKE_BALLS = create("ancient_poke_balls")
|
||||
@JvmField val APPLES = create("apples")
|
||||
@JvmField val APRICORN_LOGS = create("apricorn_logs")
|
||||
@JvmField val APRICORN_POKE_BALLS = create("apricorn_poke_balls")
|
||||
@JvmField val APRICORN_SPROUTS = create("apricorn_sprouts")
|
||||
@JvmField val APRICORNS = create("apricorns")
|
||||
/** This tag is only used for a Torterra aspect based easter egg evolution at the moment.
|
||||
* It simply includes the 'minecraft:azalea' and 'minecraft:flowering_azalea' items by default. */
|
||||
@JvmField val AZALEA_TREE = create("azalea_tree")
|
||||
@JvmField val BATTLE_ITEMS = create("battle_items")
|
||||
@JvmField val BERRIES = create("berries")
|
||||
@JvmField val BLACK_TUMBLESTONE_BRICKS = create("black_tumblestone_bricks")
|
||||
@JvmField val BLACK_TUMBLESTONES = create("black_tumblestones")
|
||||
@JvmField val BOATS = create("boats")
|
||||
/** This tag is used for Fossil Machine natural materials */
|
||||
@JvmField val COOKED_MEAT = create("cooked_meat")
|
||||
@JvmField val DAWN_STONE_ORES = create("dawn_stone_ores")
|
||||
@JvmField val POTTERY_SHERDS = create("decorated_pot_sherds")
|
||||
@JvmField val DEEP_SEAS = create("deep_seas")
|
||||
@JvmField val DUSK_STONE_ORES = create("dusk_stone_ores")
|
||||
@JvmField val ETHERS = create("ethers")
|
||||
@JvmField val EVOLUTION_ITEMS = create("evolution_items")
|
||||
@JvmField val EVOLUTION_STONE_BLOCKS = create("evolution_stone_blocks")
|
||||
@JvmField val EVOLUTION_STONES = create("evolution_stones")
|
||||
@JvmField val EXPERIENCE_CANDIES = create("experience_candies")
|
||||
@JvmField val FEATHERS = create("feathers")
|
||||
@JvmField val FIRE_STONE_ORES = create("fire_stone_ores")
|
||||
@JvmField val FOSSIL_MACHINE_PARTS = create("fossil_machine_parts")
|
||||
@JvmField val FOSSILS = create("fossils")
|
||||
@JvmField val GILDED_CHESTS = create("gilded_chests")
|
||||
@JvmField val HANGING_SIGNS = create("hanging_signs")
|
||||
@JvmField val HERBS = create("herbs")
|
||||
@JvmField val ICE_STONE_ORES = create("ice_stone_ores")
|
||||
@JvmField val LEAF_STONE_ORES = create("leaf_stone_ores")
|
||||
@JvmField val MACHINES = create("machines")
|
||||
@JvmField val MINT_LEAF = create("mint_leaf")
|
||||
@JvmField val MINT_SEEDS = create("mint_seeds")
|
||||
@JvmField val MINTS = create("mints")
|
||||
@JvmField val MOON_STONE_ORES = create("moon_stone_ores")
|
||||
@JvmField val MUTATED_BERRIES = create("mutated_berries")
|
||||
@JvmField val PLANTS = create("plants")
|
||||
@JvmField val POKE_BALLS = create("poke_balls")
|
||||
@JvmField val POKE_RODS = create("poke_rods")
|
||||
@JvmField val POKEDEX = create("pokedex")
|
||||
@JvmField val POKEDEX_SCREEN = create("pokedex_screen")
|
||||
@JvmField val POTIONS = create("potions")
|
||||
@JvmField val PROTEIN_INGREDIENTS = create("protein_ingredients")
|
||||
/** See [COOKED_MEAT] */
|
||||
@JvmField
|
||||
val RAW_MEAT = create("raw_meat")
|
||||
@JvmField
|
||||
val SEEDS = create("seeds")
|
||||
@JvmField
|
||||
val SHINY_STONE_ORES = create("shiny_stone_ores")
|
||||
@JvmField
|
||||
val SIGNS = create("signs")
|
||||
@JvmField
|
||||
val SUN_STONE_ORES = create("sun_stone_ores")
|
||||
@JvmField
|
||||
val THUNDER_STONE_ORES = create("thunder_stone_ores")
|
||||
@JvmField
|
||||
val TUMBLESTONES = create("tumblestones")
|
||||
@JvmField
|
||||
val WATER_STONE_ORES = create("water_stone_ores")
|
||||
@JvmField
|
||||
val ZINC_INGREDIENTS = create("zinc_ingredients")
|
||||
@JvmField val RAW_MEAT = create("raw_meat")
|
||||
@JvmField val RED_TUMBLESTONE_BRICKS = create("red_tumblestone_bricks")
|
||||
@JvmField val RED_TUMBLESTONES = create("red_tumblestones")
|
||||
@JvmField val REMEDIES = create("remedies")
|
||||
@JvmField val RESTORES = create("restores")
|
||||
@JvmField val REVIVES = create("revives")
|
||||
@JvmField val SEEDS = create("seeds")
|
||||
@JvmField val SHINY_STONE_ORES = create("shiny_stone_ores")
|
||||
@JvmField val SIGNS = create("signs")
|
||||
@JvmField val SKY_TUMBLESTONE_BRICKS = create("sky_tumblestone_bricks")
|
||||
@JvmField val SKY_TUMBLESTONES = create("sky_tumblestones")
|
||||
@JvmField val SUN_STONE_ORES = create("sun_stone_ores")
|
||||
@JvmField val SWEETS = create("sweets")
|
||||
@JvmField val TEACUPS = create("teacups")
|
||||
@JvmField val TEAPOTS = create("teapots")
|
||||
@JvmField val THUNDER_STONE_ORES = create("thunder_stone_ores")
|
||||
@JvmField val TIER_1_POKE_BALL_MATERIALS = create("tier_1_poke_ball_materials")
|
||||
@JvmField val TIER_1_POKE_BALLS = create("tier_1_poke_balls")
|
||||
@JvmField val TIER_2_POKE_BALL_MATERIALS = create("tier_2_poke_ball_materials")
|
||||
@JvmField val TIER_2_POKE_BALLS = create("tier_2_poke_balls")
|
||||
@JvmField val TIER_3_POKE_BALL_MATERIALS = create("tier_3_poke_ball_materials")
|
||||
@JvmField val TIER_3_POKE_BALLS = create("tier_3_poke_balls")
|
||||
@JvmField val TIER_4_POKE_BALL_MATERIALS = create("tier_4_poke_ball_materials")
|
||||
@JvmField val TIER_4_POKE_BALLS = create("tier_4_poke_balls")
|
||||
@JvmField val TIER_5_POKE_BALLS = create("tier_5_poke_balls")
|
||||
@JvmField val TUMBLESTONE_BRICKS = create("tumblestone_bricks")
|
||||
@JvmField val TUMBLESTONES = create("tumblestones")
|
||||
@JvmField val TYPE_GEMS = create("type_gems")
|
||||
@JvmField val VITAMINS = create("vitamins")
|
||||
@JvmField val WATER_STONE_ORES = create("water_stone_ores")
|
||||
@JvmField val ZINC_INGREDIENTS = create("zinc_ingredients")
|
||||
|
||||
// Held Item Tags
|
||||
@JvmField
|
||||
val ANY_HELD_ITEM = create("held/is_held_item")
|
||||
@JvmField
|
||||
val EXPERIENCE_SHARE = create("held/experience_share")
|
||||
@JvmField
|
||||
val LUCKY_EGG = create("held/lucky_egg")
|
||||
@JvmField
|
||||
val DESTINY_KNOT = create("held/destiny_knot")
|
||||
@JvmField
|
||||
val EVERSTONE = create("held/everstone")
|
||||
@JvmField
|
||||
val POWER_ANKLET = create("held/power_anklet")
|
||||
@JvmField
|
||||
val POWER_BAND = create("held/power_band")
|
||||
@JvmField
|
||||
val POWER_BELT = create("held/power_belt")
|
||||
@JvmField
|
||||
val POWER_BRACER = create("held/power_bracer")
|
||||
@JvmField
|
||||
val POWER_LENS = create("held/power_lens")
|
||||
@JvmField
|
||||
val POWER_WEIGHT = create("held/power_weight")
|
||||
@JvmField
|
||||
val CONSUMED_IN_NPC_BATTLE = create("held/consumed_in_npc_battle")
|
||||
@JvmField
|
||||
val CONSUMED_IN_PVP_BATTLE = create("held/consumed_in_pvp_battle")
|
||||
@JvmField
|
||||
val CONSUMED_IN_WILD_BATTLE = create("held/consumed_in_wild_battle")
|
||||
@JvmField
|
||||
val TERRAIN_SEEDS = create("held/terrain_seeds")
|
||||
@JvmField val CONSUMED_IN_NPC_BATTLE = create("held/consumed_in_npc_battle")
|
||||
@JvmField val CONSUMED_IN_PVP_BATTLE = create("held/consumed_in_pvp_battle")
|
||||
@JvmField val CONSUMED_IN_WILD_BATTLE = create("held/consumed_in_wild_battle")
|
||||
@JvmField val DESTINY_KNOT = create("held/destiny_knot")
|
||||
@JvmField val EVERSTONE = create("held/everstone")
|
||||
@JvmField val EXPERIENCE_SHARE = create("held/experience_share")
|
||||
@JvmField val IS_FRIENDSHIP_BOOSTER = create("is_friendship_booster")
|
||||
@JvmField val ANY_HELD_ITEM = create("held/is_held_item")
|
||||
/** Tag that flags items as being able to "create" [CobblemonItems.LEFTOVERS]. */
|
||||
@JvmField val LEAVES_LEFTOVERS = create("held/leaves_leftovers")
|
||||
@JvmField val LUCKY_EGG = create("held/lucky_egg")
|
||||
@JvmField val POWER_ANKLET = create("held/power_anklet")
|
||||
@JvmField val POWER_BAND = create("held/power_band")
|
||||
@JvmField val POWER_BELT = create("held/power_belt")
|
||||
@JvmField val POWER_BRACER = create("held/power_bracer")
|
||||
@JvmField val POWER_LENS = create("held/power_lens")
|
||||
@JvmField val POWER_WEIGHT = create("held/power_weight")
|
||||
@JvmField val TERRAIN_SEEDS = create("held/terrain_seeds")
|
||||
|
||||
/**
|
||||
* Tag that flags items as being able to "create" [CobblemonItems.LEFTOVERS].
|
||||
*/
|
||||
@JvmField
|
||||
val LEAVES_LEFTOVERS = create("held/leaves_leftovers")
|
||||
|
||||
@JvmField
|
||||
val POTTERY_SHERDS = create("decorated_pot_sherds")
|
||||
|
||||
@JvmField
|
||||
val ABILITY_CHANGERS = create("ability_changers")
|
||||
|
||||
@JvmField
|
||||
val IS_FRIENDSHIP_BOOSTER = create("is_friendship_booster")
|
||||
|
||||
private fun create(path: String) = TagKey.create(Registries.ITEM, cobblemonResource(path))
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
package com.cobblemon.mod.common.battles.dispatch
|
||||
|
||||
import com.cobblemon.mod.common.api.battles.model.PokemonBattle
|
||||
import org.objectweb.asm.tree.analysis.Interpreter
|
||||
|
||||
class InstructionSet {
|
||||
val instructions: MutableList<InterpreterInstruction> = mutableListOf()
|
||||
|
||||
+3
-3
@@ -65,8 +65,8 @@ class GraalShowdownUnbundler {
|
||||
}
|
||||
|
||||
if (extract) {
|
||||
FileUtils.copyInternalToExternal("data/${Cobblemon.MODID}/showdown.zip", showdownZip.toPath())
|
||||
FileUtils.copyInternalToExternal("data/${Cobblemon.MODID}/showdown.json", showdownMetadataFile.toPath())
|
||||
FileUtils.copyInternalToExternal("/data/${Cobblemon.MODID}/showdown.zip", showdownZip.toPath())
|
||||
FileUtils.copyInternalToExternal("/data/${Cobblemon.MODID}/showdown.json", showdownMetadataFile.toPath())
|
||||
FileUtils.unzipFile(showdownZip.toPath(), showdownDir.toPath())
|
||||
showdownZip.delete()
|
||||
}
|
||||
@@ -75,7 +75,7 @@ class GraalShowdownUnbundler {
|
||||
|
||||
private fun loadShowdownMetadata() : ShowdownMetadata? {
|
||||
try {
|
||||
val inputStream = javaClass.classLoader.getResourceAsStream("data/${Cobblemon.MODID}/showdown.json")!!
|
||||
val inputStream = javaClass.getResourceAsStream("/data/${Cobblemon.MODID}/showdown.json")!!
|
||||
return gson.fromJson<ShowdownMetadata>(InputStreamReader(inputStream))
|
||||
} catch (exception: Exception) {
|
||||
exception.printStackTrace()
|
||||
|
||||
@@ -17,6 +17,10 @@ class GrabbedStorageSlot(
|
||||
private val pokemon: Pokemon
|
||||
) : StorageSlot(x, y, parent, {}) {
|
||||
|
||||
init {
|
||||
isSelected = true
|
||||
}
|
||||
|
||||
override fun renderWidget(context: GuiGraphics, mouseX: Int, mouseY: Int, delta: Float) {
|
||||
renderSlot(context = context, posX = mouseX - (width / 2), posY = mouseY - (height / 2), partialTicks = delta)
|
||||
}
|
||||
|
||||
@@ -40,7 +40,8 @@ import net.minecraft.sounds.SoundEvent
|
||||
class PCGUI(
|
||||
val pc: ClientPC,
|
||||
val party: ClientParty,
|
||||
val configuration: PCGUIConfiguration
|
||||
val configuration: PCGUIConfiguration,
|
||||
val openOnBox: Int = 0
|
||||
) : Screen(Component.translatable("cobblemon.ui.pc.title")), CobblemonRenderable {
|
||||
|
||||
companion object {
|
||||
@@ -110,6 +111,7 @@ class PCGUI(
|
||||
pc = pc,
|
||||
party = party
|
||||
)
|
||||
this.storageWidget.box = openOnBox
|
||||
|
||||
this.setPreviewPokemon(null)
|
||||
this.addRenderableWidget(storageWidget)
|
||||
|
||||
@@ -46,6 +46,8 @@ open class StorageSlot(
|
||||
private val slotOverlayMoveIconResource = cobblemonResource("textures/gui/pasture/pc_slot_icon_move.png")
|
||||
}
|
||||
|
||||
protected var isSelected = false;
|
||||
|
||||
override fun playDownSound(soundManager: SoundManager) {
|
||||
}
|
||||
|
||||
@@ -82,50 +84,52 @@ open class StorageSlot(
|
||||
|
||||
context.disableScissor()
|
||||
|
||||
// Ensure elements are not hidden behind Pokémon render
|
||||
matrices.pushPose()
|
||||
matrices.translate(0.0, 0.0, 100.0)
|
||||
// Level
|
||||
drawScaledText(
|
||||
context = context,
|
||||
text = lang("ui.lv.number", pokemon.level),
|
||||
x = posX + 1,
|
||||
y = posY + 1,
|
||||
shadow = true,
|
||||
scale = PCGUI.SCALE
|
||||
)
|
||||
|
||||
if (pokemon.gender != Gender.GENDERLESS) {
|
||||
blitk(
|
||||
matrixStack = matrices,
|
||||
texture = if (pokemon.gender == Gender.MALE) genderIconMale else genderIconFemale,
|
||||
x = (posX + 21) / PCGUI.SCALE,
|
||||
y = (posY + 1) / PCGUI.SCALE,
|
||||
width = 6,
|
||||
height = 8,
|
||||
if (!isSelected) {
|
||||
// Ensure elements are not hidden behind Pokémon render
|
||||
matrices.pushPose()
|
||||
matrices.translate(0.0, 0.0, 100.0)
|
||||
// Level
|
||||
drawScaledText(
|
||||
context = context,
|
||||
text = lang("ui.lv.number", pokemon.level),
|
||||
x = posX + 1,
|
||||
y = posY + 1,
|
||||
shadow = true,
|
||||
scale = PCGUI.SCALE
|
||||
)
|
||||
}
|
||||
|
||||
// Held Item
|
||||
val heldItem = pokemon.heldItemNoCopy()
|
||||
if (!heldItem.isEmpty) {
|
||||
renderScaledGuiItemIcon(
|
||||
itemStack = heldItem,
|
||||
x = posX + 16.0,
|
||||
y = posY + 16.0,
|
||||
scale = 0.5,
|
||||
matrixStack = matrices
|
||||
)
|
||||
if (pokemon.gender != Gender.GENDERLESS) {
|
||||
blitk(
|
||||
matrixStack = matrices,
|
||||
texture = if (pokemon.gender == Gender.MALE) genderIconMale else genderIconFemale,
|
||||
x = (posX + 21) / PCGUI.SCALE,
|
||||
y = (posY + 1) / PCGUI.SCALE,
|
||||
width = 6,
|
||||
height = 8,
|
||||
scale = PCGUI.SCALE
|
||||
)
|
||||
}
|
||||
|
||||
// Held Item
|
||||
val heldItem = pokemon.heldItemNoCopy()
|
||||
if (!heldItem.isEmpty) {
|
||||
renderScaledGuiItemIcon(
|
||||
itemStack = heldItem,
|
||||
x = posX + 16.0,
|
||||
y = posY + 16.0,
|
||||
scale = 0.5,
|
||||
matrixStack = matrices
|
||||
)
|
||||
}
|
||||
matrices.popPose()
|
||||
}
|
||||
matrices.popPose()
|
||||
|
||||
// Ensure overlay elements are on top
|
||||
matrices.pushPose()
|
||||
matrices.translate(0.0, 0.0, 500.0)
|
||||
|
||||
val config = parent.pcGui.configuration
|
||||
if (pokemon.tetheringId != null) {
|
||||
if (pokemon.tetheringId != null && !isSelected) {
|
||||
if (isStationary()) {
|
||||
blitk(
|
||||
matrixStack = matrices,
|
||||
|
||||
@@ -286,7 +286,10 @@ class StorageWidget(
|
||||
}
|
||||
|
||||
pastureWidget?.render(context, mouseX, mouseY, delta)
|
||||
matrices.pushPose()
|
||||
matrices.translate(0.0, 0.0, 1000.0)
|
||||
grabbedSlot?.render(context, mouseX, mouseY, delta)
|
||||
matrices.popPose()
|
||||
}
|
||||
|
||||
override fun mouseClicked(pMouseX: Double, pMouseY: Double, pButton: Int): Boolean {
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
package com.cobblemon.mod.common.client.gui.toast
|
||||
|
||||
import com.cobblemon.mod.common.net.messages.client.toast.ToastPacket
|
||||
import net.fabricmc.api.EnvType
|
||||
import net.fabricmc.api.Environment
|
||||
import net.minecraft.client.gui.GuiGraphics
|
||||
import net.minecraft.client.gui.components.toasts.Toast
|
||||
import net.minecraft.client.gui.components.toasts.ToastComponent
|
||||
@@ -19,6 +21,7 @@ import net.minecraft.util.Mth
|
||||
import java.util.*
|
||||
import kotlin.math.min
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
class CobblemonToast(
|
||||
val id: UUID,
|
||||
var icon: ItemStack,
|
||||
|
||||
+1
-1
@@ -18,6 +18,6 @@ import net.minecraft.client.Minecraft
|
||||
object OpenPCHandler : ClientNetworkPacketHandler<OpenPCPacket> {
|
||||
override fun handle(packet: OpenPCPacket, client: Minecraft) {
|
||||
val pc = CobblemonClient.storage.pcStores[packet.storeID] ?: return
|
||||
Minecraft.getInstance().setScreen(PCGUI(pc, CobblemonClient.storage.myParty, PCGUIConfiguration()))
|
||||
Minecraft.getInstance().setScreen(PCGUI(pc, CobblemonClient.storage.myParty, PCGUIConfiguration(), packet.box))
|
||||
}
|
||||
}
|
||||
+7
-7
@@ -116,7 +116,7 @@ class PokedexScannerRenderer {
|
||||
drawScaledText(
|
||||
context = graphics,
|
||||
font = CobblemonResources.DEFAULT_LARGE,
|
||||
text = lang("ui.lv.number", pokedexEntityData.level).bold(),
|
||||
text = lang("ui.lv.number", pokedexEntityData.pokemon.level).bold(),
|
||||
x = centerX + xOffset + xOffsetText,
|
||||
y = centerY + yOffset + yOffsetText,
|
||||
shadow = true,
|
||||
@@ -126,7 +126,7 @@ class PokedexScannerRenderer {
|
||||
|
||||
if (infoDisplayedCounter == 2) {
|
||||
val hasTrainer = (usageContext.scannableEntityInFocus?.resolveEntityScan() as? PokemonEntity)?.ownerUUID !== null
|
||||
val speciesName = pokedexEntityData.species.translatedName.bold()
|
||||
val speciesName = pokedexEntityData.getApparentSpecies().translatedName.bold()
|
||||
var yOffsetName = if (hasTrainer) 2 else 0
|
||||
if (hasTrainer) {
|
||||
drawScaledText(
|
||||
@@ -149,7 +149,7 @@ class PokedexScannerRenderer {
|
||||
centered = true
|
||||
)
|
||||
|
||||
val gender = pokedexEntityData.gender
|
||||
val gender = pokedexEntityData.pokemon.gender
|
||||
val speciesNameWidth = Minecraft.getInstance().font.width(speciesName.font(CobblemonResources.DEFAULT_LARGE))
|
||||
if (gender != Gender.GENDERLESS) {
|
||||
val isMale = gender == Gender.MALE
|
||||
@@ -179,14 +179,14 @@ class PokedexScannerRenderer {
|
||||
}
|
||||
|
||||
if (infoDisplayedCounter == 3) {
|
||||
val typeText = lang("type.suffix", pokedexEntityData.form.types.map { it.displayName.copy() }.reduce { acc, next -> acc.plus("/").plus(next) }).bold()
|
||||
val typeText = lang("type.suffix", pokedexEntityData.getApparentForm().types.map { it.displayName.copy() }.reduce { acc, next -> acc.plus("/").plus(next) }).bold()
|
||||
val typeWidth = Minecraft.getInstance().font.width(typeText.font(CobblemonResources.DEFAULT_LARGE))
|
||||
// Split into 2 lines if text width is too long
|
||||
if (typeWidth > (OUTER_INFO_FRAME_WIDTH - 8) && pokedexEntityData.form.secondaryType !== null) {
|
||||
if (typeWidth > (OUTER_INFO_FRAME_WIDTH - 8) && pokedexEntityData.getApparentForm().secondaryType !== null) {
|
||||
drawScaledText(
|
||||
context = graphics,
|
||||
font = CobblemonResources.DEFAULT_LARGE,
|
||||
text = lang("type.suffix", pokedexEntityData.form.primaryType.displayName).bold(),
|
||||
text = lang("type.suffix", pokedexEntityData.getApparentForm().primaryType.displayName).bold(),
|
||||
x = centerX + xOffset + xOffsetText,
|
||||
y = centerY + yOffset + yOffsetText - 4,
|
||||
shadow = true,
|
||||
@@ -196,7 +196,7 @@ class PokedexScannerRenderer {
|
||||
drawScaledText(
|
||||
context = graphics,
|
||||
font = CobblemonResources.DEFAULT_LARGE,
|
||||
text = lang("type.suffix", pokedexEntityData.form.secondaryType!!.displayName).bold(),
|
||||
text = lang("type.suffix", pokedexEntityData.getApparentForm().secondaryType!!.displayName).bold(),
|
||||
x = centerX + xOffset + xOffsetText,
|
||||
y = centerY + yOffset + yOffsetText + 3,
|
||||
shadow = true,
|
||||
|
||||
@@ -10,6 +10,7 @@ package com.cobblemon.mod.common.client.render
|
||||
|
||||
import com.cobblemon.mod.common.util.math.geometry.getOrigin
|
||||
import com.cobblemon.mod.common.util.math.geometry.transformPosition
|
||||
import net.fabricmc.loader.impl.lib.sat4j.core.Vec
|
||||
import org.joml.Matrix4f
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
|
||||
+3
@@ -14,6 +14,8 @@ import com.cobblemon.mod.common.entity.fishing.PokeRodFishingBobberEntity
|
||||
import com.cobblemon.mod.common.item.interactive.PokerodItem
|
||||
import com.cobblemon.mod.common.util.cobblemonResource
|
||||
import java.awt.Color
|
||||
import net.fabricmc.api.EnvType
|
||||
import net.fabricmc.api.Environment
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture
|
||||
import net.minecraft.client.renderer.RenderType
|
||||
@@ -31,6 +33,7 @@ import net.minecraft.world.entity.HumanoidArm
|
||||
import net.minecraft.world.item.ItemDisplayContext
|
||||
import org.joml.Quaternionf
|
||||
|
||||
@Environment(value = EnvType.CLIENT)
|
||||
class PokeBobberEntityRenderer(context: EntityRendererProvider.Context?) : EntityRenderer<PokeRodFishingBobberEntity>(context) {
|
||||
|
||||
override fun render(fishingBobberEntity: PokeRodFishingBobberEntity, elapsedPartialTicks: Float, tickDelta: Float, matrixStack: PoseStack, vertexConsumerProvider: MultiBufferSource, light: Int) {
|
||||
|
||||
+12
-6
@@ -15,12 +15,12 @@ import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.item.PokemonItem
|
||||
import com.cobblemon.mod.common.util.math.fromEulerXYZDegrees
|
||||
import com.mojang.blaze3d.platform.Lighting
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture
|
||||
import net.minecraft.client.renderer.RenderType
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer
|
||||
import net.minecraft.client.renderer.MultiBufferSource
|
||||
import com.mojang.blaze3d.vertex.PoseStack
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer
|
||||
import net.minecraft.client.renderer.LightTexture
|
||||
import net.minecraft.client.renderer.MultiBufferSource
|
||||
import net.minecraft.client.renderer.RenderType
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture
|
||||
import net.minecraft.world.item.ItemDisplayContext
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import org.joml.Quaternionf
|
||||
@@ -50,7 +50,10 @@ class PokemonItemRenderer : CobblemonBuiltinItemRenderer {
|
||||
|
||||
val transformations = positions[mode]!!
|
||||
|
||||
Lighting.setupForFlatItems()
|
||||
if (mode == ItemDisplayContext.GUI) {
|
||||
Lighting.setupForFlatItems()
|
||||
}
|
||||
|
||||
matrices.scale(transformations.scale.x, transformations.scale.y, transformations.scale.z)
|
||||
matrices.translate(transformations.translation.x, transformations.translation.y, transformations.translation.z)
|
||||
state.setPoseToFirstSuitable(PoseType.PORTRAIT)
|
||||
@@ -84,7 +87,10 @@ class PokemonItemRenderer : CobblemonBuiltinItemRenderer {
|
||||
model.setDefault()
|
||||
matrices.popPose()
|
||||
matrices.popPose()
|
||||
Lighting.setupFor3DItems()
|
||||
|
||||
if (mode == ItemDisplayContext.GUI) {
|
||||
Lighting.setupFor3DItems()
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
||||
+3
@@ -13,6 +13,7 @@ import com.cobblemon.mod.common.client.render.models.blockbench.animation.BipedW
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
@@ -40,6 +41,8 @@ class NidokingModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, B
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("nidoking", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("nidoking", "blink")}
|
||||
standing = registerPose(
|
||||
|
||||
+3
@@ -14,6 +14,7 @@ import com.cobblemon.mod.common.client.render.models.blockbench.animation.BipedW
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
|
||||
@@ -40,6 +41,8 @@ class NidoqueenModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame,
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("nidoqueen", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("nidoqueen", "blink")}
|
||||
val spg = quirk(secondsBetweenOccurrences = 600F to 900F) { bedrockStateful("nidoqueen", "spgs_happy_place") }
|
||||
|
||||
+3
@@ -11,6 +11,7 @@ package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.QuadrupedWalkAnimation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.QuadrupedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
|
||||
@@ -37,6 +38,8 @@ class NidoranfModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, Q
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var walk: CobblemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("nidoranf", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("nidoranf", "blink") }
|
||||
standing = registerPose(
|
||||
|
||||
+3
@@ -11,6 +11,7 @@ package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.QuadrupedWalkAnimation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.QuadrupedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
|
||||
@@ -37,6 +38,8 @@ class NidoranmModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, Q
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("nidoranm", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("nidoranm", "blink") }
|
||||
standing = registerPose(
|
||||
|
||||
+3
@@ -11,6 +11,7 @@ package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.QuadrupedWalkAnimation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.QuadrupedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
@@ -40,6 +41,8 @@ class NidorinaModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, Q
|
||||
lateinit var walk: Pose
|
||||
lateinit var battleidle: Pose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("nidorina", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("nidorina", "blink")}
|
||||
standing = registerPose(
|
||||
|
||||
+3
@@ -12,6 +12,7 @@ import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonP
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.QuadrupedWalkAnimation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.QuadrupedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
|
||||
@@ -36,6 +37,8 @@ class NidorinoModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, Q
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("nidorino", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("nidorino", "blink")}
|
||||
standing = registerPose(
|
||||
|
||||
+3
@@ -8,6 +8,7 @@
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
@@ -32,6 +33,8 @@ class PinsirModel(root: ModelPart) : PokemonPosableModel(root) {
|
||||
lateinit var battleidle: CobblemonPose
|
||||
lateinit var sleep: CobblemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("pinsir", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("pinsir", "blink")}
|
||||
sleep = registerPose(
|
||||
|
||||
-100
@@ -1,100 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
|
||||
import com.cobblemon.mod.common.util.isBattling
|
||||
import com.cobblemon.mod.common.util.isUnderWater
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class SlowbroModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("slowbro")
|
||||
override val head = getPart("head")
|
||||
|
||||
override var portraitScale = 2.0F
|
||||
override var portraitTranslation = Vec3(-0.23, -0.1, 0.0)
|
||||
|
||||
override var profileScale = 0.95F
|
||||
override var profileTranslation = Vec3(0.0, 0.3, 0.0)
|
||||
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
lateinit var float: Pose
|
||||
lateinit var swim: Pose
|
||||
lateinit var battleidle: Pose
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("slowbro", "blink1") }
|
||||
val blink2 = quirk { bedrockStateful("slowbro", "blink2") }
|
||||
val bite = quirk(secondsBetweenOccurrences = 60F to 120F) { bedrockStateful("slowbro", "bite_quirk") }
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = UI_POSES + PoseType.STAND,
|
||||
quirks = arrayOf(blink, blink2, bite),
|
||||
condition = { !it.isBattling },
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("slowbro", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseType = PoseType.WALK,
|
||||
quirks = arrayOf(blink, blink2, bite),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("slowbro", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
float = registerPose(
|
||||
poseName = "float",
|
||||
poseType = PoseType.FLOAT,
|
||||
quirks = arrayOf(blink, blink2, bite),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("slowbro", "water_idle")
|
||||
)
|
||||
)
|
||||
|
||||
swim = registerPose(
|
||||
poseName = "swim",
|
||||
poseType = PoseType.SWIM,
|
||||
quirks = arrayOf(blink, blink2, bite),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("slowbro", "water_swim")
|
||||
)
|
||||
)
|
||||
|
||||
battleidle = registerPose(
|
||||
poseName = "battle_idle",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink, blink2, bite),
|
||||
condition = { it.isBattling && !it.isUnderWater },
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("slowbro", "battle_idle")
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PosableState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("slowbro", "faint") else null
|
||||
}
|
||||
-96
@@ -1,96 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.animation.QuadrupedWalkAnimation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.QuadrupedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class SlowpokeModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, QuadrupedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("slowpoke")
|
||||
override val head = getPart("head")
|
||||
|
||||
override val foreLeftLeg= getPart("leftfrontleg")
|
||||
override val foreRightLeg = getPart("rightfrontleg")
|
||||
override val hindLeftLeg = getPart("leftbackleg")
|
||||
override val hindRightLeg = getPart("rightbackleg")
|
||||
|
||||
override var portraitScale = 2.2F
|
||||
override var portraitTranslation = Vec3(-0.6, -1.6, 0.0)
|
||||
|
||||
override var profileScale = 0.8F
|
||||
override var profileTranslation = Vec3(0.0, 0.52, 0.0)
|
||||
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
lateinit var float: Pose
|
||||
lateinit var swim: Pose
|
||||
lateinit var sleep: Pose
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("slowpoke", "blink") }
|
||||
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
animations = arrayOf(bedrock("slowpoke", "sleep"))
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = UI_POSES + PoseType.STAND,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("slowpoke", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseType = PoseType.WALK,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
QuadrupedWalkAnimation(this, periodMultiplier = 3.6F, amplitudeMultiplier = 2.2F),
|
||||
singleBoneLook(),
|
||||
bedrock("slowpoke", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
float = registerPose(
|
||||
poseName = "float",
|
||||
poseType = PoseType.FLOAT,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("slowpoke", "water_idle")
|
||||
)
|
||||
)
|
||||
|
||||
swim = registerPose(
|
||||
poseName = "swim",
|
||||
poseType = PoseType.SWIM,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("slowpoke", "water_swim")
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PosableState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("slowpoke", "faint") else null
|
||||
}
|
||||
-60
@@ -1,60 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class SnorlaxModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("snorlax")
|
||||
override val head = getPart("head")
|
||||
|
||||
override var portraitScale = 2.3F
|
||||
override var portraitTranslation = Vec3(-0.45, 0.75, 0.0)
|
||||
|
||||
override var profileScale = 0.75F
|
||||
override var profileTranslation = Vec3(0.0, 0.55, 0.0)
|
||||
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var walk: CobblemonPose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("snorlax", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = STATIONARY_POSES + UI_POSES,
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("snorlax", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = MOVING_POSES,
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("snorlax", "ground_walk")
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PosableState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("snorlax", "faint") else null
|
||||
}
|
||||
-65
@@ -1,65 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen1
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class TaurosModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("tauros")
|
||||
override val head = getPart("head")
|
||||
|
||||
override var portraitScale = 1.9F
|
||||
override var portraitTranslation = Vec3(-0.7, -0.25, 0.0)
|
||||
|
||||
override var profileScale = 0.75F
|
||||
override var profileTranslation = Vec3(0.0, 0.6, 0.0)
|
||||
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("tauros", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("tauros", "blink")}
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = STATIONARY_POSES + UI_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("tauros", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = MOVING_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("tauros", "ground_walk")
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PosableState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("tauros", "faint") else null
|
||||
}
|
||||
+1
-1
@@ -25,7 +25,7 @@ import net.minecraft.world.phys.Vec3
|
||||
|
||||
class FeraligatrModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("feraligatr")
|
||||
override val head = getPart("head")
|
||||
override val head = getPart("head_ai")
|
||||
|
||||
override val leftLeg = getPart("leg_left")
|
||||
override val rightLeg = getPart("leg_right")
|
||||
|
||||
+2
-1
@@ -9,6 +9,7 @@
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen2
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
@@ -32,7 +33,7 @@ class HitmontopModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
|
||||
lateinit var walk: Pose
|
||||
lateinit var battleidle: Pose
|
||||
|
||||
// override val cryAnimation = CryProvider { bedrockStateful("hitmontop", "cry") }
|
||||
override val cryAnimation = CryProvider { bedrockStateful("hitmontop", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("hitmontop", "blink") }
|
||||
|
||||
-99
@@ -1,99 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen2
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
|
||||
import com.cobblemon.mod.common.util.isBattling
|
||||
import com.cobblemon.mod.common.util.isInWater
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class SlowkingModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("slowking")
|
||||
override val head = getPart("head")
|
||||
|
||||
override var portraitScale = 2.0F
|
||||
override var portraitTranslation = Vec3(-0.1, 0.1, 0.0)
|
||||
|
||||
override var profileScale = 0.8F
|
||||
override var profileTranslation = Vec3(0.0, 0.55, 0.0)
|
||||
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
lateinit var float: Pose
|
||||
lateinit var swim: Pose
|
||||
lateinit var battleidle: Pose
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("slowking", "blink") }
|
||||
val blink2 = quirk { bedrockStateful("slowking", "blink2") }
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = UI_POSES + PoseType.STAND,
|
||||
quirks = arrayOf(blink, blink2),
|
||||
condition = { !it.isBattling },
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("slowking", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseType = PoseType.WALK,
|
||||
quirks = arrayOf(blink, blink2),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("slowking", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
float = registerPose(
|
||||
poseName = "float",
|
||||
poseType = PoseType.FLOAT,
|
||||
quirks = arrayOf(blink, blink2),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("slowking", "water_idle")
|
||||
)
|
||||
)
|
||||
|
||||
swim = registerPose(
|
||||
poseName = "swim",
|
||||
poseType = PoseType.SWIM,
|
||||
quirks = arrayOf(blink, blink2),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("slowking", "water_swim")
|
||||
)
|
||||
)
|
||||
|
||||
battleidle = registerPose(
|
||||
poseName = "battle_idle",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink, blink2),
|
||||
condition = { it.isBattling },
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("slowking", "battle_idle")
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// override fun getFaintAnimation(
|
||||
// pokemonEntity: PokemonEntity,
|
||||
// state: PosableState<PokemonEntity>
|
||||
// ) = if (state.isPosedIn(standing, walk)) bedrockStateful("slowking", "faint") else null
|
||||
}
|
||||
-83
@@ -1,83 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen5
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.util.asExpressionLike
|
||||
import com.cobblemon.mod.common.util.isBattling
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class KrokorokModel (root: ModelPart) : PokemonPosableModel(root) {
|
||||
override val rootPart = root.registerChildWithAllChildren("krokorok")
|
||||
|
||||
override var portraitScale = 1.86F
|
||||
override var portraitTranslation = Vec3(-0.43, 0.98, 0.0)
|
||||
|
||||
override var profileScale = 0.55F
|
||||
override var profileTranslation = Vec3(0.05, 0.93, 0.0)
|
||||
|
||||
lateinit var sleep: CobblemonPose
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var walk: CobblemonPose
|
||||
lateinit var battleidle: CobblemonPose
|
||||
|
||||
override fun registerPoses() {
|
||||
// animations["physical"] = "q.bedrock_primary('krokorok', 'physical', 'look', q.curve('symmetrical_wide'))".asExpressionLike()
|
||||
// animations["special"] = "q.bedrock_primary('krokorok', 'special', 'look', q.curve('symmetrical_wide'))".asExpressionLike()
|
||||
// animations["status"] = "q.bedrock_primary('krokorok', 'status', q.curve('symmetrical_wide'))".asExpressionLike()
|
||||
// animations["recoil"] = "q.bedrock_stateful('krokorok', 'recoil')".asExpressionLike()
|
||||
animations["cry"] = "q.bedrock_stateful('krokorok', 'cry')".asExpressionLike()
|
||||
|
||||
val faint = "q.bedrock_primary('krokorok', 'faint', q.curve('one'))".asExpressionLike()
|
||||
|
||||
val blink = quirk { bedrockStateful("krokorok", "blink") }
|
||||
val look = quirk { bedrockStateful("krokorok", "look_quirk") }
|
||||
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
namedAnimations = mutableMapOf("faint" to faint),
|
||||
animations = arrayOf(bedrock("krokorok", "sleep"))
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
quirks = arrayOf(blink, look),
|
||||
condition = { !it.isBattling },
|
||||
namedAnimations = mutableMapOf("faint" to faint),
|
||||
animations = arrayOf(
|
||||
bedrock("krokorok", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
namedAnimations = mutableMapOf("faint" to faint),
|
||||
animations = arrayOf(
|
||||
bedrock("krokorok", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
battleidle = registerPose(
|
||||
poseName = "battle_idle",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
quirks = arrayOf(blink, look),
|
||||
condition = { it.isBattling },
|
||||
namedAnimations = mutableMapOf("faint" to faint),
|
||||
animations = arrayOf(
|
||||
bedrock("krokorok", "battle_idle")
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
-84
@@ -1,84 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen5
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.CobblemonPose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.util.asExpressionLike
|
||||
import com.cobblemon.mod.common.util.isBattling
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class SandileModel (root: ModelPart) : PokemonPosableModel(root) {
|
||||
override val rootPart = root.registerChildWithAllChildren("sandile")
|
||||
|
||||
override var portraitScale = 2.54F
|
||||
override var portraitTranslation = Vec3(-0.5, -1.9, 0.0)
|
||||
|
||||
override var profileScale = 0.84F
|
||||
override var profileTranslation = Vec3(0.05, 0.48, 0.0)
|
||||
|
||||
lateinit var sleep: CobblemonPose
|
||||
lateinit var standing: CobblemonPose
|
||||
lateinit var walk: CobblemonPose
|
||||
lateinit var battle_idle: CobblemonPose
|
||||
|
||||
override fun registerPoses() {
|
||||
// animations["physical"] = "q.bedrock_primary('sandile', 'physical', 'look', q.curve('symmetrical_wide'))".asExpressionLike()
|
||||
// animations["special"] = "q.bedrock_primary('sandile', 'special', 'look', q.curve('symmetrical_wide'))".asExpressionLike()
|
||||
// animations["status"] = "q.bedrock_primary('sandile', 'status', q.curve('symmetrical_wide'))".asExpressionLike()
|
||||
// animations["recoil"] = "q.bedrock_stateful('sandile', 'recoil')".asExpressionLike()
|
||||
animations["cry"] = "q.bedrock_stateful('sandile', 'cry')".asExpressionLike()
|
||||
|
||||
val faint = "q.bedrock_primary('sandile', 'faint', q.curve('one'))".asExpressionLike()
|
||||
|
||||
val blink = quirk { bedrockStateful("sandile", "blink") }
|
||||
val bite = quirk { bedrockStateful("sandile", "bite_quirk") }
|
||||
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
quirks = arrayOf(bite),
|
||||
namedAnimations = mutableMapOf("faint" to faint),
|
||||
animations = arrayOf(bedrock("sandile", "sleep"))
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = PoseType.STATIONARY_POSES + PoseType.UI_POSES,
|
||||
quirks = arrayOf(blink, bite),
|
||||
condition = { !it.isBattling },
|
||||
namedAnimations = mutableMapOf("faint" to faint),
|
||||
animations = arrayOf(
|
||||
bedrock("sandile", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walk = registerPose(
|
||||
poseName = "walk",
|
||||
poseTypes = PoseType.MOVING_POSES,
|
||||
quirks = arrayOf(blink),
|
||||
namedAnimations = mutableMapOf("faint" to faint),
|
||||
animations = arrayOf(
|
||||
bedrock("sandile", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
battle_idle = registerPose(
|
||||
poseName = "battle_idle",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
quirks = arrayOf(blink, bite),
|
||||
condition = { it.isBattling },
|
||||
namedAnimations = mutableMapOf("faint" to faint),
|
||||
animations = arrayOf(
|
||||
bedrock("sandile", "battle_idle")
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
+6
-3
@@ -8,6 +8,7 @@
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen8
|
||||
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
@@ -21,15 +22,17 @@ class EiscueModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
|
||||
override val head = getPart("head")
|
||||
|
||||
override var portraitScale = 2.0F
|
||||
override var portraitTranslation = Vec3(-0.1, -0.2, 0.0)
|
||||
override var portraitTranslation = Vec3(-0.1, 0.31, 0.0)
|
||||
|
||||
override var profileScale = 1.0F
|
||||
override var profileTranslation = Vec3(0.0, 0.3, 0.0)
|
||||
override var profileScale = 0.8F
|
||||
override var profileTranslation = Vec3(0.0, 0.55, 0.0)
|
||||
|
||||
lateinit var standing: Pose
|
||||
lateinit var walk: Pose
|
||||
lateinit var sleep: Pose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("eiscue_ice", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("eiscue_ice", "blink")}
|
||||
sleep = registerPose(
|
||||
|
||||
+1
-1
@@ -71,7 +71,7 @@ class RabootModel (root: ModelPart) : PokemonPosableModel(root), HeadedFrame {
|
||||
poseName = "battle_idle",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
condition = { it.isBattling },
|
||||
quirks = arrayOf(blink, hipQuirk),
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("raboot", "battle_idle")
|
||||
|
||||
-91
@@ -1,91 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen9
|
||||
|
||||
// import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
|
||||
import com.cobblemon.mod.common.util.isBattling
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class ArmarougeModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame, BimanualFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("armarouge")
|
||||
override val head = getPart("head")
|
||||
override val rightArm = getPart("arm_right")
|
||||
override val leftArm = getPart("arm_left")
|
||||
override val rightLeg = getPart("leg_right")
|
||||
override val leftLeg = getPart("leg_left")
|
||||
|
||||
override var portraitScale = 1.8F
|
||||
override var portraitTranslation = Vec3(-0.2, 1.8, 0.0)
|
||||
|
||||
override var profileScale = 0.5F
|
||||
override var profileTranslation = Vec3(0.0, 1.0, 0.0)
|
||||
|
||||
lateinit var standing: Pose
|
||||
lateinit var walking: Pose
|
||||
lateinit var sleep: Pose
|
||||
lateinit var battleidle: Pose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("armarouge", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("armarouge", "blink") }
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
animations = arrayOf(bedrock("armarouge", "sleep"))
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = STATIONARY_POSES + UI_POSES,
|
||||
transformTicks = 10,
|
||||
condition = { !it.isBattling },
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("armarouge", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walking = registerPose(
|
||||
poseName = "walking",
|
||||
poseTypes = MOVING_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("armarouge", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
battleidle = registerPose(
|
||||
poseName = "battle_idle",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
condition = { it.isBattling },
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("armarouge", "battle_idle")
|
||||
)
|
||||
)
|
||||
}
|
||||
override fun getFaintAnimation(state: PosableState) = if (state.isPosedIn(standing, walking, battleidle, sleep)) bedrockStateful("armarouge", "faint") else null
|
||||
}
|
||||
-120
@@ -1,120 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Cobblemon Contributors
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
package com.cobblemon.mod.common.client.render.models.blockbench.pokemon.gen9
|
||||
|
||||
// import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.PosableState
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.createTransformation
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BimanualFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.BipedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.frame.HeadedFrame
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.CryProvider
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pokemon.PokemonPosableModel
|
||||
import com.cobblemon.mod.common.client.render.models.blockbench.pose.Pose
|
||||
import com.cobblemon.mod.common.entity.PoseType
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.MOVING_POSES
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.STATIONARY_POSES
|
||||
import com.cobblemon.mod.common.entity.PoseType.Companion.UI_POSES
|
||||
import com.cobblemon.mod.common.util.isBattling
|
||||
import net.minecraft.client.model.geom.ModelPart
|
||||
import net.minecraft.world.phys.Vec3
|
||||
|
||||
class CeruledgeModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame, BipedFrame, BimanualFrame {
|
||||
override val rootPart = root.registerChildWithAllChildren("ceruledge")
|
||||
override val head = getPart("head")
|
||||
override val rightArm = getPart("arm_right")
|
||||
override val leftArm = getPart("arm_left")
|
||||
override val rightLeg = getPart("leg_right")
|
||||
override val leftLeg = getPart("leg_left")
|
||||
val bladeright = getPart("blade_right")
|
||||
val bladeleft = getPart("blade_left")
|
||||
val passivebladeright = getPart("passive_blade_right")
|
||||
val passivebladeleft = getPart("passive_blade_left")
|
||||
|
||||
override var portraitScale = 1.8F
|
||||
override var portraitTranslation = Vec3(-0.2, 1.9, 0.0)
|
||||
|
||||
override var profileScale = 0.5F
|
||||
override var profileTranslation = Vec3(0.0, 1.0, 0.0)
|
||||
|
||||
lateinit var standing: Pose
|
||||
lateinit var walking: Pose
|
||||
lateinit var sleep: Pose
|
||||
lateinit var battleidle: Pose
|
||||
|
||||
override val cryAnimation = CryProvider { bedrockStateful("ceruledge", "cry") }
|
||||
|
||||
override fun registerPoses() {
|
||||
val blink = quirk { bedrockStateful("ceruledge", "blink") }
|
||||
sleep = registerPose(
|
||||
poseType = PoseType.SLEEP,
|
||||
transformedParts = arrayOf(
|
||||
bladeright.createTransformation().withVisibility(visibility = false),
|
||||
bladeleft.createTransformation().withVisibility(visibility = false),
|
||||
passivebladeright.createTransformation().withVisibility(visibility = true),
|
||||
passivebladeleft.createTransformation().withVisibility(visibility = true)
|
||||
),
|
||||
animations = arrayOf(bedrock("ceruledge", "sleep"))
|
||||
)
|
||||
|
||||
standing = registerPose(
|
||||
poseName = "standing",
|
||||
poseTypes = STATIONARY_POSES + UI_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
condition = { !it.isBattling },
|
||||
transformedParts = arrayOf(
|
||||
bladeright.createTransformation().withVisibility(visibility = false),
|
||||
bladeleft.createTransformation().withVisibility(visibility = false),
|
||||
passivebladeright.createTransformation().withVisibility(visibility = true),
|
||||
passivebladeleft.createTransformation().withVisibility(visibility = true)
|
||||
),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("ceruledge", "ground_idle")
|
||||
)
|
||||
)
|
||||
|
||||
walking = registerPose(
|
||||
poseName = "walking",
|
||||
poseTypes = MOVING_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
transformedParts = arrayOf(
|
||||
bladeright.createTransformation().withVisibility(visibility = false),
|
||||
bladeleft.createTransformation().withVisibility(visibility = false),
|
||||
passivebladeright.createTransformation().withVisibility(visibility = true),
|
||||
passivebladeleft.createTransformation().withVisibility(visibility = true)
|
||||
),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("ceruledge", "ground_walk")
|
||||
)
|
||||
)
|
||||
|
||||
battleidle = registerPose(
|
||||
poseName = "battle_idle",
|
||||
poseTypes = PoseType.STATIONARY_POSES,
|
||||
transformTicks = 10,
|
||||
quirks = arrayOf(blink),
|
||||
condition = { it.isBattling },
|
||||
transformedParts = arrayOf(
|
||||
bladeright.createTransformation().withVisibility(visibility = true),
|
||||
bladeleft.createTransformation().withVisibility(visibility = true),
|
||||
passivebladeright.createTransformation().withVisibility(visibility = false),
|
||||
passivebladeleft.createTransformation().withVisibility(visibility = false)
|
||||
),
|
||||
animations = arrayOf(
|
||||
singleBoneLook(),
|
||||
bedrock("ceruledge", "battle_idle")
|
||||
)
|
||||
)
|
||||
}
|
||||
override fun getFaintAnimation(state: PosableState) = if (state.isPosedIn(standing, walking, battleidle, sleep)) bedrockStateful("ceruledge", "faint2") else null
|
||||
}
|
||||
+2
-2
@@ -33,8 +33,8 @@ class CharcadetModel(root: ModelPart) : PokemonPosableModel(root), HeadedFrame,
|
||||
override val rightLeg = getPart("leg_right")
|
||||
override val leftLeg = getPart("leg_left")
|
||||
|
||||
override var portraitScale = 2.5F
|
||||
override var portraitTranslation = Vec3(-0.15, -0.45, 0.0)
|
||||
override var portraitScale = 1.7F
|
||||
override var portraitTranslation = Vec3(-0.15, 0.08, 0.0)
|
||||
|
||||
override var profileScale = 0.8F
|
||||
override var profileTranslation = Vec3(0.0, 0.6, 0.0)
|
||||
|
||||
-11
@@ -96,11 +96,8 @@ object PokemonModelRepository : VaryingModelRepository<PokemonPosableModel>() {
|
||||
inbuilt("fearow", ::FearowModel)
|
||||
inbuilt("flareon", ::FlareonModel)
|
||||
inbuilt("gengar", ::GengarModel)
|
||||
inbuilt("geodude", ::GeodudeModel)
|
||||
inbuilt("golbat", ::GolbatModel)
|
||||
inbuilt("golduck", ::GolduckModel)
|
||||
inbuilt("golem", ::GolemModel)
|
||||
inbuilt("graveler", ::GravelerModel)
|
||||
inbuilt("grimer", ::GrimerModel)
|
||||
inbuilt("growlithe", ::GrowlitheModel)
|
||||
inbuilt("hitmonchan", ::HitmonchanModel)
|
||||
@@ -146,14 +143,11 @@ object PokemonModelRepository : VaryingModelRepository<PokemonPosableModel>() {
|
||||
inbuilt("sandslash", ::SandslashModel)
|
||||
inbuilt("scyther", ::ScytherModel)
|
||||
inbuilt("seel", ::SeelModel)
|
||||
inbuilt("slowbro", ::SlowbroModel)
|
||||
inbuilt("slowpoke", ::SlowpokeModel)
|
||||
inbuilt("spearow", ::SpearowModel)
|
||||
inbuilt("starmie", ::StarmieModel)
|
||||
inbuilt("staryu", ::StaryuModel)
|
||||
inbuilt("steelix", ::SteelixModel)
|
||||
inbuilt("tangela", ::TangelaModel)
|
||||
inbuilt("tauros", ::TaurosModel)
|
||||
inbuilt("tentacool", ::TentacoolModel)
|
||||
inbuilt("tentacruel", ::TentacruelModel)
|
||||
inbuilt("vaporeon", ::VaporeonModel)
|
||||
@@ -179,7 +173,6 @@ object PokemonModelRepository : VaryingModelRepository<PokemonPosableModel>() {
|
||||
inbuilt("blissey", ::BlisseyModel)
|
||||
inbuilt("piloswine", ::PiloswineModel)
|
||||
inbuilt("quagsire", ::QuagsireModel)
|
||||
inbuilt("slowking", ::SlowkingModel)
|
||||
inbuilt("swinub", ::SwinubModel)
|
||||
inbuilt("wooper", ::WooperModel)
|
||||
inbuilt("wooper_paldean", ::WooperPaldeanModel)
|
||||
@@ -343,8 +336,6 @@ object PokemonModelRepository : VaryingModelRepository<PokemonPosableModel>() {
|
||||
inbuilt("shroomish", ::ShroomishModel)
|
||||
inbuilt("breloom", ::BreloomModel)
|
||||
inbuilt("charcadet", ::CharcadetModel)
|
||||
inbuilt("armarouge", ::ArmarougeModel)
|
||||
inbuilt("ceruledge", ::CeruledgeModel)
|
||||
inbuilt("flittle", ::FlittleModel)
|
||||
inbuilt("espathra", ::EspathraModel)
|
||||
inbuilt("surskit", ::SurskitModel)
|
||||
@@ -559,8 +550,6 @@ object PokemonModelRepository : VaryingModelRepository<PokemonPosableModel>() {
|
||||
inbuilt("roserade", ::RoseradeModel)
|
||||
inbuilt("woobat", ::WoobatModel)
|
||||
inbuilt("swoobat", ::SwoobatModel)
|
||||
inbuilt("sandile", ::SandileModel)
|
||||
inbuilt("krokorok", ::KrokorokModel)
|
||||
inbuilt("frillish", ::FrillishModel)
|
||||
inbuilt("jellicent", ::JellicentModel)
|
||||
inbuilt("cubchoo", ::CubchooModel)
|
||||
|
||||
@@ -0,0 +1,116 @@
|
||||
package com.cobblemon.mod.common.command
|
||||
|
||||
import com.cobblemon.mod.common.Cobblemon.config
|
||||
import com.cobblemon.mod.common.api.permission.CobblemonPermissions
|
||||
import com.cobblemon.mod.common.api.spawning.fishing.FishingSpawnCause
|
||||
import com.cobblemon.mod.common.api.spawning.fishing.FishingSpawner
|
||||
import com.cobblemon.mod.common.api.text.add
|
||||
import com.cobblemon.mod.common.api.text.green
|
||||
import com.cobblemon.mod.common.api.text.lightPurple
|
||||
import com.cobblemon.mod.common.api.text.plus
|
||||
import com.cobblemon.mod.common.api.text.red
|
||||
import com.cobblemon.mod.common.api.text.text
|
||||
import com.cobblemon.mod.common.api.text.underline
|
||||
import com.cobblemon.mod.common.api.text.yellow
|
||||
import com.cobblemon.mod.common.command.argument.SpawnBucketArgumentType
|
||||
import com.cobblemon.mod.common.util.lang
|
||||
import com.cobblemon.mod.common.util.permission
|
||||
import com.cobblemon.mod.common.util.toBlockPos
|
||||
import com.mojang.brigadier.Command
|
||||
import com.mojang.brigadier.CommandDispatcher
|
||||
import com.mojang.brigadier.context.CommandContext
|
||||
import net.minecraft.commands.CommandSourceStack
|
||||
import net.minecraft.commands.Commands
|
||||
import net.minecraft.network.chat.MutableComponent
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.server.level.ServerPlayer
|
||||
import java.text.DecimalFormat
|
||||
import kotlin.collections.component1
|
||||
import kotlin.collections.component2
|
||||
|
||||
object CheckFishingSpawnsCommand {
|
||||
const val PURPLE_THRESHOLD = 0.01F
|
||||
const val RED_THRESHOLD = 0.1F
|
||||
const val YELLOW_THRESHOLD = 5F
|
||||
val df = DecimalFormat("#.##")
|
||||
|
||||
fun register(dispatcher : CommandDispatcher<CommandSourceStack>) {
|
||||
dispatcher.register(Commands.literal("checkfishingspawn")
|
||||
.permission(CobblemonPermissions.CHECKSPAWNS)
|
||||
.then(
|
||||
Commands.argument("bucket", SpawnBucketArgumentType.spawnBucket())
|
||||
.requires { it.player != null }
|
||||
.executes { execute(it, it.source.playerOrException) }
|
||||
))
|
||||
}
|
||||
|
||||
private fun execute(context: CommandContext<CommandSourceStack>, player: ServerPlayer) : Int {
|
||||
if (!config.enableSpawning) {
|
||||
return 0
|
||||
}
|
||||
|
||||
val spawner = FishingSpawner()
|
||||
val bucket = SpawnBucketArgumentType.getSpawnBucket(context, "bucket")
|
||||
val cause = FishingSpawnCause(spawner, bucket, player, player.mainHandItem)
|
||||
|
||||
val level = player.commandSenderWorld as? ServerLevel ?: return 0
|
||||
val context = spawner.parseContext(
|
||||
cause,
|
||||
level,
|
||||
player.position().toBlockPos()
|
||||
) ?: return 0
|
||||
|
||||
val spawnProbabilities = spawner.getSpawningSelector()
|
||||
.getProbabilities(
|
||||
spawner,
|
||||
listOf(context)
|
||||
)
|
||||
|
||||
val spawnNames = mutableMapOf<String, MutableComponent>()
|
||||
val namedProbabilities = mutableMapOf<MutableComponent, Float>()
|
||||
|
||||
spawnProbabilities.entries.forEach {
|
||||
val nameText = it.key.getName()
|
||||
val nameString = nameText.string
|
||||
if (!spawnNames.containsKey(nameString)) {
|
||||
spawnNames[nameString] = it.key.getName()
|
||||
}
|
||||
|
||||
val standardizedNameText = spawnNames[nameString]!!
|
||||
namedProbabilities[standardizedNameText] = (namedProbabilities[standardizedNameText] ?: 0F) + it.value
|
||||
}
|
||||
|
||||
val sortedEntries = namedProbabilities.entries.sortedByDescending { it.value }
|
||||
val messages = mutableListOf<MutableComponent>()
|
||||
sortedEntries.forEach { (name, percentage) ->
|
||||
val message = name + ": " + applyColour("${df.format(percentage)}%".text(), percentage)
|
||||
// player.sendMessage()
|
||||
messages.add(message)
|
||||
}
|
||||
|
||||
if (messages.isEmpty()) {
|
||||
player.sendSystemMessage(lang("command.checkspawns.nothing").red())
|
||||
} else {
|
||||
player.sendSystemMessage(lang("command.checkspawns.spawns").underline())
|
||||
val msg = messages[0]
|
||||
for (nextMessage in messages.subList(1, messages.size)) {
|
||||
msg.add(", ".text() + nextMessage)
|
||||
}
|
||||
player.sendSystemMessage(msg)
|
||||
}
|
||||
|
||||
return Command.SINGLE_SUCCESS
|
||||
}
|
||||
|
||||
fun applyColour(name: MutableComponent, percentage: Float): MutableComponent {
|
||||
return if (percentage < PURPLE_THRESHOLD) {
|
||||
name.lightPurple()
|
||||
} else if (percentage < RED_THRESHOLD) {
|
||||
name.red()
|
||||
} else if (percentage < YELLOW_THRESHOLD) {
|
||||
name.yellow()
|
||||
} else {
|
||||
name.green()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -17,10 +17,12 @@ import com.cobblemon.mod.common.net.messages.client.storage.pc.OpenPCPacket
|
||||
import com.cobblemon.mod.common.util.*
|
||||
import com.mojang.brigadier.Command
|
||||
import com.mojang.brigadier.CommandDispatcher
|
||||
import com.mojang.brigadier.arguments.IntegerArgumentType
|
||||
import com.mojang.brigadier.context.CommandContext
|
||||
import com.mojang.brigadier.exceptions.SimpleCommandExceptionType
|
||||
import net.minecraft.commands.CommandSourceStack
|
||||
import net.minecraft.commands.Commands.literal
|
||||
import net.minecraft.commands.Commands.argument
|
||||
|
||||
object PcCommand {
|
||||
|
||||
@@ -30,25 +32,36 @@ object PcCommand {
|
||||
fun register(dispatcher : CommandDispatcher<CommandSourceStack>) {
|
||||
dispatcher.register(literal(NAME)
|
||||
.permission(CobblemonPermissions.PC)
|
||||
.then(argument("box", IntegerArgumentType.integer(1))
|
||||
.executes(this::execute)
|
||||
)
|
||||
.executes(this::execute)
|
||||
)
|
||||
}
|
||||
|
||||
private fun execute(context: CommandContext<CommandSourceStack>): Int {
|
||||
val player = context.source.playerOrException
|
||||
val box = try {
|
||||
IntegerArgumentType.getInteger(context, "box")
|
||||
} catch (e: IllegalArgumentException) {
|
||||
1
|
||||
}
|
||||
val pc = player.pc()
|
||||
if (player.isInBattle()) {
|
||||
throw IN_BATTLE_EXCEPTION.create()
|
||||
}
|
||||
if (pc.boxes.size < box) {
|
||||
throw SimpleCommandExceptionType(lang("command.pc.invalid-box", box, pc.boxes.size).red()).create()
|
||||
}
|
||||
PCLinkManager.addLink(PermissiblePcLink(pc, player, CobblemonPermissions.PC))
|
||||
OpenPCPacket(pc.uuid).sendToPlayer(player)
|
||||
OpenPCPacket(pc.uuid, box - 1).sendToPlayer(player)
|
||||
context.source.level.playSoundServer(
|
||||
position = context.source.player!!.position(),
|
||||
sound = CobblemonSounds.PC_ON,
|
||||
volume = 0.5F,
|
||||
pitch = 1F
|
||||
position = context.source.player!!.position(),
|
||||
sound = CobblemonSounds.PC_ON,
|
||||
volume = 0.5F,
|
||||
pitch = 1F
|
||||
)
|
||||
return Command.SINGLE_SUCCESS
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1583,17 +1583,15 @@ open class PokemonEntity(
|
||||
private fun sidedCodec(): Codec<Pokemon> = if (this.level().isClientSide) Pokemon.CLIENT_CODEC else Pokemon.CODEC
|
||||
|
||||
override fun resolvePokemonScan(): PokedexEntityData? {
|
||||
return PokemonSpecies.getByIdentifier(this.exposedSpecies.resourceIdentifier)?.let { species ->
|
||||
PokedexEntityData(
|
||||
species = species,
|
||||
form = this.form,
|
||||
gender = this.pokemon.gender,
|
||||
aspects = this.aspects,
|
||||
shiny = this.pokemon.shiny,
|
||||
level = this.labelLevel(),
|
||||
ownerUUID = this.ownerUUID
|
||||
)
|
||||
}
|
||||
return PokedexEntityData(
|
||||
pokemon = pokemon,
|
||||
disguise = this.effects.mockEffect?.let {
|
||||
PokedexEntityData.DisguiseData(
|
||||
species = it.exposedSpecies ?: pokemon.species,
|
||||
form = it.exposedForm ?: pokemon.form,
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
override fun resolveEntityScan(): LivingEntity {
|
||||
|
||||
@@ -488,6 +488,7 @@ object CobblemonItemGroups {
|
||||
entries.accept(CobblemonItems.RIBBON_SWEET)
|
||||
entries.accept(CobblemonItems.AUSPICIOUS_ARMOR)
|
||||
entries.accept(CobblemonItems.MALICIOUS_ARMOR)
|
||||
entries.accept(CobblemonItems.SHELL_HELMET)
|
||||
}
|
||||
|
||||
private fun heldItemEntries(displayContext: ItemDisplayParameters, entries: Output) {
|
||||
|
||||
@@ -20,6 +20,13 @@ class LinkCableItem : CobblemonItem(Properties()), PokemonEntityInteraction {
|
||||
override fun processInteraction(player: ServerPlayer, entity: PokemonEntity, stack: ItemStack): Boolean {
|
||||
val pokemon = entity.pokemon
|
||||
pokemon.lockedEvolutions.filterIsInstance<TradeEvolution>().forEach { evolution ->
|
||||
// Prevent Pokémon that require a specific trading partner for evolution (e.g., Shelmet and Karrablast)
|
||||
// from evolving via link cable. These Pokémon must either be traded with another player or use an
|
||||
// alternative single-player evolution method.
|
||||
if (!evolution.requiredContext.originalString.isEmpty()) {
|
||||
return@forEach
|
||||
}
|
||||
|
||||
// If an evolution is possible non-optional or has been successfully queued we will consume the item and stop
|
||||
// validate requirements to respect required held items and such.
|
||||
if (evolution.requirements.all { it.check(pokemon) } && evolution.evolve(pokemon)) {
|
||||
|
||||
+3
-2
@@ -26,16 +26,17 @@ import net.minecraft.network.RegistryFriendlyByteBuf
|
||||
* @author Hiroku
|
||||
* @since June 20th, 2022
|
||||
*/
|
||||
class OpenPCPacket(val storeID: UUID) : NetworkPacket<OpenPCPacket> {
|
||||
class OpenPCPacket(val storeID: UUID, val box: Int = 1) : NetworkPacket<OpenPCPacket> {
|
||||
|
||||
override val id = ID
|
||||
|
||||
override fun encode(buffer: RegistryFriendlyByteBuf) {
|
||||
buffer.writeUUID(storeID)
|
||||
buffer.writeInt(box)
|
||||
}
|
||||
|
||||
companion object {
|
||||
val ID = cobblemonResource("open_pc")
|
||||
fun decode(buffer: RegistryFriendlyByteBuf) = OpenPCPacket(buffer.readUUID())
|
||||
fun decode(buffer: RegistryFriendlyByteBuf) = OpenPCPacket(buffer.readUUID(), buffer.readInt())
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -43,7 +43,7 @@ object FinishScanningHandler : ServerNetworkPacketHandler<FinishScanningPacket>
|
||||
val scannableEntity = targetEntity as? ScannableEntity ?: return
|
||||
val dex = Cobblemon.playerDataManager.getPokedexData(player)
|
||||
val pokedexEntityData = scannableEntity.resolvePokemonScan()
|
||||
if(pokedexEntityData != null){
|
||||
if (pokedexEntityData != null){
|
||||
val newInformation = dex.getNewInformation(pokedexEntityData)
|
||||
if ((scannableEntity as? PokemonEntity)?.owner === player) {
|
||||
dex.catch(scannableEntity.pokemon)
|
||||
@@ -52,7 +52,7 @@ object FinishScanningHandler : ServerNetworkPacketHandler<FinishScanningPacket>
|
||||
}
|
||||
|
||||
POKEMON_SCANNED.post(PokemonScannedEvent(player, pokedexEntityData, scannableEntity))
|
||||
ServerConfirmedRegisterPacket(pokedexEntityData.species.resourceIdentifier, newInformation).sendToPlayer(player)
|
||||
ServerConfirmedRegisterPacket((pokedexEntityData.getApparentSpecies()).resourceIdentifier, newInformation).sendToPlayer(player)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+14
-18
@@ -9,28 +9,24 @@
|
||||
package com.cobblemon.mod.common.pokedex.scanner
|
||||
|
||||
import com.bedrockk.molang.runtime.struct.QueryStruct
|
||||
import com.bedrockk.molang.runtime.value.DoubleValue
|
||||
import com.bedrockk.molang.runtime.value.StringValue
|
||||
import com.cobblemon.mod.common.pokemon.FormData
|
||||
import com.cobblemon.mod.common.pokemon.Gender
|
||||
import com.cobblemon.mod.common.pokemon.Pokemon
|
||||
import com.cobblemon.mod.common.pokemon.Species
|
||||
import com.cobblemon.mod.common.util.asArrayValue
|
||||
import java.util.UUID
|
||||
|
||||
data class PokedexEntityData(
|
||||
val species: Species,
|
||||
val form: FormData,
|
||||
val gender: Gender,
|
||||
val aspects: Set<String>,
|
||||
val shiny: Boolean,
|
||||
val level: Int,
|
||||
val ownerUUID: UUID?
|
||||
val pokemon: Pokemon,
|
||||
val disguise: DisguiseData?
|
||||
) {
|
||||
val struct = QueryStruct(hashMapOf())
|
||||
.addFunction("species") { species.struct }
|
||||
.addFunction("gender") { StringValue(gender.name.lowercase()) }
|
||||
.addFunction("aspects") { aspects.asArrayValue(::StringValue) }
|
||||
.addFunction("shiny") { DoubleValue(shiny) }
|
||||
.addFunction("level") { DoubleValue(level.toDouble()) }
|
||||
.addFunction("has_owner") { DoubleValue(ownerUUID != null) }
|
||||
class DisguiseData(
|
||||
val species: Species,
|
||||
val form: FormData,
|
||||
) {
|
||||
val struct = QueryStruct(hashMapOf())
|
||||
.addFunction("species") { species.struct }
|
||||
.addFunction("form") { StringValue(form.name) }
|
||||
}
|
||||
|
||||
fun getApparentSpecies() = disguise?.species ?: pokemon.species
|
||||
fun getApparentForm() = disguise?.form ?: pokemon.form
|
||||
}
|
||||
+6
-6
@@ -18,6 +18,9 @@ import com.cobblemon.mod.common.client.pokedex.PokedexType
|
||||
import com.cobblemon.mod.common.net.messages.client.pokedex.ServerConfirmedRegisterPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.pokedex.scanner.FinishScanningPacket
|
||||
import com.cobblemon.mod.common.net.messages.server.pokedex.scanner.StartScanningPacket
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
import kotlin.random.Random
|
||||
import net.minecraft.client.DeltaTracker
|
||||
import net.minecraft.client.Minecraft
|
||||
import net.minecraft.client.gui.GuiGraphics
|
||||
@@ -26,9 +29,6 @@ import net.minecraft.client.resources.sounds.SimpleSoundInstance
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.sounds.SoundEvent
|
||||
import net.minecraft.util.Mth.clamp
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
import kotlin.random.Random
|
||||
|
||||
class PokedexUsageContext {
|
||||
companion object {
|
||||
@@ -85,7 +85,7 @@ class PokedexUsageContext {
|
||||
if (transitionIntervals == TRANSITION_INTERVALS) playSound(CobblemonSounds.POKEDEX_SCAN_CLOSE)
|
||||
transitionIntervals = max(transitionIntervals - updateInterval, 0F)
|
||||
if (transitionIntervals <= 0) {
|
||||
if (viewInfoTicks >= VIEW_INFO_BUFFER_TICKS) openPokedexGUI(type, scannableEntityInFocus!!.resolvePokemonScan()?.species?.resourceIdentifier)
|
||||
if (viewInfoTicks >= VIEW_INFO_BUFFER_TICKS) openPokedexGUI(type, scannableEntityInFocus!!.resolvePokemonScan()?.getApparentSpecies()?.resourceIdentifier)
|
||||
resetState()
|
||||
}
|
||||
}
|
||||
@@ -155,7 +155,7 @@ class PokedexUsageContext {
|
||||
}
|
||||
|
||||
// Check if Pokémon in focus is owned
|
||||
isPokemonInFocusOwned = CobblemonClient.clientPokedexData.getHighestKnowledgeForSpecies(resolvedPokemon.species.resourceIdentifier) == PokedexEntryProgress.CAUGHT
|
||||
isPokemonInFocusOwned = CobblemonClient.clientPokedexData.getHighestKnowledgeForSpecies(resolvedPokemon.getApparentSpecies().resourceIdentifier) == PokedexEntryProgress.CAUGHT
|
||||
|
||||
// Randomize info frames for render
|
||||
if (focusIntervals == 0F) {
|
||||
@@ -170,7 +170,7 @@ class PokedexUsageContext {
|
||||
// Check if Pokémon in focus is new or has new data
|
||||
newPokemonInfo = CobblemonClient.clientPokedexData.getNewInformation(resolvedPokemon)
|
||||
if (newPokemonInfo == PokedexLearnedInformation.NONE) playSound(CobblemonSounds.POKEDEX_SCAN_DETAIL)
|
||||
else scannedSpecies = resolvedPokemon.species.resourceIdentifier
|
||||
else scannedSpecies = resolvedPokemon.getApparentSpecies().resourceIdentifier
|
||||
}
|
||||
} else {
|
||||
resetFocusedPokemonState()
|
||||
|
||||
+7
@@ -73,10 +73,17 @@ class ServerEvolutionController(
|
||||
}
|
||||
|
||||
override fun add(element: Evolution): Boolean {
|
||||
// Removes duplicate evolutions that result in the same outcome, keeping only the most recent evolution.
|
||||
// For example, Karrablast can evolve via trade or link cable, which otherwise creates duplicate
|
||||
// entries in the summary screen.
|
||||
val duplicatedEvolutions = this.filter { element.result.matches(it.result) }
|
||||
duplicatedEvolutions.forEach { it -> this.remove(it) }
|
||||
|
||||
if (this.evolutions.add(element)) {
|
||||
this.pokemon.notify(AddEvolutionPacket(this.pokemon, element, this.pokemon.getOwnerEntity()?.registryAccess() ?: server()?.registryAccess() ?: throw IllegalStateException("No registry access available")))
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
+5
-2
@@ -9,6 +9,7 @@
|
||||
package com.cobblemon.mod.common.pokemon.evolution.variants
|
||||
|
||||
import com.cobblemon.mod.common.api.conditional.RegistryLikeCondition
|
||||
import com.cobblemon.mod.common.api.drop.DropTable
|
||||
import com.cobblemon.mod.common.api.moves.MoveTemplate
|
||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||
import com.cobblemon.mod.common.api.pokemon.evolution.ContextEvolution
|
||||
@@ -36,7 +37,8 @@ open class BlockClickEvolution(
|
||||
override var optional: Boolean,
|
||||
override var consumeHeldItem: Boolean,
|
||||
override val requirements: MutableSet<EvolutionRequirement>,
|
||||
override val learnableMoves: MutableSet<MoveTemplate>
|
||||
override val learnableMoves: MutableSet<MoveTemplate>,
|
||||
override val drops: DropTable,
|
||||
) : ContextEvolution<BlockClickEvolution.BlockInteractionContext, RegistryLikeCondition<Block>> {
|
||||
constructor(): this(
|
||||
id = "id",
|
||||
@@ -46,7 +48,8 @@ open class BlockClickEvolution(
|
||||
optional = true,
|
||||
consumeHeldItem = true,
|
||||
requirements = mutableSetOf(),
|
||||
learnableMoves = mutableSetOf()
|
||||
learnableMoves = mutableSetOf(),
|
||||
drops = DropTable(),
|
||||
)
|
||||
|
||||
override fun testContext(pokemon: Pokemon, context: BlockInteractionContext): Boolean {
|
||||
|
||||
+2
@@ -8,6 +8,7 @@
|
||||
|
||||
package com.cobblemon.mod.common.pokemon.evolution.variants
|
||||
|
||||
import com.cobblemon.mod.common.api.drop.DropTable
|
||||
import com.cobblemon.mod.common.api.moves.MoveTemplate
|
||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||
import com.cobblemon.mod.common.api.pokemon.evolution.Evolution
|
||||
@@ -24,6 +25,7 @@ internal class DummyEvolution : Evolution {
|
||||
override var consumeHeldItem = false
|
||||
override val requirements: MutableSet<EvolutionRequirement> = mutableSetOf()
|
||||
override val learnableMoves: MutableSet<MoveTemplate> = mutableSetOf()
|
||||
override val drops: DropTable = DropTable()
|
||||
|
||||
override fun test(pokemon: Pokemon) = false
|
||||
|
||||
|
||||
+4
-1
@@ -8,6 +8,7 @@
|
||||
|
||||
package com.cobblemon.mod.common.pokemon.evolution.variants
|
||||
|
||||
import com.cobblemon.mod.common.api.drop.DropTable
|
||||
import com.cobblemon.mod.common.api.moves.MoveTemplate
|
||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||
import com.cobblemon.mod.common.api.pokemon.evolution.ContextEvolution
|
||||
@@ -37,6 +38,7 @@ open class ItemInteractionEvolution(
|
||||
override var consumeHeldItem: Boolean,
|
||||
override val requirements: MutableSet<EvolutionRequirement>,
|
||||
override val learnableMoves: MutableSet<MoveTemplate>,
|
||||
override val drops: DropTable,
|
||||
) : ContextEvolution<ItemInteractionEvolution.ItemInteractionContext, NbtItemPredicate> {
|
||||
constructor(): this(
|
||||
id = "id",
|
||||
@@ -46,7 +48,8 @@ open class ItemInteractionEvolution(
|
||||
optional = true,
|
||||
consumeHeldItem = true,
|
||||
requirements = mutableSetOf(),
|
||||
learnableMoves = mutableSetOf()
|
||||
learnableMoves = mutableSetOf(),
|
||||
drops = DropTable(),
|
||||
)
|
||||
|
||||
override fun testContext(pokemon: Pokemon, context: ItemInteractionContext): Boolean =
|
||||
|
||||
+4
-1
@@ -8,6 +8,7 @@
|
||||
|
||||
package com.cobblemon.mod.common.pokemon.evolution.variants
|
||||
|
||||
import com.cobblemon.mod.common.api.drop.DropTable
|
||||
import com.cobblemon.mod.common.api.moves.MoveTemplate
|
||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||
import com.cobblemon.mod.common.api.pokemon.evolution.PassiveEvolution
|
||||
@@ -30,6 +31,7 @@ open class LevelUpEvolution(
|
||||
override var consumeHeldItem: Boolean,
|
||||
override val requirements: MutableSet<EvolutionRequirement>,
|
||||
override val learnableMoves: MutableSet<MoveTemplate>,
|
||||
override val drops: DropTable,
|
||||
override val permanent: Boolean
|
||||
) : PassiveEvolution {
|
||||
|
||||
@@ -42,7 +44,8 @@ open class LevelUpEvolution(
|
||||
consumeHeldItem = true,
|
||||
requirements = mutableSetOf(),
|
||||
learnableMoves = mutableSetOf(),
|
||||
permanent = false
|
||||
drops = DropTable(),
|
||||
permanent = false,
|
||||
)
|
||||
|
||||
override fun equals(other: Any?) = other is LevelUpEvolution && other.id.equals(this.id, true)
|
||||
|
||||
+5
-2
@@ -8,6 +8,7 @@
|
||||
|
||||
package com.cobblemon.mod.common.pokemon.evolution.variants
|
||||
|
||||
import com.cobblemon.mod.common.api.drop.DropTable
|
||||
import com.cobblemon.mod.common.api.moves.MoveTemplate
|
||||
import com.cobblemon.mod.common.api.pokemon.PokemonProperties
|
||||
import com.cobblemon.mod.common.api.pokemon.evolution.ContextEvolution
|
||||
@@ -31,7 +32,8 @@ open class TradeEvolution(
|
||||
override var optional: Boolean,
|
||||
override var consumeHeldItem: Boolean,
|
||||
override val requirements: MutableSet<EvolutionRequirement>,
|
||||
override val learnableMoves: MutableSet<MoveTemplate>
|
||||
override val learnableMoves: MutableSet<MoveTemplate>,
|
||||
override val drops: DropTable,
|
||||
) : ContextEvolution<Pokemon, PokemonProperties> {
|
||||
constructor(): this(
|
||||
id = "id",
|
||||
@@ -41,7 +43,8 @@ open class TradeEvolution(
|
||||
optional = true,
|
||||
consumeHeldItem = true,
|
||||
requirements = mutableSetOf(),
|
||||
learnableMoves = mutableSetOf()
|
||||
learnableMoves = mutableSetOf(),
|
||||
drops = DropTable(),
|
||||
)
|
||||
|
||||
override fun testContext(pokemon: Pokemon, context: Pokemon) = this.requiredContext.matches(context)
|
||||
|
||||
@@ -21,7 +21,7 @@ import java.util.zip.ZipInputStream
|
||||
object FileUtils {
|
||||
|
||||
private fun getResourceStream(internal: String): InputStream {
|
||||
return Cobblemon.javaClass.classLoader.getResourceAsStream(internal)
|
||||
return Cobblemon::class.java.getResourceAsStream(internal)
|
||||
?: throw Exception("Could not read $internal")
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"accessWidener": "cobblemon-common.accesswidener",
|
||||
"injected_interfaces": {
|
||||
"net/minecraft/class_630": ["com/cobblemon/mod/common/client/render/models/blockbench/pose/Bone"]
|
||||
}
|
||||
}
|
||||
+8
@@ -43,6 +43,14 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.nidoranf.cry": {
|
||||
"animation_length": 1.2,
|
||||
"sound_effects": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.nidoranf.cry"
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.nidoranf.blink": {
|
||||
"animation_length": 0.16667,
|
||||
"bones": {
|
||||
|
||||
+1
-1
@@ -354,7 +354,7 @@
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"0.0": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.nidorina.cry"
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -105,8 +105,8 @@
|
||||
}
|
||||
},
|
||||
"sound_effects": {
|
||||
"0.0": {
|
||||
"effect": "nidoqueen_ambient"
|
||||
"0.04": {
|
||||
"effect": "pokemon.nidoqueen.cry"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
+8
@@ -47,6 +47,14 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.nidoranm.cry": {
|
||||
"animation_length": 1.2,
|
||||
"sound_effects": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.nidoranm.cry"
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.nidoranm.blink": {
|
||||
"animation_length": 0.16667,
|
||||
"bones": {
|
||||
|
||||
+8
@@ -46,6 +46,14 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.nidorino.cry": {
|
||||
"animation_length": 1.2,
|
||||
"sound_effects": {
|
||||
"0.04": {
|
||||
"effect": "pokemon.nidorino.cry"
|
||||
}
|
||||
}
|
||||
},
|
||||
"animation.nidorino.blink": {
|
||||
"animation_length": 1,
|
||||
"bones": {
|
||||
|
||||
+1
-1
@@ -132,7 +132,7 @@
|
||||
},
|
||||
"sound_effects": {
|
||||
"0.0": {
|
||||
"effect": "nidoking_ambient"
|
||||
"effect": "pokemon.nidoking.cry"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1754
-35
File diff suppressed because it is too large
Load Diff
+2357
-130
File diff suppressed because it is too large
Load Diff
+4077
-225
File diff suppressed because it is too large
Load Diff
+3536
File diff suppressed because it is too large
Load Diff
+5535
-186
File diff suppressed because it is too large
Load Diff
+5726
File diff suppressed because it is too large
Load Diff
+1795
-54
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user