9
0
mirror of https://github.com/Auxilor/EcoMobs.git synced 2025-12-19 15:09:17 +00:00

Compare commits

...

308 Commits

Author SHA1 Message Date
Auxilor
bf81feea40 libreforge-updater 2023-05-24 14:57:58 +01:00
Auxilor
9229bdee7b libreforge-updater 2023-05-23 16:12:13 +01:00
Auxilor
bd2637d709 libreforge-updater 2023-05-20 17:40:57 +01:00
Auxilor
4264892c5f fuck you, modelengine. i hate youh 2023-05-18 16:27:43 +01:00
Auxilor
9e07b39c10 libreforge-updater 2023-05-18 16:25:30 +01:00
Auxilor
08d984794e Fixes 2023-05-17 16:36:45 +01:00
Auxilor
1c770e07e7 libreforge-updater 2023-05-17 15:57:13 +01:00
Auxilor
9a48077c9e libreforge-updater 2023-05-16 20:30:07 +01:00
Auxilor
553e006da3 libreforge-updater 2023-05-15 10:52:32 +01:00
Auxilor
c658decff0 libreforge-updater 2023-05-14 13:08:30 +01:00
Auxilor
3af948b712 libreforge-updater 2023-05-09 17:45:30 +01:00
Auxilor
81eeabef5e libreforge-updater 2023-05-05 18:54:37 +01:00
Auxilor
2efa705760 libreforge-updater 2023-05-03 14:47:57 +01:00
Auxilor
040c43f072 libreforge-updater 2023-04-30 19:57:11 +01:00
Auxilor
a3fc8569f9 libreforge-updater 2023-04-29 17:19:28 +01:00
Auxilor
a2eb10c1f2 libreforge-updater 2023-04-25 16:06:07 +01:00
Auxilor
a1fe7ffdc0 libreforge-updater 2023-04-25 13:13:13 +01:00
Auxilor
ebf26ae8ca Fuck mvn.lumine.io 2023-04-24 22:52:19 +01:00
Auxilor
10ce71bb08 libreforge-updater 2023-04-24 22:49:24 +01:00
Auxilor
5432d066b3 libreforge-updater 2023-04-20 20:20:44 +01:00
Auxilor
0a0d1d8764 Updated to 9.3.1 2023-04-20 18:04:55 +01:00
Auxilor
5619859b42 Moved libreforge integration loading to load 2023-04-20 18:04:47 +01:00
Auxilor
c6a6fc4201 libreforge-updater 2023-04-19 12:21:36 +01:00
Auxilor
b4c81d7874 libreforge-updater 2023-04-13 12:48:51 -04:00
Auxilor
fb78e87bd0 libreforge-updater 2023-04-09 18:19:30 -04:00
Auxilor
fd4b3bcc76 libreforge-updater 2023-04-06 20:09:30 +02:00
Auxilor
f1d02cc3ba libreforge-updater 2023-04-05 13:13:45 +01:00
Auxilor
78135d7e72 libreforge-updater 2023-04-03 17:49:46 +01:00
Auxilor
ed0fd90df8 libreforge-updater 2023-04-02 17:44:13 +01:00
Auxilor
42af89c79a libreforge-updater 2023-03-30 15:30:24 +01:00
Auxilor
d453461eeb why is model engine like this 2023-03-29 19:31:03 +01:00
Auxilor
e4093a0fd5 libreforge-updater 2023-03-29 19:21:02 +01:00
Auxilor
7e950ea508 libreforge-updater 2023-03-29 15:47:17 +01:00
Auxilor
ac79baa2d3 Fixed workflows 2023-03-29 13:44:06 +01:00
Auxilor
50adfae567 Moved to repo.auxilor.io 2023-03-29 13:39:57 +01:00
Auxilor
153022c3bf Fixed permissions on paper 2023-03-28 21:42:33 +01:00
Auxilor
8d37635381 Cleanup 2023-03-28 21:19:12 +01:00
Auxilor
299d3ee1d6 Updated to reflect libreforge change 2023-03-28 19:28:06 +01:00
Auxilor
f0a2d32b95 Moved integration 2023-03-28 18:58:58 +01:00
Auxilor
4e86750c7d Fixed duplicated messages for lifespan 2023-03-28 17:23:24 +01:00
Auxilor
b3b7695218 Fixed several bugs 2023-03-28 16:04:59 +01:00
Auxilor
1aa0a27c65 Fixed publications 2023-03-28 14:55:23 +01:00
Auxilor
392a76bad8 Updated to libreforge 4 2023-03-28 14:32:53 +01:00
Auxilor
95afe96860 Changed load order 2023-03-22 22:10:03 +00:00
Auxilor
21d24a5198 libreforge-updater 2023-03-13 13:40:30 +00:00
Auxilor
af9766a391 libreforge-updater 2023-03-02 12:56:01 +00:00
Auxilor
df70871bad libreforge-updater 2023-02-22 15:02:39 +00:00
Auxilor
b030af609a libreforge-updater 2023-02-15 20:59:05 +00:00
Auxilor
344e71cd9a libreforge-updater 2023-02-12 16:55:42 +00:00
Auxilor
7b7a16f9c6 libreforge-updater 2023-02-09 14:12:44 +00:00
Auxilor
ba1c348f8e libreforge-updater 2023-02-07 14:46:53 +00:00
Auxilor
c81f7174e2 libreforge-updater 2023-02-04 15:36:59 +00:00
Auxilor
53b037816d libreforge-updater 2023-01-24 10:09:30 +00:00
Auxilor
d7e07c1a62 libreforge-updater 2023-01-17 16:48:42 +00:00
Auxilor
d939296d96 libreforge-updater 2023-01-13 18:08:48 +00:00
Auxilor
2505ddd845 libreforge-updater 2023-01-07 12:17:46 +00:00
Auxilor
ea7371db9e libreforge-updater 2023-01-02 15:58:40 +00:00
Auxilor
b53ab306ed libreforge-updater 2022-12-26 14:01:48 +01:00
Auxilor
33f82117e4 Updated modelengine 2022-12-20 15:20:45 +00:00
Auxilor
a80e060a7e libreforge-updater 2022-12-20 15:15:33 +00:00
Auxilor
a915752922 libreforge-updater 2022-12-12 14:01:34 +00:00
Auxilor
06eb724bd8 libreforge-updater 2022-12-09 17:01:53 +00:00
Auxilor
18c66ef10c libreforge-updater 2022-12-05 10:51:14 +00:00
Auxilor
ae0c8531b0 libreforge-updater 2022-11-30 17:38:55 +00:00
Auxilor
705eafb9af libreforge-updater 2022-11-27 21:45:04 +00:00
Auxilor
e83ede56f0 libreforge-updater 2022-11-26 19:20:59 +00:00
Auxilor
6bddf72111 libreforge-updater 2022-11-24 14:30:48 +00:00
Auxilor
d32d07f4e2 libreforge-updater 2022-11-23 17:25:42 +00:00
Auxilor
8c40d9861d libreforge-updater 2022-11-21 16:03:34 +00:00
Auxilor
03272f794e libreforge-updater 2022-11-17 08:39:07 +00:00
Auxilor
8ff42da43c libreforge-updater 2022-11-12 17:35:11 +00:00
Auxilor
7f61f6a66a libreforge-updater 2022-11-06 19:52:34 +00:00
Auxilor
c1dde026b7 Updated chains 2022-11-06 17:00:48 +00:00
Auxilor
983246a7c4 Added illusioner 2022-11-06 16:56:39 +00:00
Auxilor
ee32897b1c libreforge-updater 2022-11-01 16:23:35 +00:00
Auxilor
67b38896ca libreforge-updater 2022-10-28 11:35:44 +01:00
Auxilor
39b91bc828 libreforge-updater 2022-10-26 22:12:03 +01:00
Auxilor
e2e7b44a75 Fix 2022-10-24 17:11:42 +01:00
Auxilor
3c1e5ee192 libreforge-updater 2022-10-24 17:05:27 +01:00
Auxilor
56789f331b libreforge-updater 2022-10-21 19:26:42 +01:00
Auxilor
e99b96132f libreforge-updater 2022-10-19 20:44:41 +01:00
Auxilor
c0297cd3db libreforge-updater 2022-10-18 14:14:41 +01:00
Auxilor
3b798a8ed7 libreforge-updater 2022-10-16 23:27:19 +01:00
Auxilor
bc73201ec5 libreforge-updater 2022-10-13 20:13:11 +01:00
Auxilor
b1365855af libreforge-updater 2022-10-10 21:04:32 +01:00
Auxilor
1ce50cb0b9 libreforge-updater 2022-10-09 15:03:11 +01:00
Auxilor
2a50868624 libreforge-updater 2022-10-07 19:51:54 +01:00
Auxilor
0a0e7a9661 libreforge-updater 2022-10-06 12:04:55 +01:00
Auxilor
8cd4ccdbd7 libreforge-updater 2022-10-04 15:53:28 +01:00
Auxilor
429bc6a61f libreforge-updater 2022-10-03 18:30:03 +01:00
Auxilor
b92ea06667 Fixed _example.yml 2022-10-02 17:01:40 +01:00
Auxilor
1e332bf845 libreforge-updater 2022-10-02 14:58:47 +01:00
Auxilor
7cec9f3e30 Added separator ambivalence to boss configs and Model Engine animation support 2022-09-29 08:40:30 +01:00
Auxilor
7db3af5dca oops 2022-09-28 17:55:29 +01:00
Auxilor
137f4e3732 libreforge-updater 2022-09-28 17:53:14 +01:00
Auxilor
7338a24b81 Fix 2022-09-28 16:12:42 +01:00
Auxilor
bde5de1d77 Fixed plugin.yml 2022-09-28 16:12:23 +01:00
Auxilor
b48cc66383 Updated to 8.91.1 2022-09-28 16:12:00 +01:00
Auxilor
bf59ba4d4a Improved _example.yml 2022-09-28 16:11:48 +01:00
Auxilor
127a43e032 PR Improvements 2022-09-28 16:10:21 +01:00
Will FP
383893c8f6 Merge pull request #50
fix: boss transformations
2022-09-28 16:01:24 +01:00
Will FP
37926bd016 Merge pull request #52
Feature/modelengine
2022-09-28 16:01:08 +01:00
Will FP
6778058150 Merge pull request #53
fix: handle spawning of bosses from droppers and dispensers
2022-09-28 15:59:45 +01:00
Auxilor
8addad09d2 fix 2022-09-26 18:54:34 +01:00
DaRacci
7fe0eece16 fix: handle spawning of bosses from droppers and dispensers 2022-09-27 01:13:42 +10:00
DaRacci
eca8726323 fix: check if the model exists 2022-09-27 00:10:20 +10:00
DaRacci
16ba41f39a feat: ModelEngine support 2022-09-27 00:07:28 +10:00
Auxilor
685f40a71b Merge branch 'fix/publishing'
# Conflicts:
#	build.gradle
2022-09-26 13:54:00 +01:00
Auxilor
76c6d22a00 libreforge-updater 2022-09-26 10:52:49 +01:00
DaRacci
38629407bc fix: Use component from subproject 2022-09-26 14:44:12 +10:00
DaRacci
1eee00b88e fix: Publishing
Also converted gradle build to kotlin.
Also updated gradle to 7.5.1

Closes: https://github.com/Auxilor/EcoBosses/issues/49, https://github.com/Auxilor/EcoBosses/issues/41
2022-09-25 23:39:05 +10:00
DaRacci
de47ccf159 fix: boss transformations
Closes: https://github.com/Auxilor/EcoBosses/issues/36
2022-09-25 22:27:08 +10:00
Auxilor
b81e7af836 libreforge-updater 2022-09-22 17:31:03 +01:00
Auxilor
fcde21c21a libreforge-updater 2022-09-21 15:29:05 +01:00
Auxilor
405659f293 libreforge-updater 2022-09-20 10:57:39 +01:00
Auxilor
2d6154d11f libreforge-updater 2022-09-17 15:46:02 +01:00
Auxilor
9fad76ffad libreforge-updater 2022-09-15 12:15:47 +01:00
Auxilor
e4a40470b8 libreforge-updater 2022-09-15 12:09:44 +01:00
Auxilor
f966629e21 libreforge-updater 2022-09-14 18:53:14 +01:00
Auxilor
93d09c1f3d libreforge-updater 2022-09-14 15:12:30 +01:00
Auxilor
56763be02d libreforge-updater 2022-09-14 15:09:33 +01:00
Auxilor
bd05d4474f libreforge-updater 2022-09-14 12:59:22 +01:00
Auxilor
aa0f9c195d libreforge-updater 2022-09-13 19:15:06 +01:00
Auxilor
e9e0214d1e libreforge-updater 2022-09-12 21:20:54 +01:00
Auxilor
744e3a943d libreforge-updater 2022-09-12 17:14:59 +01:00
Auxilor
fcaea262e8 libreforge-updater 2022-09-11 19:27:24 +01:00
Auxilor
062d2eea77 libreforge-updater 2022-09-10 12:58:21 +01:00
Auxilor
25844170eb libreforge-updater 2022-09-10 10:51:17 +01:00
Auxilor
00cc509b40 libreforge-updater 2022-09-06 15:43:31 +01:00
Auxilor
77e46ffb55 libreforge-updater 2022-09-06 13:46:10 +01:00
Auxilor
1f72e3b9b3 libreforge-updater 2022-09-06 11:25:17 +01:00
Auxilor
a94a5cc04d libreforge-updater 2022-09-05 18:00:28 +01:00
Auxilor
2b8d8eb20a libreforge-updater 2022-09-04 17:22:44 +01:00
Auxilor
1b4851fb9c libreforge-updater 2022-09-04 16:22:01 +01:00
Auxilor
80181bb66e libreforge-updater 2022-09-03 14:20:18 +01:00
Auxilor
d2d6355003 libreforge-updater 2022-09-01 13:05:26 +01:00
Auxilor
b44016d4fe libreforge-updater 2022-08-31 12:45:30 +01:00
Auxilor
74f1953074 libreforge-updater 2022-08-30 20:29:05 +01:00
Auxilor
041e8e070e libreforge-updater 2022-08-30 19:21:42 +01:00
Auxilor
d69b205de5 libreforge-updater 2022-08-29 10:58:32 +01:00
Auxilor
ad827f2b65 libreforge-updater 2022-08-28 15:40:32 +01:00
Auxilor
e8b8dcd2c4 libreforge-updater 2022-08-27 11:22:55 +01:00
Auxilor
e54660cf5e libreforge-updater 2022-08-24 12:52:49 +02:00
Auxilor
7a21d1897d libreforge-updater 2022-08-24 12:50:14 +02:00
Auxilor
64726f665f libreforge-updater 2022-08-24 11:57:32 +02:00
Auxilor
e4fdaeec1d libreforge-updater 2022-08-23 11:07:42 +02:00
Auxilor
3c5fbd6151 libreforge-updater 2022-08-22 12:46:27 +02:00
Auxilor
4329431994 libreforge-updater 2022-08-20 10:00:02 +02:00
Auxilor
c55692e89f libreforge-updater 2022-08-17 14:21:54 +02:00
Auxilor
03466f7892 libreforge-updater 2022-08-17 12:09:45 +02:00
Auxilor
1a6ebd4455 libreforge-updater 2022-08-16 18:45:53 +02:00
Auxilor
486f071dea libreforge-updater 2022-08-14 17:30:33 +02:00
Auxilor
fb4eac5e5e Updated to 8.67.1 2022-08-13 12:12:27 +02:00
Will FP
49d1d3f054 Merge pull request #47 from grzybeek/chunkticker
small chunkticker code cleanup
2022-08-13 12:00:09 +02:00
Auxilor
6dc7426146 libreforge-updater 2022-08-13 11:58:15 +02:00
Auxilor
00c5ead347 libreforge-updater 2022-08-05 18:41:40 +01:00
Auxilor
9bd501dfbe libreforge-updater 2022-08-05 18:39:49 +01:00
Auxilor
67d55bbdc2 libreforge-updater 2022-08-04 13:03:36 +01:00
Auxilor
46aa086366 lang 2022-08-04 12:38:01 +01:00
Auxilor
9f00334ea4 lang 2022-08-04 12:31:24 +01:00
Auxilor
e6db159bfb libreforge-updater 2022-08-04 12:26:42 +01:00
Auxilor
3df7b75737 libreforge-updater 2022-08-04 12:24:14 +01:00
Auxilor
c243a425b3 libreforge-updater 2022-08-02 16:26:52 +01:00
Auxilor
e57fe61d22 libreforge-updater 2022-08-02 16:21:24 +01:00
Auxilor
9830aed484 libreforge-updater 2022-08-02 16:16:46 +01:00
Auxilor
999b89bcb0 libreforge-updater 2022-08-01 11:19:06 +01:00
Auxilor
e7f326efbb libreforge-updater 2022-07-29 17:50:41 +01:00
Auxilor
0cb5b0b7b7 libreforge-updater 2022-07-27 20:17:09 +01:00
Auxilor
8e2d901e9b Updated to 8.63.2 2022-07-26 14:41:50 +01:00
Auxilor
724eede36e Fixed boss death tracking 2022-07-26 14:41:22 +01:00
Auxilor
01a2cc7118 libreforge-updater 2022-07-25 17:53:55 +01:00
Auxilor
20aace3727 libreforge-updater 2022-07-25 17:02:32 +01:00
Auxilor
ec9d4c0dd6 libreforge-updater 2022-07-24 22:49:25 +01:00
Auxilor
b3a0c1fa67 libreforge-updater 2022-07-24 21:50:54 +01:00
Auxilor
88294a17cd libreforge-updater 2022-07-23 17:42:53 +01:00
Auxilor
1ac6a350ec libreforge-updater 2022-07-22 14:20:45 +01:00
Auxilor
a9333cb8b5 libreforge-updater 2022-07-21 20:14:10 +01:00
grzybeek
05cf399e77 remove useless mob getter 2022-07-21 17:07:37 +02:00
grzybeek
de2b8f7526 small chunkticker code cleanup 2022-07-21 17:02:42 +02:00
Auxilor
23085e74e2 Codestyle 2022-07-21 15:48:46 +01:00
Auxilor
80f02a07a4 Updated to 8.60.1 2022-07-21 15:48:22 +01:00
Will FP
a63625593d Merge pull request #45 from grzybeek/chunkticker
Fix spawning bosses on unloaded chunks
2022-07-21 15:26:05 +01:00
Auxilor
1dfd7bac1f libreforge-updater 2022-07-20 00:10:12 +01:00
Auxilor
34b983b185 libreforge-updater 2022-07-13 21:22:38 +01:00
Auxilor
33b2fd9e13 libreforge-updater 2022-07-12 14:58:43 +01:00
Auxilor
85cfb542dc libreforge-updater 2022-07-11 16:16:12 +01:00
Auxilor
197f9e91aa libreforge-updater 2022-07-09 12:10:35 +01:00
grzybeek
9d4a91805a Fix spawning bosses on unloaded chunks, keep them loaded and remove afterwards
Entity is no longer null, change not needed "?: return"
2022-07-06 02:06:46 +02:00
Auxilor
87b91c46d1 libreforge-updater 2022-07-05 18:32:14 +01:00
Auxilor
4a7e6e9ff1 libreforge-updater 2022-07-04 18:45:14 +01:00
Auxilor
b59e54be01 libreforge-updater 2022-06-30 22:54:36 +01:00
Auxilor
d26f0294cc libreforge-updater 2022-06-30 22:34:13 +01:00
Auxilor
150433d46b libreforge-updater 2022-06-26 13:03:03 +01:00
Auxilor
7de4d75c93 libreforge-updater 2022-06-25 22:22:48 +01:00
Auxilor
9790459a26 libreforge-updater 2022-06-24 13:57:52 +01:00
Auxilor
666a80b401 libreforge-updater 2022-06-22 22:24:46 +01:00
Auxilor
59810059aa libreforge-updater 2022-06-22 12:42:49 +01:00
Auxilor
7b604c7812 libreforge-updater 2022-06-21 08:29:23 +01:00
Auxilor
81eab18e42 libreforge-updater 2022-06-20 21:37:23 +01:00
Auxilor
fa54c7022b libreforge-updater 2022-06-20 14:16:54 +01:00
Auxilor
26f976a7ca libreforge-updater 2022-06-19 12:17:53 +01:00
Auxilor
4fa070dabe libreforge-updater 2022-06-18 12:19:23 +01:00
Auxilor
f73327b204 libreforge-updater 2022-06-17 21:34:43 +01:00
Auxilor
d9b702f2f1 libreforge-updater 2022-06-17 15:26:14 +01:00
Auxilor
7692e84a60 libreforge-updater 2022-06-16 16:42:42 +01:00
Auxilor
ffd6037e73 libreforge-updater 2022-06-15 15:12:17 +01:00
Auxilor
7c959d7221 libreforge-updater 2022-06-15 15:10:33 +01:00
Auxilor
91ad33334d libreforge-updater 2022-06-14 16:43:25 +01:00
Auxilor
c1b8ed5b48 libreforge-updater 2022-06-14 09:10:39 +01:00
Auxilor
2f3c5f60a4 libreforge-updater 2022-06-13 11:46:17 +01:00
Auxilor
f3387668e6 Fixed softdepends 2022-06-12 19:12:02 +01:00
Auxilor
b62e79d904 libreforge-updater 2022-06-11 11:14:57 +01:00
Auxilor
d7afeecc27 libreforge-updater 2022-06-08 21:05:47 +01:00
Auxilor
72e61940c5 libreforge-updater 2022-06-06 13:29:09 +01:00
Auxilor
245445473b libreforge-updater 2022-06-04 13:43:57 +01:00
Auxilor
46772ac97a libreforge-updater 2022-06-03 11:35:24 +01:00
Auxilor
29a1e541a2 libreforge-updater 2022-05-31 19:44:47 +01:00
Auxilor
89a6bc97b7 libreforge-updater 2022-05-30 17:04:30 +01:00
Auxilor
c59707e6ac libreforge-updater 2022-05-30 11:10:33 +01:00
Auxilor
99bc2a04ab Updated libreforge 2022-05-28 18:18:27 +01:00
Auxilor
b4e90d9bda libreforge-updater 2022-05-27 19:24:47 +01:00
Auxilor
72c3722429 libreforge-updater 2022-05-25 10:56:28 +01:00
Auxilor
c14b2f0a80 libreforge-updater 2022-05-23 16:02:39 +01:00
Auxilor
0b6c7152e8 libreforge-updater 2022-05-22 20:42:16 +01:00
Auxilor
6e551eeaeb libreforge-updater 2022-05-22 15:26:56 +01:00
Auxilor
d5610ae804 libreforge-updater 2022-05-21 17:33:43 +01:00
Auxilor
79c8ed4992 libreforge-updater 2022-05-20 18:37:00 +01:00
Auxilor
947a0f3c6d libreforge-updater 2022-05-20 18:35:57 +01:00
Auxilor
ce8b0af155 libreforge-updater 2022-05-20 18:27:10 +01:00
Auxilor
a41e5b702d libreforge-updater 2022-05-20 14:20:17 +01:00
Auxilor
f04bf3aeea libreforge-updater 2022-05-19 20:40:35 +01:00
Auxilor
08941461c9 Fixed egg display 2022-05-18 18:06:46 +01:00
Auxilor
743dbac656 Fixed egg display 2022-05-18 18:04:37 +01:00
Auxilor
2e8d1ea4cc Updated to 8.31.1 2022-05-18 17:21:43 +01:00
Auxilor
d31a98fd99 Boss eggs now display not met lore 2022-05-18 17:21:35 +01:00
Auxilor
f7244a7d7f libreforge-updater 2022-05-18 15:31:12 +01:00
Auxilor
268ed76951 libreforge-updater 2022-05-17 18:52:57 +01:00
Auxilor
d0ccb78c17 libreforge-updater 2022-05-16 21:44:52 +01:00
Auxilor
34de040849 libreforge-updater 2022-05-15 14:27:53 +01:00
Auxilor
6b01f8e64a libreforge-updater 2022-05-15 13:59:09 +01:00
Auxilor
2a4d5a8fd2 "libreforge-updater" 2022-05-15 13:33:50 +01:00
Auxilor
f9d7315fd3 Updated libreforge 2022-05-14 21:24:56 +01:00
Auxilor
497f42ccc6 Updated libreforge 2022-05-14 12:22:43 +01:00
Auxilor
d149eb7907 Updated libreforge 2022-05-13 16:02:22 +01:00
Auxilor
47277d0dd8 Updated libreforge 2022-05-12 17:24:02 +01:00
Auxilor
f307f13d1e Updated libreforge 2022-05-11 15:28:48 +01:00
Auxilor
ac3370c0be Updated libreforge 2022-05-05 21:29:00 +01:00
Auxilor
4f616ac8c8 Updated libreforge 2022-05-03 18:46:03 +01:00
Auxilor
24256e9789 Updated libreforge 2022-05-01 17:39:49 +01:00
Auxilor
bbf20e77d0 Updated libreforge 2022-04-30 11:33:18 +01:00
Auxilor
8a506c015b Updated libreforge 2022-04-29 10:20:15 +01:00
Auxilor
744883630d Updated libreforge 2022-04-27 19:00:00 +01:00
Auxilor
8519f4fc23 Updated libreforge 2022-04-27 18:58:32 +01:00
Auxilor
d1cb11ef79 Updated libreforge 2022-04-27 10:38:05 +01:00
Auxilor
edcc185b58 Updated to 8.20.4 2022-04-24 19:08:24 +01:00
Auxilor
ab6d297222 Updated eco/kotlin/libreforge 2022-04-20 11:46:01 +01:00
Auxilor
9626588c66 Updated libreforge 2022-04-16 15:45:37 +01:00
Auxilor
c4eda19d78 Updated to 8.20.4 2022-04-12 11:35:01 +01:00
Auxilor
691326577a Updated to 8.20.4 2022-04-11 14:51:47 +01:00
Auxilor
e2086387e7 Fixed custom AI not working 2022-04-11 14:51:36 +01:00
Auxilor
13a72f849d Updated to 8.20.2 2022-04-09 14:42:29 +01:00
Auxilor
6346975e77 Updated to 8.20.2 2022-04-08 18:03:48 +01:00
Auxilor
0d846d9dff Added autospawn.one-boss-per-world option 2022-04-08 18:03:39 +01:00
Auxilor
31610383c4 Updated libreforge 2022-04-06 14:18:41 +01:00
Auxilor
d7c16ad3cc Updated libreforge 2022-04-04 10:23:34 +01:00
Auxilor
afe9095276 Updated libreforge 2022-04-02 14:04:56 +01:00
Auxilor
31a782581f Updated libreforge 2022-03-31 20:20:00 +01:00
Auxilor
8aad221450 Updated libreforge 2022-03-30 20:38:08 +01:00
Auxilor
b0bff24263 Updated libreforge 2022-03-28 19:05:19 +01:00
Auxilor
04b00fa01b Merge remote-tracking branch 'origin/master'
# Conflicts:
#	build.gradle
#	gradle.properties
2022-03-28 19:05:11 +01:00
Auxilor
276ba4616a Updated libreforge 2022-03-25 09:31:29 +00:00
Auxilor
d8e5fb9cd0 Updated to 8.14.0 2022-03-21 12:40:12 +00:00
Auxilor
9f05a6504a Added support for custom entity AI 2022-03-21 12:39:09 +00:00
Auxilor
322a6bb41b Updated libreforge 2022-03-21 12:24:06 +00:00
Auxilor
4dbc8afdf4 Updated libreforge 2022-03-19 16:42:59 +00:00
Auxilor
7ffa6ff4f4 Updated libreforge 2022-03-17 08:57:55 +00:00
Auxilor
3769684bb0 Updated libreforge 2022-03-16 09:05:56 +00:00
Auxilor
7bb931e027 Updated libreforge 2022-03-13 11:59:46 +00:00
Auxilor
879d6dd72d Updated libreforge 2022-03-12 12:22:54 +00:00
Auxilor
0a4aff45ad Updated libreforge 2022-03-10 15:13:28 +00:00
Auxilor
5929da1f48 Updated libreforge 2022-03-09 12:50:07 +00:00
Will FP
6db5de581b Update README.md 2022-03-09 12:47:33 +00:00
Auxilor
9ce1bb7ddf Updated libreforge 2022-03-08 20:20:01 +00:00
Auxilor
351d34de9f Updated libreforge 2022-03-07 14:01:18 +00:00
Auxilor
4d2b726aa0 Updated to 8.7.1 2022-03-04 16:59:39 +00:00
Auxilor
ff20b70784 Improved PDC storage 2022-03-04 16:59:31 +00:00
Auxilor
f31cd20200 Updated to 8.7.0 2022-03-03 17:02:43 +00:00
Auxilor
0ad2d3cfc7 Adapted pull request 2022-03-03 17:01:19 +00:00
Will FP
ccc7c5797a Merge pull request #28
Add commands ran for lifecycle
2022-03-03 16:54:00 +00:00
Auxilor
a218fa96c0 Updated libreforge 2022-03-01 16:26:17 +00:00
Auxilor
13c0a4d83a Updated to 8.5.2 2022-02-28 10:16:04 +00:00
Auxilor
62e7177b1b Fixed autospawn 2022-02-28 10:15:52 +00:00
Auxilor
752b30b4a2 Fixed spawn event not being called with totems 2022-02-28 10:14:11 +00:00
Auxilor
be4d6156e3 Fixed spawn totems some more 2022-02-28 10:12:12 +00:00
Auxilor
fed6dcafd7 Fixed spawn totems 2022-02-28 10:09:31 +00:00
Auxilor
36f944c58c Updated libreforge 2022-02-28 10:04:53 +00:00
Auxilor
1bc35656fe Fixed bosses attacking creative and spectator mode players 2022-02-28 10:04:38 +00:00
casper
1216e83a39 Add commands ran for lifecycle 2022-02-26 15:31:52 -05:00
Auxilor
4723c7982c Updated libreforge 2022-02-25 11:24:50 +00:00
Auxilor
8ba3c7834c Updated libreforge 2022-02-20 17:25:32 +00:00
Auxilor
76530a1617 Updated libreforge 2022-02-19 15:58:02 +00:00
Auxilor
bf41554846 build.gradle messages 2022-02-18 15:10:11 +00:00
Auxilor
a741c78b6b Fixed compatibility with other plugins 2022-02-18 14:37:01 +00:00
Auxilor
0f8dce74da Updated libreforge 2022-02-18 14:36:11 +00:00
Auxilor
0d31556b84 Updated libreforge 2022-02-15 16:49:03 +00:00
Auxilor
f8544c284e Updated libreforge 2022-02-14 17:18:16 +00:00
Auxilor
512a477fc6 Updated libreforge 2022-02-13 15:41:22 +00:00
Auxilor
8a1b473837 Updated libreforge 2022-02-12 10:51:41 +00:00
63 changed files with 1444 additions and 762 deletions

View File

@@ -1,8 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Auxilor Community Discord
- name: Discord
url: https://discord.gg/ZcwpSsE/
about: Join the Auxilor discord to get help from support staff and the general community!
- name: The most common issues people have
url: https://github.com/Auxilor/eco/issues/78
about: Check the list of known common issues to see if your issue has already been solved
about: Issues have moved to Discord, please join the server to get help!

View File

@@ -4,28 +4,8 @@ about: Report an issue with the plugin
title: ''
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
# Please report bugs on the discord!
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Server Information (please complete the following information):**
- Version: (output of `/ver` command)
- Version of plugin and eco (`/ver eco`, `/ver <plugin>`)
**Additional context**
Add any other context about the problem here.
[Join by clicking here](https://discord.gg/ZcwpSsE/)

View File

@@ -1,20 +0,0 @@
---
name: Request a Feature
about: Suggest an idea for this plugin
title: ''
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

33
.github/workflows/publish-release.yml vendored Normal file
View File

@@ -0,0 +1,33 @@
name: Publish Packages
on:
workflow_dispatch:
release:
types: [ created ]
push:
tags:
- '*'
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout latest code
uses: actions/checkout@v2
- name: Set up JDK 17
uses: actions/setup-java@v2
with:
distribution: 'temurin'
java-version: 17
- name: Change wrapper permissions
run: chmod +x ./gradlew
- name: Publish package
uses: gradle/gradle-build-action@v2
with:
arguments: publish
env:
MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }}
MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}

View File

@@ -1,6 +1,6 @@
<h1 align="center">
<br>
<img src="https://i.imgur.com/A2qieC3.png" alt="EcoBosses logo" width="256">
<img src="https://i.imgur.com/3n3ssb4.png" alt="EcoBosses logo" width="256">
<br>
</h1>

View File

@@ -1,121 +0,0 @@
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0"
}
}
plugins {
id 'java-library'
id 'com.github.johnrengelman.shadow' version '7.0.0'
id 'maven-publish'
id 'java'
}
dependencies {
implementation project(":eco-core").getSubprojects()
}
allprojects {
apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'maven-publish'
apply plugin: 'com.github.johnrengelman.shadow'
repositories {
mavenCentral()
mavenLocal()
maven { url 'https://jitpack.io' }
maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' }
maven { url 'https://repo.codemc.org/repository/nms/' }
maven { url 'https://repo.codemc.org/repository/maven-public' }
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
maven { url 'https://oss.sonatype.org/content/groups/public/' }
maven { url 'https://maven.enginehub.org/repo/' }
maven { url 'https://ci.ender.zone/plugin/repository/project/' }
maven { url 'https://ci.ender.zone/plugin/repository/everything/' }
maven { url 'https://repo.md-5.net/content/repositories/snapshots/' }
maven { url 'https://repo.dmulloy2.net/nexus/repository/public/' }
maven { url 'https://papermc.io/repo/repository/maven-public/' }
maven { url 'https://repo.maven.apache.org/maven2/' }
maven { url 'https://repo.dustplanet.de/artifactory/ext-release-local/' }
maven { url 'https://maven.seyfahni.de/repository/snapshots/' }
maven { url 'https://libraries.minecraft.net/' }
maven { url 'https://repo.spongepowered.org/maven/' }
maven { url 'https://org.kitteh.pastegg' }
maven { url 'https://repo.mikeprimm.com/' }
maven { url 'https://maven.sk89q.com/repo/' }
maven { url 'https://github.com/factions-site/repo/raw/public/' }
maven { url 'https://repo.extendedclip.com/content/repositories/placeholderapi/' }
}
jar {
onlyIf { !sourceSets.main.allSource.files.isEmpty() }
}
shadowJar {
relocate('com.willfp.libreforge', 'com.willfp.ecobosses.libreforge')
}
dependencies {
compileOnly 'com.willfp:eco:6.24.0'
implementation 'com.willfp:libreforge:3.17.0'
compileOnly 'org.jetbrains:annotations:23.0.0'
compileOnly 'org.jetbrains.kotlin:kotlin-stdlib:1.6.0'
}
tasks.withType(JavaCompile) {
options.deprecation = true
options.encoding = 'UTF-8'
}
processResources {
filesNotMatching(["**/*.png", "**/models/**", "**/textures/**", "**lang.yml"]) {
expand projectVersion: project.version
}
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
kotlinOptions {
jvmTarget = "17"
}
}
java.sourceCompatibility = JavaVersion.VERSION_17
java.targetCompatibility = JavaVersion.VERSION_17
compileJava.options.encoding = 'UTF-8'
compileJava.dependsOn clean
build.dependsOn shadowJar
}
tasks.withType(Jar) {
destinationDirectory = file("$rootDir/bin/")
}
clean.doLast {
file("${rootDir}/bin").deleteDir()
}
shadowJar {
archiveFileName = findProperty("plugin-name") + " v" + findProperty("version") + ".jar"
}
jar {
archiveFileName = findProperty("plugin-name") + " v" + findProperty("version") + " " + "unshaded" + ".jar"
}
group = 'com.willfp'
archivesBaseName = project.name
version = findProperty("version")
compileJava.options.encoding = 'UTF-8'
build.dependsOn shadowJar
build.dependsOn publishToMavenLocal

83
build.gradle.kts Normal file
View File

@@ -0,0 +1,83 @@
plugins {
java
`java-library`
`maven-publish`
kotlin("jvm") version "1.7.10"
id("com.github.johnrengelman.shadow") version "8.0.0"
id("com.willfp.libreforge-gradle-plugin") version "1.0.0"
}
group = "com.willfp"
version = findProperty("version")!!
val libreforgeVersion = findProperty("libreforge-version")
base {
archivesName.set(project.name)
}
dependencies {
project(":eco-core").dependencyProject.subprojects {
implementation(this)
}
}
allprojects {
apply(plugin = "java")
apply(plugin = "kotlin")
apply(plugin = "maven-publish")
apply(plugin = "com.github.johnrengelman.shadow")
repositories {
mavenLocal()
mavenCentral()
maven("https://repo.papermc.io/repository/maven-public/")
maven("https://repo.auxilor.io/repository/maven-public/")
maven("https://jitpack.io")
maven("https://mvn.lumine.io/repository/maven-public/")
}
dependencies {
compileOnly("com.willfp:eco:6.56.0")
compileOnly("org.jetbrains:annotations:23.0.0")
compileOnly("org.jetbrains.kotlin:kotlin-stdlib:1.7.10")
}
java {
withSourcesJar()
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
}
tasks {
shadowJar {
relocate("com.willfp.libreforge.loader", "com.willfp.ecobosses.libreforge.loader")
}
compileKotlin {
kotlinOptions {
jvmTarget = "17"
}
}
compileJava {
options.isDeprecation = true
options.encoding = "UTF-8"
dependsOn(clean)
}
processResources {
filesMatching(listOf("**plugin.yml", "**eco.yml")) {
expand(
"version" to project.version,
"libreforgeVersion" to libreforgeVersion,
"pluginName" to rootProject.name
)
}
}
build {
dependsOn(shadowJar)
}
}
}

View File

@@ -1,2 +0,0 @@
group 'com.willfp'
version rootProject.version

View File

@@ -0,0 +1,2 @@
group = "com.willfp"
version = rootProject.version

View File

@@ -1,8 +0,0 @@
group 'com.willfp'
version rootProject.version
dependencies {
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
compileOnly 'com.github.lokka30:LevelledMobs:3.1.4'
compileOnly 'net.kyori:adventure-api:4.9.3'
}

View File

@@ -0,0 +1,34 @@
group = "com.willfp"
version = rootProject.version
dependencies {
compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT")
compileOnly("com.github.lokka30:LevelledMobs:3.1.4")
compileOnly("com.ticxo.modelengine:api:R3.1.5")
}
publishing {
publications {
register("maven", MavenPublication::class) {
from(components["java"])
artifactId = rootProject.name
}
}
repositories {
maven {
name = "auxilor"
url = uri("https://repo.auxilor.io/repository/maven-releases/")
credentials {
username = System.getenv("MAVEN_USERNAME")
password = System.getenv("MAVEN_PASSWORD")
}
}
}
}
tasks {
build {
dependsOn(publishToMavenLocal)
}
}

View File

@@ -1,16 +1,20 @@
package com.willfp.ecobosses
import com.willfp.eco.core.command.impl.PluginCommand
import com.willfp.eco.core.display.DisplayModule
import com.willfp.eco.core.integrations.IntegrationLoader
import com.willfp.ecobosses.bosses.Bosses
import com.willfp.ecobosses.bosses.EggDisplay
import com.willfp.ecobosses.bosses.bossHolders
import com.willfp.ecobosses.commands.CommandEcobosses
import com.willfp.ecobosses.config.EcoBossesYml
import com.willfp.ecobosses.commands.CommandEcoBosses
import com.willfp.ecobosses.defence.DamageMultiplierHandler
import com.willfp.ecobosses.defence.ImmunitiesHandler
import com.willfp.ecobosses.defence.MountHandler
import com.willfp.ecobosses.defence.PickupHandler
import com.willfp.ecobosses.integrations.levelledmobs.IntegrationLevelledMobs
import com.willfp.ecobosses.libreforge.EffectBossDropChanceMultiplier
import com.willfp.ecobosses.libreforge.TriggerKillBoss
import com.willfp.ecobosses.libreforge.TriggerSpawnBoss
import com.willfp.ecobosses.lifecycle.CompatibilityListeners
import com.willfp.ecobosses.lifecycle.ConsoleLoggers
import com.willfp.ecobosses.lifecycle.DeathListeners
@@ -20,33 +24,51 @@ import com.willfp.ecobosses.spawn.SpawnEggHandler
import com.willfp.ecobosses.spawn.SpawnTotemHandler
import com.willfp.ecobosses.util.DiscoverRecipeListener
import com.willfp.ecobosses.util.TopDamagerListener
import com.willfp.libreforge.LibReforgePlugin
import com.willfp.libreforge.effects.Effects
import com.willfp.libreforge.loader.LibreforgePlugin
import com.willfp.libreforge.loader.configs.ConfigCategory
import com.willfp.libreforge.registerHolderProvider
import com.willfp.libreforge.triggers.Triggers
import org.bukkit.event.Listener
class EcoBossesPlugin : LibReforgePlugin(525, 10635, "&9") {
val ecoBossesYml: EcoBossesYml
class EcoBossesPlugin : LibreforgePlugin() {
init {
instance = this
ecoBossesYml = EcoBossesYml(this)
}
override fun loadConfigCategories(): List<ConfigCategory> {
return listOf(
Bosses
)
}
override fun handleLoad() {
Effects.register(EffectBossDropChanceMultiplier)
Triggers.register(TriggerKillBoss)
Triggers.register(TriggerSpawnBoss)
}
override fun handleEnable() {
registerHolderProvider { it.bossHolders }
}
override fun handleReloadAdditional() {
override fun handleReload() {
Bosses.getAllAlive().forEach { it.remove() }
logger.info(Bosses.values().size.toString() + " Bosses Loaded")
AutospawnHandler.startSpawning(this)
}
override fun handleDisableAdditional() {
override fun handleDisable() {
Bosses.getAllAlive().forEach { it.remove() }
}
override fun createDisplayModule(): DisplayModule {
return EggDisplay(this)
}
override fun loadPluginCommands(): List<PluginCommand> {
return listOf(
CommandEcobosses(this)
CommandEcoBosses(this)
)
}
@@ -55,7 +77,7 @@ class EcoBossesPlugin : LibReforgePlugin(525, 10635, "&9") {
DiscoverRecipeListener(this),
TopDamagerListener(),
LifecycleHandlers(),
SpawnEggHandler(),
SpawnEggHandler(this),
DamageMultiplierHandler(),
MountHandler(),
PickupHandler(),
@@ -67,16 +89,12 @@ class EcoBossesPlugin : LibReforgePlugin(525, 10635, "&9") {
)
}
override fun loadAdditionalIntegrations(): List<IntegrationLoader> {
override fun loadIntegrationLoaders(): List<IntegrationLoader> {
return listOf(
IntegrationLoader("LevelledMobs") { this.eventManager.registerListener(IntegrationLevelledMobs()) }
)
}
override fun getMinimumEcoVersion(): String {
return "6.24.0"
}
companion object {
@JvmStatic
lateinit var instance: EcoBossesPlugin

View File

@@ -1,26 +1,27 @@
package com.willfp.ecobosses.bosses
import com.willfp.eco.core.fast.fast
import com.willfp.ecobosses.EcoBossesPlugin
import com.willfp.libreforge.Holder
import com.willfp.ecobosses.util.EntityProvidedHolder
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import org.bukkit.persistence.PersistentDataType
import kotlin.math.pow
val Player.bossHolders: Iterable<Holder>
val Player.bossHolders: Collection<EntityProvidedHolder>
get() {
val holders = mutableListOf<Holder>()
val holders = mutableListOf<EntityProvidedHolder>()
for (boss in Bosses.values()) {
for (livingBoss in boss.getAllAlive()) {
val entity = livingBoss.entity ?: continue
val entity = livingBoss.entity
if (entity.world != this.world) {
continue
}
if (entity.location.distanceSquared(this.location) <= boss.influence.pow(2)) {
holders.add(boss)
holders.add(EntityProvidedHolder(boss, entity))
}
}
}
@@ -37,13 +38,12 @@ var ItemStack.bossEgg: EcoBoss?
if (value == null) {
pdc.remove(spawnEggKey)
} else {
pdc.set(spawnEggKey, PersistentDataType.STRING, value.id)
pdc.set(spawnEggKey, PersistentDataType.STRING, value.id.key)
}
this.itemMeta = meta
}
get() {
val meta = this.itemMeta ?: return null
val pdc = meta.persistentDataContainer
val pdc = this.fast().persistentDataContainer
val id = pdc.get(spawnEggKey, PersistentDataType.STRING) ?: return null
return Bosses.getByID(id)
}

View File

@@ -1,19 +1,29 @@
package com.willfp.ecobosses.bosses
import com.google.common.collect.BiMap
import com.google.common.collect.HashBiMap
import com.google.common.collect.ImmutableList
import com.willfp.eco.core.config.ConfigType
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.core.config.readConfig
import com.willfp.eco.core.config.updating.ConfigUpdater
import com.willfp.eco.core.registry.Registry
import com.willfp.ecobosses.EcoBossesPlugin
import com.willfp.libreforge.chains.EffectChains
import com.willfp.libreforge.loader.LibreforgePlugin
import com.willfp.libreforge.loader.configs.ConfigCategory
import com.willfp.libreforge.loader.configs.LegacyLocation
import com.willfp.libreforge.separatorAmbivalent
import org.bukkit.entity.Entity
import org.bukkit.entity.LivingEntity
import java.io.File
import java.util.UUID
object Bosses {
/**
* Registered bosses.
*/
private val BY_ID: BiMap<String, EcoBoss> = HashBiMap.create()
object Bosses : ConfigCategory("boss", "bosses") {
/** Registered bosses. */
private val registry = Registry<EcoBoss>()
override val legacyLocation = LegacyLocation(
"ecobosses.yml",
"bosses"
)
/**
* Get all registered [EcoBoss]s.
@@ -22,7 +32,7 @@ object Bosses {
*/
@JvmStatic
fun values(): List<EcoBoss> {
return ImmutableList.copyOf(BY_ID.values)
return ImmutableList.copyOf(registry.values())
}
/**
@@ -33,49 +43,15 @@ object Bosses {
*/
@JvmStatic
fun getByID(name: String): EcoBoss? {
return BY_ID[name]
return registry[name]
}
/**
* Update all [EcoBoss]s.
*
* @param plugin Instance of EcoBosses.
*/
@ConfigUpdater
@JvmStatic
fun update(plugin: EcoBossesPlugin) {
plugin.ecoBossesYml.getSubsections("chains").mapNotNull {
EffectChains.compile(it, "Effect Chains")
}
for (boss in values()) {
removeBoss(boss)
}
for (bossConfig in plugin.ecoBossesYml.getSubsections("bosses")) {
addNewBoss(EcoBoss(bossConfig, plugin))
}
override fun clear(plugin: LibreforgePlugin) {
registry.clear()
}
/**
* Add new [EcoBoss] to EcoBosses.
*
* @param set The [EcoBoss] to add.
*/
@JvmStatic
fun addNewBoss(set: EcoBoss) {
BY_ID.remove(set.id)
BY_ID[set.id] = set
}
/**
* Remove [EcoBoss] from EcoBosses.
*
* @param set The [EcoBoss] to remove.
*/
@JvmStatic
fun removeBoss(set: EcoBoss) {
BY_ID.remove(set.id)
override fun acceptConfig(plugin: LibreforgePlugin, id: String, config: Config) {
registry.register(EcoBoss(id, config, plugin as EcoBossesPlugin))
}
/**
@@ -119,4 +95,14 @@ object Bosses {
operator fun get(entity: LivingEntity): LivingEcoBoss? {
return get(entity.uniqueId)
}
/** If an entity is a boss. */
val Entity?.isBoss: Boolean
get() {
if (this !is LivingEntity) {
return false
}
return Bosses[this] != null
}
}

View File

@@ -0,0 +1,8 @@
package com.willfp.ecobosses.bosses
import com.willfp.eco.core.entities.ai.Goal
data class ConfiguredGoal<T : Goal<*>>(
val priority: Int,
val goal: T
)

View File

@@ -1,22 +1,45 @@
package com.willfp.ecobosses.bosses
import com.ticxo.modelengine.api.ModelEngineAPI
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.core.entities.CustomEntity
import com.willfp.eco.core.entities.Entities
import com.willfp.eco.core.entities.TestableEntity
import com.willfp.eco.core.entities.ai.EntityController
import com.willfp.eco.core.entities.ai.EntityGoal
import com.willfp.eco.core.entities.ai.EntityGoals
import com.willfp.eco.core.entities.ai.TargetGoal
import com.willfp.eco.core.entities.ai.TargetGoals
import com.willfp.eco.core.items.CustomItem
import com.willfp.eco.core.items.Items
import com.willfp.eco.core.items.builder.ItemStackBuilder
import com.willfp.eco.core.recipe.Recipes
import com.willfp.eco.core.recipe.parts.EmptyTestableItem
import com.willfp.eco.core.recipe.recipes.CraftingRecipe
import com.willfp.eco.core.registry.Registrable
import com.willfp.eco.util.NamespacedKeyUtils
import com.willfp.eco.util.toComponent
import com.willfp.ecobosses.events.BossKillEvent
import com.willfp.ecobosses.lifecycle.BossLifecycle
import com.willfp.ecobosses.tick.*
import com.willfp.ecobosses.util.*
import com.willfp.ecobosses.tick.BossBarTicker
import com.willfp.ecobosses.tick.BossTicker
import com.willfp.ecobosses.tick.ChunkTicker
import com.willfp.ecobosses.tick.DisplayNameTicker
import com.willfp.ecobosses.tick.LifespanTicker
import com.willfp.ecobosses.tick.TargetTicker
import com.willfp.ecobosses.tick.TeleportHandler
import com.willfp.ecobosses.util.BossDrop
import com.willfp.ecobosses.util.CommandReward
import com.willfp.ecobosses.util.ConfiguredSound
import com.willfp.ecobosses.util.LocalBroadcast
import com.willfp.ecobosses.util.LocalCommands
import com.willfp.ecobosses.util.PlayableSound
import com.willfp.ecobosses.util.SpawnTotem
import com.willfp.ecobosses.util.XpReward
import com.willfp.ecobosses.util.topDamagers
import com.willfp.libreforge.Holder
import com.willfp.libreforge.ViolationContext
import com.willfp.libreforge.conditions.Conditions
import com.willfp.libreforge.effects.Effects
import net.kyori.adventure.bossbar.BossBar
@@ -24,17 +47,21 @@ import org.bukkit.Bukkit
import org.bukkit.Location
import org.bukkit.Material
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Mob
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import java.util.*
import org.bukkit.persistence.PersistentDataType
import java.util.Objects
import java.util.UUID
class EcoBoss(
id: String,
val config: Config,
private val plugin: EcoPlugin
) : Holder {
val id: String = config.getString("id")
) : Holder, Registrable {
override val id = plugin.createNamespacedKey(id)
val displayName: String = config.getString("displayName")
val displayName: String = config.getString("display-name")
val lifespan = config.getInt("lifespan")
@@ -44,23 +71,23 @@ class EcoBoss(
val targetMode = TargetMode.getByID(config.getString("target.mode"))!!
val isBossBarEnabled = config.getBool("bossBar.enabled")
val isBossBarEnabled = config.getBool("boss-bar.enabled")
val bossBarRadius = config.getDouble("bossBar.radius")
val bossBarRadius = config.getDouble("boss-bar.radius")
val isPreventingMounts = config.getBool("defence.preventMounts")
val isPreventingMounts = config.getBool("defence.prevent-mounts")
val isImmuneToExplosions = config.getBool("defence.explosionImmune")
val isImmuneToExplosions = config.getBool("defence.explosion-immune")
val isImmuneToFire = config.getBool("defence.fireImmune")
val isImmuneToFire = config.getBool("defence.fire-immune")
val isImmuneToDrowning = config.getBool("defence.drowningImmune")
val isImmuneToDrowning = config.getBool("defence.drowning-immune")
val isImmuneToSuffocation = config.getBool("defence.suffocationImmune")
val isImmuneToSuffocation = config.getBool("defence.suffocation-immune")
val meleeDamageMultiplier = config.getDouble("defence.meleeDamageMultiplier")
val meleeDamageMultiplier = config.getDouble("defence.melee-damage-multiplier")
val projectileDamageMultiplier = config.getDouble("defence.projectileDamageMultiplier")
val projectileDamageMultiplier = config.getDouble("defence.projectile-damage-multiplier")
val canTeleport = config.getBool("defence.teleportation.enabled")
@@ -115,7 +142,7 @@ class EcoBoss(
val recipe = Recipes.createAndRegisterRecipe(
this@EcoBoss.plugin,
"${this.id}_spawn_egg",
"${this.id.key}_spawn_egg",
spawnEggBacker,
config.getStrings("spawn.egg.recipe")
)
@@ -135,7 +162,7 @@ class EcoBoss(
)
}
val disabledTotemWorlds: List<String> = config.getStrings("spawn.totem.notInWorlds")
val disabledTotemWorlds: List<String> = config.getStrings("spawn.totem.not-in-worlds")
val autoSpawnInterval = config.getInt("spawn.autospawn.interval")
@@ -147,31 +174,46 @@ class EcoBoss(
val x = config.getDouble("x")
val y = config.getDouble("y")
val z = config.getDouble("z")
locations.add(
Location(
world, x, y, z
)
)
locations.add(Location(world, x, y, z))
}
locations
}
val spawnConditions = config.getSubsections("spawn.conditions").mapNotNull {
Conditions.compile(it, "$id Spawn Conditions")
val hasCustomAI = config.getBool("custom-ai.enabled")
val targetGoals = config.getSubsections("custom-ai.target-goals").mapNotNull {
val key = NamespacedKeyUtils.fromStringOrNull(it.getString("key")) ?: return@mapNotNull null
val deserializer = TargetGoals.getByKey(key) ?: return@mapNotNull null
val goal = deserializer.deserialize(it.getSubsection("args")) ?: return@mapNotNull null
ConfiguredGoal(it.getInt("priority"), goal)
}
private val bossBarColor = BossBar.Color.valueOf(config.getString("bossBar.color").uppercase())
val entityGoals = config.getSubsections("custom-ai.ai-goals").mapNotNull {
val key = NamespacedKeyUtils.fromStringOrNull(it.getString("key")) ?: return@mapNotNull null
val deserializer = EntityGoals.getByKey(key) ?: return@mapNotNull null
val goal = deserializer.deserialize(it.getSubsection("args")) ?: return@mapNotNull null
ConfiguredGoal(it.getInt("priority"), goal)
}
private val bossBarStyle = BossBar.Overlay.valueOf(config.getString("bossBar.style").uppercase())
val spawnConditions = Conditions.compile(
config.getSubsections("spawn.conditions"),
ViolationContext(plugin, "$id Spawn Conditions")
)
private val bossBarColor = BossBar.Color.valueOf(config.getString("boss-bar.color").uppercase())
private val bossBarStyle = BossBar.Overlay.valueOf(config.getString("boss-bar.style").uppercase())
private val sounds: Map<BossLifecycle, PlayableSound> = run {
val map = mutableMapOf<BossLifecycle, PlayableSound>()
for (value in BossLifecycle.values()) {
map[value] = PlayableSound(config.getSubsections("sounds.${value.name.lowercase()}").map {
ConfiguredSound.fromConfig(it)
})
map[value] = PlayableSound(
config.getSubsections("sounds.${value.name.lowercase()}").map {
ConfiguredSound.fromConfig(it)
}
)
}
map
@@ -189,13 +231,23 @@ class EcoBoss(
map
}
private val commands: Map<BossLifecycle, LocalCommands> = run {
val map = mutableMapOf<BossLifecycle, LocalCommands>()
for (value in BossLifecycle.values()) {
map[value] = LocalCommands(config.getStrings("commands.${value.name.lowercase()}"))
}
map
}
private val commandRewards: Map<Int, Iterable<CommandReward>> = run {
val map = mutableMapOf<Int, Iterable<CommandReward>>()
for (rank in config.getSubsection("rewards.topDamagerCommands").getKeys(false)) {
for (rank in config.getSubsection("rewards.top-damager-commands").getKeys(false)) {
val rankRewards = mutableListOf<CommandReward>()
for (config in config.getSubsections("rewards.topDamagerCommands.$rank")) {
for (config in config.getSubsections("rewards.top-damager-commands.$rank")) {
rankRewards.add(
CommandReward(
config.getDouble("chance"),
@@ -210,12 +262,12 @@ class EcoBoss(
map
}
private val nearbyCommandRewardRadius = config.getDouble("rewards.nearbyPlayerCommands.radius")
private val nearbyCommandRewardRadius = config.getDouble("rewards.nearby-player-commands.radius")
private val nearbyCommands: Iterable<CommandReward> = run {
val list = mutableListOf<CommandReward>()
for (config in config.getSubsections("rewards.nearbyPlayerCommands.commands")) {
for (config in config.getSubsections("rewards.nearby-player-commands.commands")) {
list.add(
CommandReward(
config.getDouble("chance"),
@@ -232,7 +284,6 @@ class EcoBoss(
config.getInt("rewards.xp.maximum")
)
private val drops: Iterable<BossDrop> = run {
val list = mutableListOf<BossDrop>()
@@ -253,15 +304,21 @@ class EcoBoss(
private val mob: TestableEntity = Entities.lookup(config.getString("mob"))
private val modelEngineID = config.getStringOrNull("model-engine-id")
private val modelEngineAnimation = config.getStringOrNull("model-engine-animation")
private val currentlyAlive = mutableMapOf<UUID, LivingEcoBoss>()
override val conditions = config.getSubsections("conditions").mapNotNull {
Conditions.compile(it, "Boss ID $id")
}.toSet()
override val conditions = Conditions.compile(
config.getSubsections("conditions"),
ViolationContext(plugin, "Boss ID $id")
)
override val effects = config.getSubsections("effects").mapNotNull {
Effects.compile(it, "Boss ID $id")
}.toSet()
override val effects = Effects.compile(
config.getSubsections("effects"),
ViolationContext(plugin, "Boss ID $id")
)
fun markDead(uuid: UUID) {
currentlyAlive.remove(uuid)
@@ -280,14 +337,57 @@ class EcoBoss(
}
fun spawn(location: Location): LivingEcoBoss {
val mob = mob.spawn(location) as LivingEntity
val mob = mob.spawn(location) as Mob
mob.isPersistent = true
mob.isCustomNameVisible = true
mob.removeWhenFarAway = false
mob.persistentDataContainer.set(
plugin.namespacedKeyFactory.create("boss"),
PersistentDataType.STRING,
this.id.key
)
if (hasCustomAI) {
val controller = EntityController.getFor(mob).clearAllGoals()
@Suppress("UNCHECKED_CAST") // What could go wrong?
targetGoals.forEach { controller.addTargetGoal(it.priority, it.goal as TargetGoal<in Mob>) }
@Suppress("UNCHECKED_CAST")
entityGoals.forEach { controller.addEntityGoal(it.priority, it.goal as EntityGoal<in Mob>) }
}
if (modelEngineID != null && Bukkit.getPluginManager().isPluginEnabled("ModelEngine")) {
val model = ModelEngineAPI.createActiveModel(modelEngineID)
if (model == null) {
plugin.logger.warning("Invalid Model Engine ID for boss $id")
}
if (modelEngineAnimation != null) {
val animationHandler = model.animationHandler
val animationProperty = animationHandler.getAnimation(modelEngineAnimation)
if (animationProperty != null) {
animationHandler.playAnimation(animationProperty, true)
} else {
plugin.logger.warning("Animation $modelEngineAnimation not found in model $modelEngineID, defaulting to walk!")
val animationPropertyWalk = animationHandler.getAnimation("walk")
if (animationPropertyWalk != null) {
animationHandler.playAnimation(animationPropertyWalk, true)
} else {
plugin.logger.warning("Walk animation not found in $modelEngineID!")
}
}
}
val modelled = ModelEngineAPI.createModeledEntity(mob)
modelled.addModel(model, true)
modelled.isBaseEntityVisible = false
}
val boss = LivingEcoBoss(
plugin,
mob.uniqueId,
mob,
this,
createTickers()
)
@@ -300,7 +400,8 @@ class EcoBoss(
LifespanTicker(),
DisplayNameTicker(),
TargetTicker(),
TeleportHandler()
TeleportHandler(),
ChunkTicker()
)
if (isBossBarEnabled) {
@@ -322,10 +423,11 @@ class EcoBoss(
fun handleLifecycle(lifecycle: BossLifecycle, location: Location, entity: LivingEntity?) {
sounds[lifecycle]?.play(location)
messages[lifecycle]?.forEach { it.broadcast(location, entity?.topDamagers ?: emptyList()) }
commands[lifecycle]?.dispatch(location, entity?.topDamagers ?: emptyList())
}
fun processRewards(event: BossKillEvent) {
val entity = event.boss.entity ?: return
val entity = event.boss.entity
val location = entity.location
val player = event.killer
@@ -373,6 +475,9 @@ class EcoBoss(
)
}
override fun getID(): String {
return this.id.key
}
override fun equals(other: Any?): Boolean {
if (other !is EcoBoss) {
@@ -387,8 +492,10 @@ class EcoBoss(
}
override fun toString(): String {
return ("EcoBoss{"
+ id
+ "}")
return (
"EcoBoss{" +
id +
"}"
)
}
}

View File

@@ -0,0 +1,42 @@
package com.willfp.ecobosses.bosses
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.display.Display
import com.willfp.eco.core.display.DisplayModule
import com.willfp.eco.core.display.DisplayPriority
import com.willfp.eco.core.fast.fast
import com.willfp.libreforge.SimpleProvidedHolder
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
class EggDisplay(
plugin: EcoPlugin
) : DisplayModule(
plugin,
DisplayPriority.LOW
) {
override fun display(itemStack: ItemStack, player: Player?, vararg args: Any) {
if (player == null) {
return
}
val fis = itemStack.fast()
val lore = fis.lore.toMutableList()
val egg = itemStack.bossEgg ?: return
val lines = egg.spawnConditions
.filterNot { it.isMet(player, SimpleProvidedHolder(egg)) }
.map { it.notMetLines.map { line -> Display.PREFIX + line } }
.flatten()
if (lines.isNotEmpty()) {
lore.add(Display.PREFIX)
lore.addAll(lines)
}
fis.lore = lore
}
}

View File

@@ -2,13 +2,12 @@ package com.willfp.ecobosses.bosses
import com.willfp.eco.core.EcoPlugin
import com.willfp.ecobosses.tick.BossTicker
import org.bukkit.Bukkit
import org.bukkit.Chunk
import org.bukkit.entity.Mob
import java.util.UUID
class LivingEcoBoss(
plugin: EcoPlugin,
private val uuid: UUID,
val entity: Mob,
val boss: EcoBoss,
private val tickers: Set<BossTicker>
) {
@@ -18,15 +17,17 @@ class LivingEcoBoss(
}
}.apply { runTaskTimer(1, 1) }
val entity: Mob?
get() = Bukkit.getEntity(uuid) as? Mob
val chunk: Chunk
get() = entity.location.chunk
val forceLoadedChunks = mutableListOf<Chunk>()
val deathTime = System.currentTimeMillis() + (boss.lifespan * 1000)
private var currentTick = 1 // Start at 1 as 0 is divisible by everything
private fun tick(): Boolean {
if (entity == null || entity?.isDead == true) {
if (entity.isDead) {
remove()
return true
}
@@ -40,13 +41,13 @@ class LivingEcoBoss(
fun remove() {
ticker.cancel()
entity?.remove()
entity.remove()
tickers.forEach { it.onDeath(this, currentTick) }
boss.markDead(uuid)
boss.markDead(entity.uniqueId)
}
override fun toString(): String {
return "LivingEcoBoss{boss=${boss}, uuid=${uuid}}"
return "LivingEcoBoss{boss=$boss, uuid=${entity.uniqueId}}"
}
}

View File

@@ -3,6 +3,7 @@ package com.willfp.ecobosses.bosses
import com.google.common.collect.BiMap
import com.google.common.collect.HashBiMap
import com.google.common.collect.ImmutableList
import org.bukkit.GameMode
import org.bukkit.entity.Entity
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player
@@ -16,14 +17,16 @@ class TargetMode(
}
fun getTarget(boss: LivingEcoBoss): LivingEntity? {
val entity = boss.entity ?: return null
val entity = boss.entity
return function(
entity.getNearbyEntities(
boss.boss.targetRange,
boss.boss.targetRange,
boss.boss.targetRange
).filterIsInstance<Player>(),
).filterIsInstance<Player>()
.filter { listOf(GameMode.SURVIVAL, GameMode.ADVENTURE).contains(it.gameMode) }
.ifEmpty { return null },
entity
)
}

View File

@@ -4,7 +4,7 @@ import com.willfp.eco.core.command.impl.PluginCommand
import com.willfp.ecobosses.EcoBossesPlugin
import org.bukkit.command.CommandSender
class CommandEcobosses(plugin: EcoBossesPlugin) : PluginCommand(
class CommandEcoBosses(plugin: EcoBossesPlugin) : PluginCommand(
plugin,
"ecobosses",
"ecobosses.command.ecobosses",

View File

@@ -47,7 +47,7 @@ class CommandGive(plugin: EcoPlugin) : Subcommand(
}
var message = plugin.langYml.getMessage("give-success")
message = message.replace("%boss%", boss.id).replace("%recipient%", reciever.name)
message = message.replace("%boss%", boss.id.key).replace("%recipient%", reciever.name)
sender.sendMessage(message)
val itemStack = boss.spawnEgg!!
@@ -94,7 +94,7 @@ class CommandGive(plugin: EcoPlugin) : Subcommand(
* The cached names.
*/
private val BOSS_NAMES: List<String>
get() = Bosses.values().map { it.id }
get() = Bosses.values().map { it.id.key }
/**

View File

@@ -166,7 +166,7 @@ class CommandSpawn(plugin: EcoBossesPlugin) : Subcommand(
* The cached names.
*/
private val BOSS_NAMES: List<String>
get() = Bosses.values().map { it.id }
get() = Bosses.values().map { it.id.key }
/**
* The cached numbers.

View File

@@ -1,12 +0,0 @@
package com.willfp.ecobosses.config
import com.willfp.eco.core.config.BaseConfig
import com.willfp.eco.core.config.ConfigType
import com.willfp.ecobosses.EcoBossesPlugin
class EcoBossesYml(plugin: EcoBossesPlugin) : BaseConfig(
"ecobosses",
plugin,
true,
ConfigType.YAML
)

View File

@@ -1,10 +1,8 @@
package com.willfp.ecobosses.events
import com.willfp.ecobosses.bosses.LivingEcoBoss
import com.willfp.ecobosses.lifecycle.BossLifecycle
import org.bukkit.event.Event
import org.bukkit.event.HandlerList
import org.bukkit.event.entity.EntityDeathEvent
abstract class BossDeathEvent(
val boss: LivingEcoBoss

View File

@@ -1,7 +1,6 @@
package com.willfp.ecobosses.events
import com.willfp.ecobosses.bosses.LivingEcoBoss
import com.willfp.ecobosses.lifecycle.BossLifecycle
import org.bukkit.event.HandlerList
class BossDespawnEvent(

View File

@@ -1,7 +1,6 @@
package com.willfp.ecobosses.events
import com.willfp.ecobosses.bosses.LivingEcoBoss
import com.willfp.ecobosses.lifecycle.BossLifecycle
import org.bukkit.entity.Player
import org.bukkit.event.HandlerList
import org.bukkit.event.entity.EntityDeathEvent

View File

@@ -31,6 +31,7 @@ class BossSpawnEvent(
TOTEM,
EGG,
COMMAND,
AUTOSPAWN,
UNKNOWN
}

View File

@@ -1,7 +1,6 @@
package com.willfp.ecobosses.events
import com.willfp.ecobosses.bosses.EcoBoss
import com.willfp.ecobosses.bosses.LivingEcoBoss
import org.bukkit.Location
import org.bukkit.entity.Player
import org.bukkit.event.Event
@@ -14,7 +13,7 @@ class BossTryDropItemEvent(
var items: MutableCollection<ItemStack>,
var chance: Double,
val player: Player?
): Event() {
) : Event() {
override fun getHandlers(): HandlerList {
return HANDLERS
}

View File

@@ -0,0 +1,28 @@
package com.willfp.ecobosses.libreforge
import com.willfp.ecobosses.bosses.Bosses
import com.willfp.ecobosses.bosses.EcoBoss
import com.willfp.ecobosses.events.BossTryDropItemEvent
import com.willfp.libreforge.effects.templates.MultiMultiplierEffect
import org.bukkit.event.EventHandler
object EffectBossDropChanceMultiplier : MultiMultiplierEffect<EcoBoss>("boss_drop_chance_multiplier") {
override val key = "bosses"
override fun getElement(key: String): EcoBoss? {
return Bosses.getByID(key)
}
override fun getAllElements(): Collection<EcoBoss> {
return Bosses.values()
}
@EventHandler(ignoreCancelled = true)
fun handle(event: BossTryDropItemEvent) {
val player = event.player ?: return
val multiplier = getMultiplier(player, event.boss)
event.chance *= multiplier
}
}

View File

@@ -0,0 +1,32 @@
package com.willfp.ecobosses.libreforge
import com.willfp.ecobosses.events.BossKillEvent
import com.willfp.libreforge.triggers.Trigger
import com.willfp.libreforge.triggers.TriggerData
import com.willfp.libreforge.triggers.TriggerParameter
import org.bukkit.attribute.Attribute
import org.bukkit.event.EventHandler
object TriggerKillBoss : Trigger("kill_boss") {
override val parameters = setOf(
TriggerParameter.PLAYER,
TriggerParameter.VICTIM,
TriggerParameter.LOCATION
)
@EventHandler(ignoreCancelled = true)
fun handle(event: BossKillEvent) {
val killer = event.killer ?: return
val entity = event.boss.entity
this.dispatch(
killer,
TriggerData(
player = killer,
victim = entity,
location = entity.location,
value = entity.getAttribute(Attribute.GENERIC_MAX_HEALTH)!!.value
)
)
}
}

View File

@@ -0,0 +1,28 @@
package com.willfp.ecobosses.libreforge
import com.willfp.ecobosses.events.BossSpawnEvent
import com.willfp.libreforge.triggers.Trigger
import com.willfp.libreforge.triggers.TriggerData
import com.willfp.libreforge.triggers.TriggerParameter
import org.bukkit.event.EventHandler
object TriggerSpawnBoss : Trigger("spawn_boss") {
override val parameters = setOf(
TriggerParameter.PLAYER,
TriggerParameter.LOCATION
)
@EventHandler(ignoreCancelled = true)
fun handle(event: BossSpawnEvent) {
val player = event.spawner ?: return
val location = event.location
this.dispatch(
player,
TriggerData(
player = player,
location = location
)
)
}
}

View File

@@ -1,16 +1,25 @@
package com.willfp.ecobosses.lifecycle
import com.willfp.ecobosses.bosses.Bosses
import org.bukkit.entity.LivingEntity
import com.willfp.ecobosses.bosses.Bosses.isBoss
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.entity.EntityTransformEvent
import org.bukkit.event.entity.SlimeSplitEvent
class CompatibilityListeners : Listener {
@EventHandler
fun handle(event: SlimeSplitEvent) {
if (Bosses[event.entity as? LivingEntity ?: return] != null) {
event.isCancelled = true
if (!event.entity.isBoss) {
return
}
event.isCancelled = true
}
@EventHandler
fun handle(event: EntityTransformEvent) {
if (!event.entity.isBoss) {
return
}
event.isCancelled = true
}
}

View File

@@ -1,15 +1,15 @@
package com.willfp.ecobosses.lifecycle
import com.willfp.eco.core.EcoPlugin
import com.willfp.ecobosses.events.BossDespawnEvent
import com.willfp.ecobosses.events.BossKillEvent
import com.willfp.ecobosses.events.BossSpawnEvent
import com.willfp.libreforge.LibReforgePlugin
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.Listener
class ConsoleLoggers(
private val plugin: LibReforgePlugin
private val plugin: EcoPlugin
) : Listener {
@EventHandler(
ignoreCancelled = true,
@@ -34,8 +34,8 @@ class ConsoleLoggers(
return
}
val loc = event.boss.entity?.location
val location = "${loc?.world?.name}: ${loc?.x}, ${loc?.y}, ${loc?.z}"
val loc = event.boss.entity.location
val location = "${loc.world?.name}: ${loc.x}, ${loc.y}, ${loc.z}"
plugin.logger.info("&a${event.boss.boss.id}&r was killed by &a${event.killer?.name}&r at &a$location")
}
@@ -48,8 +48,8 @@ class ConsoleLoggers(
if (!plugin.configYml.getBool("log-spawn-kill")) {
return
}
val loc = event.boss.entity?.location
val location = "${loc?.world?.name}: ${loc?.x}, ${loc?.y}, ${loc?.z}"
val loc = event.boss.entity.location
val location = "${loc.world?.name}: ${loc.x}, ${loc.y}, ${loc.z}"
plugin.logger.info("&a${event.boss.boss.id}&r despawned at &a$location")
}

View File

@@ -1,11 +1,12 @@
package com.willfp.ecobosses.lifecycle
import com.willfp.eco.core.events.EntityDeathByEntityEvent
import com.willfp.eco.util.tryAsPlayer
import com.willfp.ecobosses.bosses.Bosses
import com.willfp.ecobosses.events.BossKillEvent
import com.willfp.libreforge.tryAsPlayer
import org.bukkit.Bukkit
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.Listener
import org.bukkit.event.entity.EntityDeathEvent
@@ -25,7 +26,8 @@ class DeathListeners : Listener {
}
@EventHandler(
ignoreCancelled = true
ignoreCancelled = true,
priority = EventPriority.HIGHEST
)
fun handle(event: EntityDeathEvent) {
val boss = Bosses[event.entity] ?: return

View File

@@ -1,7 +1,6 @@
package com.willfp.ecobosses.lifecycle
import com.willfp.ecobosses.bosses.Bosses
import com.willfp.ecobosses.events.BossDeathEvent
import com.willfp.ecobosses.events.BossDespawnEvent
import com.willfp.ecobosses.events.BossKillEvent
import com.willfp.ecobosses.events.BossSpawnEvent
@@ -28,7 +27,7 @@ class LifecycleHandlers : Listener {
priority = EventPriority.MONITOR
)
fun handle(event: BossKillEvent) {
val entity = event.boss.entity ?: return
val entity = event.boss.entity
event.boss.boss.handleLifecycle(BossLifecycle.KILL, entity.location, entity)
}
@@ -38,7 +37,7 @@ class LifecycleHandlers : Listener {
priority = EventPriority.MONITOR
)
fun handle(event: BossDespawnEvent) {
val entity = event.boss.entity ?: return
val entity = event.boss.entity
event.boss.boss.handleLifecycle(BossLifecycle.DESPAWN, entity.location, entity)
}

View File

@@ -2,6 +2,8 @@ package com.willfp.ecobosses.spawn
import com.willfp.eco.core.EcoPlugin
import com.willfp.ecobosses.bosses.Bosses
import com.willfp.ecobosses.events.BossSpawnEvent
import org.bukkit.Bukkit
object AutospawnHandler {
private var tick = 1
@@ -20,11 +22,19 @@ object AutospawnHandler {
val location = boss.autoSpawnLocations.randomOrNull() ?: continue
val world = location.world ?: continue
if (Bosses.getAllAlive().mapNotNull { it.entity }.any { it.world == world }) {
continue
if (plugin.configYml.getBool("autospawn.one-boss-per-world")) {
if (Bosses.getAllAlive().map { it.entity }.any { it.world == world }) {
continue
}
}
boss.spawn(location)
val spawnEvent = BossSpawnEvent(boss, location, BossSpawnEvent.SpawnReason.AUTOSPAWN, null)
Bukkit.getPluginManager().callEvent(spawnEvent)
if (!spawnEvent.isCancelled) {
boss.spawn(location)
}
}
tick++

View File

@@ -1,16 +1,26 @@
package com.willfp.ecobosses.spawn
import com.willfp.ecobosses.EcoBossesPlugin
import com.willfp.ecobosses.bosses.bossEgg
import com.willfp.ecobosses.events.BossSpawnEvent
import com.willfp.libreforge.SimpleProvidedHolder
import org.bukkit.Bukkit
import org.bukkit.Location
import org.bukkit.block.Container
import org.bukkit.block.data.Directional
import org.bukkit.entity.Player
import org.bukkit.event.Event
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.block.Action
import org.bukkit.event.block.BlockDispenseEvent
import org.bukkit.event.player.PlayerInteractEvent
import org.bukkit.inventory.EquipmentSlot
import org.bukkit.inventory.ItemStack
class SpawnEggHandler : Listener {
class SpawnEggHandler(
private val plugin: EcoBossesPlugin
) : Listener {
@EventHandler(
ignoreCancelled = true
)
@@ -19,28 +29,13 @@ class SpawnEggHandler : Listener {
return
}
val item = event.item ?: return
val boss = item.bossEgg ?: return
if (!this.handleSpawnEgg(event.item, event.clickedBlock?.location?.add(0.0, 1.5, 0.0), event.player)) {
return
}
event.isCancelled = true
event.setUseItemInHand(Event.Result.DENY)
val location = event.clickedBlock?.location?.add(0.0, 1.5, 0.0) ?: return
val player = event.player
if (!boss.spawnConditions.all { it.condition.isConditionMet(player, it.config) }) {
return
}
val spawnEvent = BossSpawnEvent(boss, location, BossSpawnEvent.SpawnReason.EGG, player)
Bukkit.getPluginManager().callEvent(spawnEvent)
if (spawnEvent.isCancelled) {
return
}
if (event.hand == EquipmentSlot.HAND) {
val hand = event.player.inventory.itemInMainHand
hand.amount = hand.amount - 1
@@ -48,7 +43,56 @@ class SpawnEggHandler : Listener {
val hand = event.player.inventory.itemInOffHand
hand.amount = hand.amount - 1
}
}
@EventHandler(
ignoreCancelled = true
)
fun handle(event: BlockDispenseEvent) {
val facing = (event.block.blockData as Directional).facing
val location = event.block.location.add(facing.direction.multiply(1.7))
if (!this.handleSpawnEgg(event.item, location, null)) return
event.isCancelled = true
val dispenser = event.block.state as? Container ?: return
// This is needed as the event must finish first,
// Otherwise the dispenser/dropper thinks the item is already removed from this event.
plugin.scheduler.run {
val item = dispenser.inventory.find { it?.isSimilar(event.item) == true } ?: return@run
item.amount--
dispenser.update()
}
}
private fun handleSpawnEgg(
item: ItemStack?,
location: Location?,
player: Player?
): Boolean {
val boss = item?.bossEgg ?: return false
if (location == null) {
return false
}
if (player != null) {
if (!boss.spawnConditions.areMet(player, SimpleProvidedHolder(boss))) {
return false
}
}
val spawnEvent = BossSpawnEvent(boss, location, BossSpawnEvent.SpawnReason.EGG, player)
Bukkit.getPluginManager().callEvent(spawnEvent)
if (spawnEvent.isCancelled) {
return false
}
boss.spawn(location)
return true
}
}
}

View File

@@ -4,6 +4,8 @@ import com.willfp.eco.util.containsIgnoreCase
import com.willfp.ecobosses.bosses.Bosses
import com.willfp.ecobosses.events.BossSpawnEvent
import com.willfp.ecobosses.util.SpawnTotem
import com.willfp.libreforge.SimpleProvidedHolder
import org.bukkit.Bukkit
import org.bukkit.Material
import org.bukkit.block.Block
import org.bukkit.event.EventHandler
@@ -16,51 +18,55 @@ class SpawnTotemHandler : Listener {
)
fun handle(event: BlockPlaceEvent) {
for (i in 0..2) {
lateinit var block1: Block
lateinit var block2: Block
lateinit var block3: Block
lateinit var top: Block
lateinit var middle: Block
lateinit var bottom: Block
// I know this code sucks ass, but I can't be arsed to write it nicely
when (i) {
0 -> {
block3 = event.block
block2 = event.block.getRelative(0, -1, 0)
block1 = event.block.getRelative(0, -2, 0)
top = event.block
middle = event.block.getRelative(0, -1, 0)
bottom = event.block.getRelative(0, -2, 0)
}
1 -> {
block1 = event.block
block2 = event.block.getRelative(0, 1, 0)
block3 = event.block.getRelative(0, 2, 0)
top = event.block.getRelative(0, 2, 0)
middle = event.block.getRelative(0, 1, 0)
bottom = event.block
}
2 -> {
block2 = event.block
block1 = event.block.getRelative(0, -1, 0)
block3 = event.block.getRelative(0, 1, 0)
top = event.block.getRelative(0, 1, 0)
middle = event.block
bottom = event.block.getRelative(0, -1, 0)
}
}
val placedTotem = SpawnTotem(block1.type, block2.type, block3.type)
val placedTotem = SpawnTotem(top.type, middle.type, bottom.type)
for (boss in Bosses.values()) {
if (boss.totem == null || boss.disabledTotemWorlds.containsIgnoreCase(event.block.world.name)) {
continue
}
if (boss.totem != placedTotem) {
if (!boss.totem.matches(placedTotem)) {
continue
}
val player = event.player
if (!boss.spawnConditions.all { it.condition.isConditionMet(player, it.config) }) {
if (!boss.spawnConditions.areMet(player, SimpleProvidedHolder(boss))) {
return
}
val spawnEvent = BossSpawnEvent(boss, event.block.location, BossSpawnEvent.SpawnReason.TOTEM, player)
Bukkit.getPluginManager().callEvent(spawnEvent)
if (!spawnEvent.isCancelled) {
block1.type = Material.AIR
block2.type = Material.AIR
block3.type = Material.AIR
top.type = Material.AIR
middle.type = Material.AIR
bottom.type = Material.AIR
boss.spawn(event.block.location.add(0.0, 1.5, 0.0))
}

View File

@@ -12,8 +12,9 @@ class BossBarTicker(
private val bar: BossBar
) : BossTicker {
override fun tick(boss: LivingEcoBoss, tick: Int) {
val entity = boss.entity ?: return
val entity = boss.entity
@Suppress("DEPRECATION")
bar.name(entity.customName!!.toComponent())
bar.progress((entity.health / entity.getAttribute(Attribute.GENERIC_MAX_HEALTH)!!.value).toFloat())

View File

@@ -0,0 +1,26 @@
package com.willfp.ecobosses.tick
import com.willfp.ecobosses.bosses.LivingEcoBoss
class ChunkTicker : BossTicker {
override fun tick(boss: LivingEcoBoss, tick: Int) {
val currentChunk = boss.chunk
if (tick % 10 != 0) {
return
}
if (currentChunk.isLoaded && currentChunk.isForceLoaded) {
return
}
currentChunk.load()
currentChunk.isForceLoaded = true
boss.forceLoadedChunks.add(currentChunk)
}
override fun onDeath(boss: LivingEcoBoss, tick: Int) {
boss.forceLoadedChunks.forEach { it.isForceLoaded = false }
boss.forceLoadedChunks.clear()
}
}

View File

@@ -7,7 +7,7 @@ import kotlin.math.ceil
class DisplayNameTicker : BossTicker {
override fun tick(boss: LivingEcoBoss, tick: Int) {
val entity = boss.entity ?: return
val entity = boss.entity
val timeLeft = ceil(
(boss.deathTime - System.currentTimeMillis()) / 1000.0
@@ -15,6 +15,7 @@ class DisplayNameTicker : BossTicker {
val formattedTime = String.format("%d:%02d", timeLeft / 60, timeLeft % 60)
@Suppress("DEPRECATION")
entity.customName = boss.boss.displayName
.replace("%health%", NumberUtils.format(entity.health))
.replace("%time%", formattedTime)

View File

@@ -14,11 +14,6 @@ class LifespanTicker : BossTicker {
Bukkit.getPluginManager().callEvent(event)
boss.remove()
boss.boss.handleLifecycle(
BossLifecycle.DESPAWN,
boss.entity?.location ?: return,
boss.entity
)
}
}
}

View File

@@ -4,7 +4,7 @@ import com.willfp.ecobosses.bosses.LivingEcoBoss
class TargetTicker : BossTicker {
override fun tick(boss: LivingEcoBoss, tick: Int) {
val entity = boss.entity ?: return
val entity = boss.entity
if (tick % 10 != 0) {
return

View File

@@ -7,7 +7,7 @@ import org.bukkit.block.BlockFace
class TeleportHandler : BossTicker {
override fun tick(boss: LivingEcoBoss, tick: Int) {
val entity = boss.entity ?: return
val entity = boss.entity
if (!boss.boss.canTeleport) {
return
}

View File

@@ -1,13 +1,13 @@
package com.willfp.ecobosses.util
import com.willfp.eco.util.tryAsPlayer
import com.willfp.ecobosses.EcoBossesPlugin
import com.willfp.libreforge.tryAsPlayer
import org.bukkit.entity.LivingEntity
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.Listener
import org.bukkit.event.entity.EntityDamageByEntityEvent
import java.util.UUID
import java.util.*
data class Damager(
val uuid: UUID,

View File

@@ -0,0 +1,24 @@
package com.willfp.ecobosses.util
import com.willfp.libreforge.Holder
import com.willfp.libreforge.ProvidedHolder
import org.bukkit.entity.LivingEntity
class EntityProvidedHolder(
override val holder: Holder,
override val provider: LivingEntity
) : ProvidedHolder {
override fun equals(other: Any?): Boolean {
if (other !is EntityProvidedHolder) {
return false
}
return other.holder == holder && other.provider == provider
}
override fun hashCode(): Int {
var result = holder.hashCode()
result = 31 * result + provider.hashCode()
return result
}
}

View File

@@ -38,6 +38,7 @@ data class LocalBroadcast(
if (radius < 0) {
for (message in toBroadcast) {
@Suppress("DEPRECATION")
Bukkit.broadcastMessage(message)
}
} else {

View File

@@ -0,0 +1,37 @@
package com.willfp.ecobosses.util
import com.willfp.eco.util.NumberUtils
import com.willfp.eco.util.savedDisplayName
import com.willfp.ecobosses.EcoBossesPlugin
import org.bukkit.Bukkit
import org.bukkit.Location
data class LocalCommands(
val commands: Iterable<String>,
) {
fun dispatch(location: Location, topDamagers: List<Damager>) {
val toDispatch = commands.toMutableList()
toDispatch.replaceAll {
var command = it
for (i in 1..20) {
val damager = topDamagers.getOrNull(i - 1)
val damage = if (damager?.damage != null) NumberUtils.format(damager.damage) else
EcoBossesPlugin.instance.langYml.getFormattedString("na")
val player = if (damager?.uuid != null) Bukkit.getOfflinePlayer(damager.uuid).savedDisplayName else
EcoBossesPlugin.instance.langYml.getFormattedString("na")
command = command.replace("%damage_${i}%", damage)
.replace("%damage_${i}_player%", player)
}
command.replace("%x%", location.blockX.toString())
.replace("%y%", location.blockY.toString())
.replace("%z%", location.blockZ.toString())
}
for (s in toDispatch) {
Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), s)
}
}
}

View File

@@ -6,4 +6,10 @@ data class SpawnTotem(
val top: Material,
val middle: Material,
val bottom: Material
)
) {
fun matches(totem: SpawnTotem): Boolean {
return this.top == totem.top
&& this.middle == totem.middle
&& this.bottom == totem.bottom
}
}

View File

@@ -0,0 +1,208 @@
# The ID of the boss is the name of the .yml file,
# for example steel_golem.yml has the ID of steel_golem
# You can place bosses anywhere in this folder,
# including in subfolders if you want to organize your boss configs
# _example.yml is not loaded.
# A base mob and modifiers
# View an explanation for this system here: https://plugins.auxilor.io/all-plugins/the-entity-lookup-system
mob: iron_golem attack-damage:90 movement-speed:1.5 follow-range:16 health:1200
# If you're using model engine, you can specify the ID here. You can also specify these in the mob with the lookup system.
model-engine-id: ""
# Supported placeholders: %health%, %time% (formats as minutes:seconds, eg 1:56)
display-name: "&8Steel Golem &7| &c%health%♥ &7| &e%time%"
influence: 40 # The distance at which effects will be applied to players
custom-ai: # Custom mob AI using the entity goal system.
enabled: false # If custom AI should be enabled, this will override the vanilla mob behaviour.
target-goals: [ ] # How the boss decides who to attack, if the target mode isn't being used.
ai-goals: [ ] # How the boss should behave.
effects: # Effects are done from the player's perspective: to treat the player as the victim, use the self_as_victim option in args
- id: run_chain
args:
chain: blind
self_as_victim: true
chance: 20
triggers:
- static_20
conditions: [ ] # Conditions to apply effects to players; useful if you don't want to affect low-level players
lifespan: 120 # The lifespan of the boss before it despawns, in seconds. Set to a massive number to disable.
defence:
prevent-mounts: true # If the boss shouldn't be able to get into boats, minecarts, etc
explosion-immune: true # If the boss should be immune to explosions
fire-immune: true # If the boss should be immune to fire damage
drowning-immune: true # If the boss should be immune to drowning damage
suffocation-immune: true # If the boss should be immune to suffocation
melee-damage-multiplier: 0.8 # Incoming melee damage will be multiplied by this value. Set to 0 to render immune against melee
projectile-damage-multiplier: 0.2 # Same as melee multiplier, but for projectiles
teleportation: # Teleport every x ticks in order to avoid being caged in obsidian or similar
enabled: true # If the boss should teleport
interval: 100 # Ticks between teleportation attempts
range: 20 # The range that the boss should check for safe teleportation blocks.
rewards:
xp: # Experience will be randomly generated between these values
minimum: 30000
maximum: 60000
top-damager-commands:
# You can specify as many ranks as you want (adding 4, 5, etc)
# You can use %player% as a placeholder for the player name
1:
- chance: 100 # As a percentage
commands:
- eco give %player% 10000
2: [ ]
3: [ ]
nearby-player-commands:
# Commands to be executed for all players near the boss death location
radius: 10
# Uses the same syntax as top damager commands (chance and a list of commands, can use %player%)
commands: [ ]
# You can specify as many drops as you want, and group several drops together under one chance
drops:
- chance: 100
items:
- diamond_sword unbreaking:1 name:"Example Sword"
target:
# How the boss should choose which player to attack, choices are:
# highest_health, lowest_health, closest, random
mode: highest_health
# The distance to scan for players
range: 40
boss-bar:
# If the boss should have a boss bar
enabled: true
color: white # Options: blue, green, pink, purple, red, white, yellow
style: progress # Options: progress, notched_20, notched_12, notched_10, notched_6
radius: 120 # The distance from the boss where the boss bar is visible
spawn:
# A list of conditions required for a player to be able to spawn a boss, useful to set
# minimum skill levels, etc
conditions: [ ]
autospawn:
# Spawn the boss automatically every x ticks. Picks a random location, but will only
# ever spawn in a world if there are no other bosses of that type in the world.
interval: -1 # The interval in ticks, set to -1 to disable
locations: # Add as many locations as you want
- world: world
x: 100
y: 100
z: 100
totem:
enabled: false # A spawn totem is a set of 3 blocks on top of each other to spawn a boss (like a snow golem)
top: netherite_block
middle: iron_block
bottom: magma_block
not-in-worlds: [ ] # If spawn totems should be disallowed in certain worlds, specify them here
egg:
enabled: true # If the boss should have a spawn egg
item: evoker_spawn_egg unbreaking:1 hide_enchants
name: "&8Steel Golem&f Spawn Egg"
lore:
- ""
- "&8&oPlace on the ground to"
- "&8&osummon a &8Steel Golem"
craftable: true
recipe:
- iron_block
- netherite_block
- iron_block
- air
- ecoitems:boss_core ? nether_star
- air
- iron_block
- netherite_block
- iron_block
commands:
# For each category, you can add as many commands as you want, which will be executed by
# console. Supported placeholders are the same as for messages (see below)
spawn: [ ]
kill: [ ]
despawn: [ ]
injure: [ ]
messages:
# For each category, you can add as many messages as you want, each with their own radius.
# Radius is the distance from the boss where the player will be sent the message
# Set to -1 to broadcast globally to all players online
# Supported placeholders: %x%, %y%, %z% (coordinates)
spawn:
- message:
- ""
- "&fA &8&lSteel Golem&r&f has been spawned!"
- "&fCome fight it at &8%x%&f, &8%y%&f, &8%z%&f!"
- ""
radius: -1
# Supported placeholders: %damage_<x>_player%, %damage_<X>%
# You can include as many ranks as you want - if there is no player at a certain rank,
# it will be replaced with N/A (change in lang.yml)
kill:
- message:
- ""
- "&fThe &8&lSteel Golem&r&f has been killed!"
- "&fMost Damage:"
- "&f - &8%damage_1_player%&f (%damage_1% Damage)"
- "&f - &8%damage_2_player%&f (%damage_2% Damage)"
- "&f - &8%damage_3_player%&f (%damage_3% Damage)"
- ""
radius: -1
despawn:
- message:
- ""
- "&fYou ran out of time to kill the &8&lSteel Golem&r&f!"
- ""
radius: -1
injure: [ ]
# All sounds will be played together at the same time
# A list of sounds can be found here: https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Sound.html
# Volume functions as the distance at which the sound will be heard
# Pitch is any value between 0.5 and 2
# If you don't want the vanilla mob sounds, add 'silent' as an option to the mob
sounds:
spawn:
- sound: entity_iron_golem_death
pitch: 0.8
volume: 100
- sound: entity_iron_golem_hurt
pitch: 0.5
volume: 100
- sound: entity_ender_dragon_growl
pitch: 0.5
volume: 100
kill:
- sound: entity_ender_dragon_death
pitch: 1.8
volume: 100
- sound: entity_wither_death
pitch: 1.2
volume: 100
despawn:
- sound: entity_ender_dragon_ambient
pitch: 0.5
volume: 50
- sound: entity_enderman_death
pitch: 0.5
volume: 50
injure:
- sound: entity_iron_golem_damage
pitch: 0.7
volume: 10

View File

@@ -0,0 +1,210 @@
mob: illusioner attack-damage:50 health:600 hand:"iron_sword sharpness:5"
model-engine-id: ""
model-engine-animation: ""
display-name: "&9Illusioner &7| &c%health%♥ &7| &e%time%"
influence: 40
custom-ai:
enabled: true
target-goals:
- key: minecraft:hurt_by
priority: 0
args:
blacklist: [ ]
- key: minecraft:nearest_attackable
priority: 1
args:
target:
- player
checkVisibility: false
checkCanNavigate: true
reciprocalChance: 300
- key: minecraft:nearest_attackable
priority: 2
args:
target:
- iron_golem
- villager
checkVisibility: false
checkCanNavigate: true
reciprocalChance: 300
ai-goals:
- key: minecraft:float
priority: 0
- key: minecraft:illusioner_mirror_spell
priority: 1
- key: minecraft:melee_attack
priority: 2
args:
speed: 1.6
pauseWhenMobIdle: false
- key: minecraft:random_stroll
priority: 8
args:
speed: 0.6
interval: 80
canDespawn: false
- key: minecraft:look_at_player
priority: 9
args:
range: 6
chance: 1
effects:
- id: run_chain
args:
chain: blind
self_as_victim: true
chance: 20
triggers:
- static_20
conditions: [ ]
lifespan: 120
defence:
prevent-mounts: true
explosion-immune: true
fire-immune: true
drowning-immune: true
suffocation-immune: true
melee-damage-multiplier: 1
projectile-damage-multiplier: 0.8
teleportation:
enabled: true
interval: 200
range: 20
rewards:
xp:
minimum: 20000
maximum: 40000
top-damager-commands:
1:
- chance: 100 # As a percentage
commands:
- eco give %player% 10000
2: [ ]
3: [ ]
nearby-player-commands:
radius: 10
commands: [ ]
drops: []
target:
mode: closest
range: 40
boss-bar:
enabled: true
color: blue
style: notched_20
radius: 120
spawn:
conditions: [ ]
autospawn:
interval: -1
locations: []
totem:
enabled: false
top: carved_pumpkin
middle: beacon
bottom: diamond_block
not-in-worlds: [ ]
egg:
enabled: true
item: dolphin_spawn_egg unbreaking:1 hide_enchants
name: "&9Illusioner&f Spawn Egg"
lore:
- ""
- "&8&oPlace on the ground to"
- "&8&osummon an &9Illusioner"
craftable: true
recipe:
- ""
- fermented_spider_eye 64
- ""
- fermented_spider_eye 64
- ecoitems:boss_core ? nether_star
- fermented_spider_eye 64
- ""
- fermented_spider_eye 64
- ""
commands:
spawn: [ ]
kill: [ ]
despawn: [ ]
injure: [ ]
messages:
spawn:
- message:
- ""
- "&fAn &9&lIllusioner&r&f has been spawned!"
- "&fCome fight it at &9%x%&f, &9%y%&f, &9%z%&f!"
- ""
radius: -1
kill:
- message:
- ""
- "&fThe &9&lIllusioner&r&f has been killed!"
- "&fMost Damage:"
- "&f - &9%damage_1_player%&f (%damage_1% Damage)"
- "&f - &9%damage_2_player%&f (%damage_2% Damage)"
- "&f - &9%damage_3_player%&f (%damage_3% Damage)"
- ""
radius: -1
despawn:
- message:
- ""
- "&fYou ran out of time to kill the &9&lIllusioner&r&f!"
- ""
radius: -1
injure: [ ]
sounds:
spawn:
- sound: entity_illusioner_mirror_move
pitch: 0.5
volume: 100
- sound: entity_wither_spawn
pitch: 2
volume: 100
kill:
- sound: entity_evoker_prepare_wololo
pitch: 0.8
volume: 100
- sound: entity_illusioner_prepare_blindness
pitch: 1
volume: 100
- sound: entity_wither_death
pitch: 2
volume: 100
despawn:
- sound: entity_ender_dragon_ambient
pitch: 0.6
volume: 50
- sound: entity_enderman_death
pitch: 0.8
volume: 50
injure:
- sound: entity_illusioner_cast_spell
pitch: 2
volume: 10

View File

@@ -6,30 +6,5 @@
discover-recipes: true
log-spawn-kill: true
cooldown:
in-actionbar: true
sound:
enabled: true
sound: "BLOCK_NOTE_BLOCK_PLING"
pitch: 0.5
cannot-afford:
in-actionbar: true
sound:
enabled: true
sound: "BLOCK_NOTE_BLOCK_PLING"
pitch: 0.5
cannot-afford-type:
in-actionbar: true
sound:
enabled: true
sound: "BLOCK_NOTE_BLOCK_PLING"
pitch: 0.5
point-names: # If you have point names that look ugly (eg g_souls) then you can map them to nice names to be shown to players.
example_point: "Nicely Formatted Point"
use-faster-move-trigger: true # Disable if you want move trigger to detect sub-1-block movements
raytrace-distance: 80 # The distance that alt_click should check for a location
block-item-drop-place-check: true # If the block_item_drop trigger should only fire on naturally placed blocks (prevents dupes)
autospawn:
one-boss-per-world: true # If only one boss can auto-spawn per world at once.

View File

@@ -0,0 +1,8 @@
environment:
- name: libreforge version
value: ${libreforgeVersion}
options:
resource-id: 525
bstats-id: 10635
color: "&9"

View File

@@ -1,194 +0,0 @@
chains:
- id: blind
effects:
- id: teleport
- id: potion_effect
args:
effect: blindness
level: 3
duration: 30
apply_to_player: true
- id: send_message
args:
message: "&cYou have been blinded!"
action_bar: true
- id: play_sound
args:
sound: entity_dragon_fireball_explode
pitch: 1.5
volume: 4
bosses:
- id: steel_golem
# A base mob and modifiers
# View an explanation for this system here: https://plugins.auxilor.io/all-plugins/the-entity-lookup-system
mob: iron_golem attack-damage:90 movement-speed:1.5 follow-range:16 health:1200
# Supported placeholders: %health%, %time% (formats as minutes:seconds, eg 1:56)
displayName: "&8Steel Golem &7| &c%health%♥ &7| &e%time%"
influence: 40 # The distance at which effects will be applied to players
effects: # Effects are done from the player's perspective: to treat the player as the victim, use the self_as_victim option in args
- id: run_chain
args:
chain: blind
self_as_victim: true
chance: 20
triggers:
- static_20
conditions: [ ] # Conditions to apply effects to players; useful if you don't want to affect low-level players
lifespan: 120 # The lifespan of the boss before it despawns, in seconds. Set to a massive number to disable.
defence:
preventMounts: true # If the boss shouldn't be able to get into boats, minecarts, etc
explosionImmune: true # If the boss should be immune to explosions
fireImmune: true # If the boss should be immune to fire damage
drowningImmune: true # If the boss should be immune to drowning damage
suffocationImmune: true # If the boss should be immune to suffocation
meleeDamageMultiplier: 0.8 # Incoming melee damage will be multiplied by this value. Set to 0 to render immune against melee
projectileDamageMultiplier: 0.2 # Same as melee multiplier, but for projectiles
teleportation: # Teleport every x ticks in order to avoid being caged in obsidian or similar
enabled: true # If the boss should teleport
interval: 100 # Ticks between teleportation attempts
range: 20 # The range that the boss should check for safe teleportation blocks.
rewards:
xp: # Experience will be randomly generated between these values
minimum: 30000
maximum: 60000
topDamagerCommands:
# You can specify as many ranks as you want (adding 4, 5, etc)
# You can use %player% as a placeholder for the player name
1:
- chance: 100 # As a percentage
commands:
- eco give %player% 10000
2: [ ]
3: [ ]
nearbyPlayerCommands:
# Commands to be executed for all players near the boss death location
radius: 10
# Uses the same syntax as top damager commands (chance and a list of commands, can use %player%)
commands: [ ]
# You can specify as many drops as you want, and group several drops together under one chance
drops:
- chance: 100
items:
- diamond_sword unbreaking:1 name:"Example Sword"
target:
# How the boss should choose which player to attack, choices are:
# highest_health, lowest_health, closest, random
mode: highest_health
# The distance to scan for players
range: 40
bossBar:
# If the boss should have a boss bar
enabled: true
color: white # Options: blue, green, pink, purple, red, white, yellow
style: progress # Options: progress, notched_20, notched_12, notched_10, notched_6
radius: 120 # The distance from the boss where the boss bar is visible
spawn:
# A list of conditions required for a player to be able to spawn a boss, useful to set
# minimum skill levels, etc
conditions: [ ]
autospawn:
# Spawn the boss automatically every x ticks. Picks a random location, but will only
# ever spawn in a world if there are no other bosses of that type in the world.
interval: -1 # The interval in ticks, set to -1 to disable
locations: # Add as many locations as you want
- world: world
x: 100
y: 100
z: 100
totem:
enabled: false # A spawn totem is a set of 3 blocks on top of each other to spawn a boss (like a snow golem)
top: netherite_block
middle: iron_block
bottom: magma_block
notInWorlds: [ ] # If spawn totems should be disallowed in certain worlds, specify them here
egg:
enabled: true # If the boss should have a spawn egg
item: evoker_spawn_egg unbreaking:1 hide_enchants
name: "&8Steel Golem&f Spawn Egg"
lore:
- ""
- "&8&oPlace on the ground to"
- "&8&osummon a &8Steel Golem"
craftable: true
recipe:
- iron_block
- netherite_block
- iron_block
- air
- ecoitems:boss_core ? nether_star
- air
- iron_block
- netherite_block
- iron_block
messages:
# For each category, you can add as many messages as you want, each with their own radius.
# Radius is the distance from the boss where the player will be sent the message
# Set to -1 to broadcast globally to all players online
# Supported placeholders: %x%, %y%, %z% (coordinates)
spawn:
- message:
- ""
- "&fA &8&lSteel Golem&r&f has been spawned!"
- "&fCome fight it at &8%x%&f, &8%y%&f, &8%z%&f!"
- ""
radius: -1
# Supported placeholders: %damage_<x>_player%, %damage_<X>%
# You can include as many ranks as you want - if there is no player at a certain rank,
# it will be replaced with N/A (change in lang.yml)
kill:
- message:
- ""
- "&fThe &8&lSteel Golem&r&f has been killed!"
- "&fMost Damage:"
- "&f - &8%damage_1_player%&f (%damage_1% Damage)"
- "&f - &8%damage_2_player%&f (%damage_2% Damage)"
- "&f - &8%damage_3_player%&f (%damage_3% Damage)"
- ""
radius: -1
despawn:
- message:
- ""
- "&fYou ran out of time to kill the &8&lSteel Golem&r&f!"
- ""
radius: -1
injure: [ ]
# All sounds will be played together at the same time
# A list of sounds can be found here: https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Sound.html
# Volume functions as the distance at which the sound will be heard
# Pitch is any value between 0.5 and 2
# If you don't want the vanilla mob sounds, add 'silent' as an option to the mob
sounds:
spawn:
- sound: entity_iron_golem_death
pitch: 0.8
volume: 100
- sound: entity_iron_golem_hurt
pitch: 0.5
volume: 100
- sound: entity_ender_dragon_growl
pitch: 0.5
volume: 100
kill:
- sound: entity_ender_dragon_death
pitch: 1.8
volume: 100
- sound: entity_wither_death
pitch: 1.2
volume: 100
despawn:
- sound: entity_ender_dragon_ambient
pitch: 0.5
volume: 50
- sound: entity_enderman_death
pitch: 0.5
volume: 50
injure:
- sound: entity_iron_golem_damage
pitch: 0.7
volume: 10

View File

@@ -1,9 +1,10 @@
messages:
prefix: "&9&lEcoBosses &f» "
no-permission: "&cYou don't have permission to do this!"
invalid-command: "&cUnknown subcommand!"
not-player: "&cThis command must be run by a player"
invalid-command: "&cUnknown subcommand!"
reloaded: "Reloaded!"
sent-drop: "Check console for the drop!"
specify-boss: "&cYou must specify a valid boss!"
invalid-location: "&cInvalid location!"
@@ -15,8 +16,5 @@ messages:
invalid-stone: "&cInvalid boss!"
give-success: "Gave &a%boss%&r spawn egg to &a%recipient%"
requirements-not-met: "&cYou can't spawn this boss!"
on-cooldown: "&cThis effect is on cooldown! &fTime left: &a%seconds% seconds"
cannot-afford: "&cYou can't afford to do this! &fCost: &a$$%cost%"
cannot-afford-type: "&cYou can't afford to do this! &fCost: &a%cost% %type%"
na: "N/A"

View File

@@ -0,0 +1,53 @@
name: ${pluginName}
version: ${version}
main: com.willfp.ecobosses.EcoBossesPlugin
api-version: 1.19
dependencies:
- name: eco
required: true
bootstrap: false
- name: libreforge
required: false
bootstrap: false
load-after:
- name: eco
bootstrap: false
permissions:
ecobosses.*:
description: All ecobosses permissions
default: op
children:
ecobosses.command.*: true
ecobosses.command.*:
description: All ecobosses commands
default: op
children:
ecobosses.command.ecobosses: true
ecobosses.command.reload: true
ecobosses.command.spawn: true
ecobosses.command.give: true
ecobosses.command.ecobosses:
description: Allows the use of /ecobosses
default: true
ecobosses.command.give:
description: Allows the use of /ecobosses give
default: op
ecobosses.command.spawn:
description: Allows the use of /ecobosses spawn
default: op
ecobosses.command.killall:
description: Allows the use of /ecobosses killall
default: op
ecobosses.command.reload:
description: Allows the use of /ecobosses reload
default: op

View File

@@ -1,21 +1,15 @@
name: EcoBosses
version: ${projectVersion}
name: ${pluginName}
version: ${version}
main: com.willfp.ecobosses.EcoBossesPlugin
api-version: 1.16
api-version: 1.17
authors: [Auxilor]
website: willfp.com
load: STARTUP
depend:
- eco
softdepend:
- libreforge
- LevelledMobs
- EcoSkills
- AureliumSkills
- Jobs
- mcMMO
- Vault
- ShopGUIPlus
- DeluxeSellwands
commands:
ecobosses:
@@ -55,4 +49,4 @@ permissions:
ecobosses.command.reload:
description: Allows the use of /ecobosses reload
default: op
default: op

View File

@@ -1,2 +1,5 @@
version = 8.3.0
plugin-name = EcoBosses
#libreforge-updater
#Wed May 24 14:57:58 BST 2023
kotlin.code.style=official
libreforge-version=4.16.1
version=9.15.1

Binary file not shown.

View File

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

269
gradlew vendored
View File

@@ -1,7 +1,7 @@
#!/usr/bin/env sh
#!/bin/sh
#
# Copyright 2015 the original author or authors.
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -17,67 +17,101 @@
#
##############################################################################
##
## Gradle start up script for UN*X
##
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
MAX_FD=maximum
warn () {
echo "$*"
}
} >&2
die () {
echo
echo "$*"
echo
exit 1
}
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
@@ -106,80 +140,95 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

View File

@@ -1,12 +0,0 @@
pluginManagement {
repositories {
gradlePluginPortal()
maven { url "https://repo.jpenilla.xyz/snapshots/" }
}
}
rootProject.name = 'EcoBosses'
// Core
include ':eco-core'
include ':eco-core:core-plugin'

14
settings.gradle.kts Normal file
View File

@@ -0,0 +1,14 @@
pluginManagement {
repositories {
gradlePluginPortal()
mavenLocal()
maven("https://repo.jpenilla.xyz/snapshots/")
maven("https://repo.auxilor.io/repository/maven-public/")
}
}
rootProject.name = "EcoBosses"
// Core
include(":eco-core")
include(":eco-core:core-plugin")