Compare commits

..

129 Commits

Author SHA1 Message Date
0edf11975e Fixup 2023-01-14 17:28:48 +01:00
9295bbfdae Separate workflows between PRs and pushes 2023-01-14 17:18:34 +01:00
00722bc463 Reduce /plot home overhead (#3921)
* Add JFR events

* Replace global connected plots cache with local cache

* Simplify isOwner check

* Avoid extensive hashing of plots

* Clear caches in more cases

* Revert "Add JFR events"

This reverts commit 78c107f1
2023-01-14 00:27:09 +01:00
6a34a1996f Update dependency com.intellectualsites.bom:bom-1.18.x to v1.22 (#3918)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-13 22:28:58 +01:00
1d201b04ba chore: Update a few deprecations (#3913) 2023-01-13 17:48:13 +01:00
e887a59158 Officially deprecated BukkitPlayer#BukkitPlayer() (#3922)
* Officially deprecated BukkitPlayer#BukkitPlayer()

* Address review feedback
2023-01-12 10:03:11 +01:00
d1b8f652a7 Update dependency org.junit.jupiter:junit-jupiter to v5.9.2 (#3923)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-11 22:16:12 +01:00
4aa7bc51bc Include missing javadoc option 2023-01-11 22:11:11 +01:00
0f0030916f Add source documentation to javadocs and add dependency tab (#3917)
Get the most out of javadocs
2023-01-11 18:25:51 +01:00
bbf1e4fe61 Back to snapshot for development 2023-01-09 15:53:19 +01:00
febac6fa40 Release 6.10.8 2023-01-09 15:43:51 +01:00
99ee8a780d Back to snapshot for development 2023-01-09 15:40:32 +01:00
577a0d8ed9 Unstage 6.10.7 2023-01-09 15:28:31 +01:00
02ae14894a Stage 6.10.7 2023-01-09 15:23:50 +01:00
78dbe7fbbc Back to snapshot for development 2023-01-09 11:41:59 +01:00
669293566b Release 6.10.6 2023-01-09 11:41:12 +01:00
707c7be5bd Remove unused editorconfig rules (#3915) 2023-01-09 10:26:05 +01:00
becd8c4eaf Replace licenser with spotless (#3914) 2023-01-08 23:16:40 +01:00
339ca8e30f Fix wrong plot id calculation for negative coordinates (#3898) 2023-01-04 12:35:12 +01:00
742d78a505 Add 1.19.3 to the issue template 2022-12-23 13:41:58 +01:00
120bf37196 Fix dispensers loading Legacy Material Support (#3894)
Fixes https://github.com/IntellectualSites/PlotSquared/issues/3883
2022-12-23 09:08:38 +00:00
2a40a6b35e Update dependency com.intellectualsites.bom:bom-1.18.x to v1.21 (#3890)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-12-13 22:45:51 +01:00
ea1f35b45a Update dependency cloud.commandframework:cloud-services to v1.8.0 (#3891)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-12-13 22:44:29 +01:00
15e63378a7 Update worldedit to v7.2.13 (#3889)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-12-11 08:39:32 +01:00
f3bc504a6f refactor: adjust specific Nullable annotations used (#3869) 2022-12-02 12:39:38 +00:00
3a8fae47a0 Update dependency com.intellectualsites.bom:bom-1.18.x to v1.20 (#3882)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-11-28 15:23:44 +01:00
70cb1cd100 Back to snapshot for development 2022-11-28 11:18:56 +01:00
2067cc1670 Release 6.10.5 2022-11-28 11:18:06 +01:00
e6338976dd Update dependency gradle to v7.6 (#3880)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-11-25 19:20:37 +01:00
90ebd5d5ed feat: add a permission to override-allow a merge if the other plot's owner is offline (#3844) 2022-11-25 10:48:33 +00:00
c973ee8649 Revert "feat: check merge limits when completing auto-merge (#3868)" - Fixes a bug in 6.10.4 (#3876)
Revert "feat: check merge limits when completing auto-merge (#3868)"

This reverts commit 25ce7a83f1.
2022-11-20 10:58:04 +01:00
c1543f034c feat: improve handling of null issues in plot analysis (#3867) 2022-11-17 17:23:44 +00:00
6baf339ecb Update dependency com.intellectualsites.bom:bom-1.18.x to v1.19 (#3874)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-11-16 18:35:03 +01:00
11906ef1c9 Back to snapshot for development 2022-11-16 11:30:23 +01:00
ee8902154a Release 6.10.4 2022-11-16 11:26:03 +01:00
b5bc1988e5 feature: implement road flags as widely as seems reasonable (#3870)
* feature: implement road flags as widely as seems reasonable
 - Closes #3047
 - Any further road flag implementations would be very specific from what I can gather, and thus the gist of #3047 is now implemented

* Add javadoc since tag

Co-authored-by: Alexander Brandes <mc.cache@web.de>

* Create util class for method

Co-authored-by: Alexander Brandes <mc.cache@web.de>
2022-11-15 19:07:38 +01:00
2147012beb chore: deprecate paper 1.13 listener as P2 effectively doesn't support 1.13 (#3872) 2022-11-14 22:58:05 +01:00
52bb561689 fix: attempt to recover from IllegalStateException when restoring block tags (#3838)
- Fixes #3801
2022-11-14 16:47:24 +01:00
25ce7a83f1 feat: check merge limits when completing auto-merge (#3868)
- Closes #3748
2022-11-13 11:57:41 +01:00
55c8a590e7 Fix item thrower/owner can be null (#3866)
fix: item thrower/owner can be nuill
 - Fixes #3862
2022-11-12 17:10:21 +01:00
28bd993680 Update dependency com.intellectualsites.bom:bom-1.18.x to v1.18 (#3864)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-11-06 11:13:29 +01:00
8330f37d8a Back to snapshot for development 2022-11-02 09:35:57 +01:00
985fae65b6 ÂRelease 6.10.3 2022-11-02 09:34:33 +01:00
db2d590e8e fix: account for mismatched road-schematic heights (#3854) 2022-10-23 21:22:21 +02:00
c8d356783a Update dependency com.intellectualsites.bom:bom-1.18.x to v1.17 (#3853)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-10-20 10:23:56 +02:00
4947450ff0 Back to snapshot for development 2022-10-18 23:14:03 +02:00
de4e91ff62 Release 6.10.2 2022-10-18 23:12:27 +02:00
fe5e3d5f6d Annotate ExpireManager with @Inject (#3852)
fix: annotate ExpireManager with @Inject
2022-10-18 10:17:34 +02:00
b8b3098022 feat: Move ExpireManager to Guice by removing legacy IMP references (#3845)
* feat: Move ExpireManager to Guice by removing legacy IMP references

* Mark ExpireManager IMP as deprecated and add comments

* Add import for PlotPlatform for function reference

* Add ExpireManager instance call and optimize performance
2022-10-17 09:31:48 +02:00
0ae8fc46b8 Update dependency com.github.spotbugs:spotbugs-annotations to v4.7.3 (#3851)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-10-17 09:24:42 +02:00
e0762f63a8 chore: Replace paper reference in favor of bom 2022-10-15 16:04:30 +02:00
9f3850000c fix: adjust nullability checks for shulkers in the kill road mobs task (#3842)
- Fixes #3789
2022-10-15 15:26:14 +02:00
76c6be9ba7 Fix 'No resource for locale 'lang' found ' error (#3830)
* Fix #3820

* Reword message and add link to completed translations

* Fix #3820

* Reword message and add link to completed translations

* Add line breaks for better code readability

* Add line breaks for better code readability

Co-authored-by: Alexander Brandes <mc.cache@web.de>
2022-10-13 19:19:20 +02:00
308a5aa781 Ensure all setBlock methods in BlockArrayCacheScopedQueueCoordinator apply the correct offset (#3843)
- Fixes #3783
2022-10-13 19:17:27 +02:00
e244527538 Make more complex patterns work correctly (#3847)
allow more complex patterns to work correctly
2022-10-13 19:16:19 +02:00
11dd013333 fix: Adjust schematic height logic when pasting and actually set air as well (#3840) 2022-10-13 16:46:29 +01:00
b740d5854c Support MiniMessage in plot-title flag (#3835) 2022-10-10 17:41:35 +01:00
d5445cfbef Don't kill owned road entities (leashed / named) (#3829) 2022-10-10 17:41:25 +01:00
3effaefda7 chore: Announce releases on Discord (#3839) 2022-10-09 16:40:51 +02:00
49b19e0eaf Check proper locations on PortalCreateEvent (#3834)
check proper locations on PortalCreateEvent
2022-10-08 15:13:11 +02:00
caef3a923b Deprecate PlotId#copy (#3821) 2022-10-08 14:11:16 +01:00
d4c3ceaf2b Move license into jar during compile process (#3826) 2022-10-08 14:10:57 +01:00
25e6aecf13 Update dependency com.intellectualsites.bom:bom-1.18.x to v1.16 (#3825)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-10-04 22:54:56 +02:00
33c11fdee9 Back to snapshot for development 2022-10-04 19:31:27 +02:00
316dd92667 Release 6.10.1 2022-10-04 19:30:44 +02:00
e53d2ac449 Update the plot sign when a plot has been purchased (#3822) 2022-10-03 21:51:17 +02:00
5786e8cc7a refactor: replace guava's Iterables with Java's stream API (#3823) 2022-10-03 21:51:05 +02:00
1b717c9b10 Only show visible players in /plot near (#3819)
feat: check visibility of player in `/plot near`
2022-10-03 21:50:41 +02:00
35abae99ca Improve feedback for invalid patterns (#3818)
improve feedback for invalid patterns
2022-10-02 22:22:08 +02:00
d1a85982fb Fix "set block timer" error after "/plot download" with legacy-webinterface setting (#3812)
Add missing `Plot.removeRunning` call to Download
2022-10-01 11:37:24 +02:00
3446b913cd plots.auto.mega fix for #3815 (#3816)
Co-authored-by: Resi <unconfigured@null.spigotmc.org>
2022-09-28 10:53:44 +02:00
8b8fd6aab7 Update dependency com.intellectualsites.bom:bom-1.18.x to v1.15 (#3809)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-09-22 22:26:11 +02:00
520bb64eca Back to snapshot for development 2022-09-21 16:29:17 +02:00
60d266b2d7 Release 6.10.0 2022-09-21 16:28:17 +02:00
8deeef4f7d Add allay to animals (#3788)
add allay to animals
2022-09-21 16:18:34 +02:00
9b0b071c0c Add GLOW_BERRIES to VineGrowFlag (#3803) 2022-09-21 16:18:18 +02:00
81a3f1098d Update dependency org.junit.jupiter:junit-jupiter to v5.9.1 (#3807)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-09-21 16:18:08 +02:00
efc248dcdb Update dependency com.intellectualsites.bom:bom-1.18.x to v1.14 (#3794)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-09-12 11:19:07 +02:00
476f3d328d feature: add flag for beacon effects of other plots (#3627)
* feature: add flag for beacon effects of other plots

Took 7 minutes

* fix: don't add the beacon effect flag if the platform is not paper

Took 2 minutes

* fix: creating consistency in documentation

Took 7 minutes

* feature: add global paper setting for the beacon-effect

* fix: description of the plot flag and rewrite of the listener

* fix: renamed flag and added road support

* fix: renamed flag and changed flag functionality

* fix: added spigot fallback listener and fixed NPE

* refactor: Address checkstyle violations

* addition: remove beacon effects when player leaves a plot

* fix: updated javadoc and fixed usage of the PlotListener#addEffect method

* chore: Run license updater

Co-authored-by: BuildTools <unconfigured@null.spigotmc.org>
Co-authored-by: Alexander Brandes <mc.cache@web.de>
2022-09-05 20:06:37 +02:00
69f5f88183 Update dependency com.github.spotbugs:spotbugs-annotations to v4.7.2 (#3793)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-09-05 09:40:41 +02:00
6df63f7fc7 Invoke -parameters on compile time (#3787)
chore: Invoke -parameters on compile time
2022-09-03 12:55:55 +02:00
295b8a0135 Update dependency cloud.commandframework:cloud-services to v1.7.1 (#3784)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-08-27 09:32:40 +02:00
fcc5bc5473 Update dependency net.essentialsx:EssentialsX to v2.19.7 (#3780)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-08-24 09:56:33 +02:00
408b834376 [ci skip] chore: Add renovate schema URL 2022-08-20 15:31:51 +02:00
986812b9e4 chore: make snow set more future-proof (#3768) 2022-08-19 13:41:04 +02:00
8d4333ad9d fix(deps): update dependency net.essentialsx:essentialsx to v2.19.6 (#3770)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-08-13 10:12:05 +02:00
9ff9097ff9 fix(deps): update dependency net.essentialsx:essentialsx to v2.19.5 (#3767)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-08-12 14:13:42 +02:00
1ef424a2f1 fix(deps): update dependency com.intellectualsites.bom:bom-1.18.x to v1.13 (#3766)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-08-10 16:52:47 +02:00
9fd96dbaa2 build: Back to snapshot for development 2022-08-10 11:10:41 +02:00
b0a4e11c46 build: Release 6.9.4 2022-08-10 11:09:51 +02:00
77bce43ace fix: replace usages of snow tag (#3758)
* replace usages of snow tag

* powder snow is 1.17+
2022-08-10 11:03:20 +02:00
cba1927cc7 Items no longer despawn on road when natural_mob_spawning = true and kill-road-items = false (#3764)
* fix: handling of item despawning on road

* chore: de-duplicate check

* chore: check in PaperListener for consistency
2022-08-10 10:22:19 +02:00
3d19c5c2ad perf: avoid quadratic overhead for UUID collection (#3749)
avoid quadratic overhead for UUID collection
2022-08-08 12:50:22 +02:00
e0eff15694 fix: use correct uuid type in /grant (#3759)
use correct type
2022-08-07 21:19:01 +02:00
0bdeeea83b fix(deps): update worldedit to v7.2.12 (#3762)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-08-07 21:16:18 +02:00
6f96daae56 Update bug_report.yml 2022-08-06 13:49:25 +02:00
d1021d19da chore(deps): update dependency gradle to v7.5.1 (#3761)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-08-06 13:49:01 +02:00
ee589ac7f0 fix(deps): update worldedit to v7.2.11 (#3750)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-31 15:58:38 +02:00
3b747ffecf Don't allow wall corals to dry (#3746) 2022-07-29 23:00:55 +02:00
4e5a2b9f96 fix: Add user friendly message for creationdate placeholder (#3745) 2022-07-29 23:00:37 +02:00
aeb4350ccb Update bug_report.yml 2022-07-29 19:01:35 +02:00
9609990832 build: Update dependency com.intellectualsites.bom:bom-1.18.x to v1.12 (#3739)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-26 22:47:51 +02:00
0e4319b757 build: Update dependency org.junit.jupiter:junit-jupiter to v5.9.0 (#3741)
* build: Update dependency org.junit.jupiter:junit-jupiter to v5.9.0

* Update renovate.json

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Alexander Brandes <mc.cache@web.de>
2022-07-26 22:47:25 +02:00
c8f4907f77 build: Back to snapshot for development 2022-07-25 21:11:35 +02:00
dcf98c2298 build: Release 6.9.3 2022-07-25 21:10:39 +02:00
ae59c7442f fix: improve handling of missing message files (#3718)
* improve handling of missing message files

* fix javadoc

Co-authored-by: Alexander Brandes <mc.cache@web.de>
2022-07-25 21:02:54 +02:00
98708118d8 Deprecate the static Permissions "util" class that is almost entirely superseded by methods in PermissionHolder instances themselves (#3695)
Co-authored-by: Alexander Brandes <mc.cache@web.de>
2022-07-24 15:55:43 +02:00
276d8f8e1e change message of /p remove <player> if player does not need to be removed (#3734)
refactor: change message of `/p remove <player>` if unnecessary
2022-07-24 10:32:29 +02:00
87f89541b5 build: Update dependency com.intellectualsites.bom:bom-1.18.x to v1.11 (#3726)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-15 10:04:01 +02:00
93f6de7029 build: Update dependency gradle to v7.5 (#3727)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-15 10:03:27 +02:00
73d2686b17 build: Update dependency com.intellectualsites.bom:bom-1.18.x to v1.10 (#3723)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-06 00:14:20 +02:00
c446a95b07 build: Back to snapshot for development 2022-07-05 22:26:52 +02:00
3676e1df35 build: Release 6.9.2 2022-07-05 22:25:57 +02:00
12e2705260 Revert #3681 (#3722)
Revert "Adjust schematic height logic when pasting and actually set air as well (#3681)"

This reverts commit 08ce4c872c.
2022-07-05 15:02:25 +02:00
31e777a03a build: Update dependency me.clip:placeholderapi to v2.11.2 (#3720)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-07-04 14:07:14 +02:00
7f436c405b fix: Don't fail post processing compilation on non-ascii charmap (#3719) 2022-07-03 14:58:17 +02:00
4d4d2ab087 Ignore cancelled projectile launch events (#3709) 2022-06-28 21:15:09 +02:00
91017acce4 Realistically only need the "highest" y level of adding overlay block errors 2022-06-27 17:41:47 +01:00
e90fd231d9 build: Update dependency com.github.spotbugs:spotbugs-annotations to v4.7.1 (#3714)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2022-06-27 17:00:13 +02:00
cd9f0789de build: Update bom to 1.9 2022-06-27 16:47:32 +02:00
5f4c8d92df build: Back to snapshot for development 2022-06-27 14:57:32 +02:00
263cb47a21 build: Release 6.9.1 2022-06-27 14:56:44 +02:00
005600c99e Show old flag value in remove command (#3711) 2022-06-27 13:31:45 +02:00
26bec7fe2f style: Address javadoc violations 2022-06-26 11:18:33 +02:00
f4b886d977 Minor cleanup of the plot analyze code (#3708)
- No need to wrap the final analysis into another async method. It's already contained in an async task
 - Don't overstretch a chunk bounday when setting blocks to newBlocks array
2022-06-23 19:18:29 +02:00
c09d0d882e Use single PlotListener instance (#3704) 2022-06-22 12:50:56 +01:00
312cb2996c Better handling of offline projectile shooters (#3705) 2022-06-22 12:50:46 +01:00
f218902581 Implement build height limits into more events (#3691)
* Implement build height limits into more events

* Implement util method to check if y is within world build limits

* Extract duplicate player-build-height-checking to plot area
 - Extract to core module to allow any possible future platforms to access the method, as they will always duplicate

* Add code tag to javadoc

Co-authored-by: Alexander Brandes <mc.cache@web.de>

Co-authored-by: Alexander Brandes <mc.cache@web.de>
2022-06-21 19:09:29 +02:00
f27009216c chore: Replace AnnotationHelper class (#3706) 2022-06-21 19:09:17 +02:00
116 changed files with 1218 additions and 1912 deletions

View File

@ -13,40 +13,6 @@ ij_formatter_tags_enabled = false
ij_smart_tabs = false ij_smart_tabs = false
ij_wrap_on_typing = true ij_wrap_on_typing = true
[*.conf]
indent_size = 2
tab_width = 2
ij_continuation_indent_size = 2
ij_hocon_keep_blank_lines_before_right_brace = 2
ij_hocon_keep_indents_on_empty_lines = false
ij_hocon_keep_line_breaks = true
ij_hocon_space_after_colon = true
ij_hocon_space_after_comma = true
ij_hocon_space_before_colon = true
ij_hocon_space_before_comma = false
ij_hocon_spaces_within_braces = false
ij_hocon_spaces_within_brackets = false
ij_hocon_spaces_within_method_call_parentheses = false
[*.css]
ij_css_align_closing_brace_with_properties = false
ij_css_blank_lines_around_nested_selector = 1
ij_css_blank_lines_between_blocks = 1
ij_css_brace_placement = end_of_line
ij_css_enforce_quotes_on_format = false
ij_css_hex_color_long_format = false
ij_css_hex_color_lower_case = false
ij_css_hex_color_short_format = false
ij_css_hex_color_upper_case = false
ij_css_keep_blank_lines_in_code = 2
ij_css_keep_indents_on_empty_lines = false
ij_css_keep_single_line_blocks = false
ij_css_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow
ij_css_space_after_colon = true
ij_css_space_before_opening_brace = true
ij_css_use_double_quotes = true
ij_css_value_alignment = do_not_align
[*.java] [*.java]
ij_java_align_consecutive_assignments = false ij_java_align_consecutive_assignments = false
ij_java_align_consecutive_variable_declarations = false ij_java_align_consecutive_variable_declarations = false
@ -277,63 +243,12 @@ ij_java_wrap_comments = false
ij_java_wrap_first_method_in_call_chain = true ij_java_wrap_first_method_in_call_chain = true
ij_java_wrap_long_lines = false ij_java_wrap_long_lines = false
[*.nbtt]
max_line_length = 150
ij_continuation_indent_size = 4
ij_nbtt_keep_indents_on_empty_lines = false
ij_nbtt_space_after_colon = true
ij_nbtt_space_after_comma = true
ij_nbtt_space_before_colon = true
ij_nbtt_space_before_comma = false
ij_nbtt_spaces_within_brackets = false
ij_nbtt_spaces_within_parentheses = false
[*.properties] [*.properties]
ij_properties_align_group_field_declarations = false ij_properties_align_group_field_declarations = false
ij_properties_keep_blank_lines = false ij_properties_keep_blank_lines = false
ij_properties_key_value_delimiter = equals ij_properties_key_value_delimiter = equals
ij_properties_spaces_around_key_value_delimiter = false ij_properties_spaces_around_key_value_delimiter = false
[*.sass]
indent_size = 2
ij_sass_align_closing_brace_with_properties = false
ij_sass_blank_lines_around_nested_selector = 1
ij_sass_blank_lines_between_blocks = 1
ij_sass_brace_placement = 0
ij_sass_enforce_quotes_on_format = false
ij_sass_hex_color_long_format = false
ij_sass_hex_color_lower_case = false
ij_sass_hex_color_short_format = false
ij_sass_hex_color_upper_case = false
ij_sass_keep_blank_lines_in_code = 2
ij_sass_keep_indents_on_empty_lines = false
ij_sass_keep_single_line_blocks = false
ij_sass_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow
ij_sass_space_after_colon = true
ij_sass_space_before_opening_brace = true
ij_sass_use_double_quotes = true
ij_sass_value_alignment = 0
[*.scss]
indent_size = 2
ij_scss_align_closing_brace_with_properties = false
ij_scss_blank_lines_around_nested_selector = 1
ij_scss_blank_lines_between_blocks = 1
ij_scss_brace_placement = 0
ij_scss_enforce_quotes_on_format = false
ij_scss_hex_color_long_format = false
ij_scss_hex_color_lower_case = false
ij_scss_hex_color_short_format = false
ij_scss_hex_color_upper_case = false
ij_scss_keep_blank_lines_in_code = 2
ij_scss_keep_indents_on_empty_lines = false
ij_scss_keep_single_line_blocks = false
ij_scss_properties_order = font, font-family, font-size, font-weight, font-style, font-variant, font-size-adjust, font-stretch, line-height, position, z-index, top, right, bottom, left, display, visibility, float, clear, overflow, overflow-x, overflow-y, clip, zoom, align-content, align-items, align-self, flex, flex-flow, flex-basis, flex-direction, flex-grow, flex-shrink, flex-wrap, justify-content, order, box-sizing, width, min-width, max-width, height, min-height, max-height, margin, margin-top, margin-right, margin-bottom, margin-left, padding, padding-top, padding-right, padding-bottom, padding-left, table-layout, empty-cells, caption-side, border-spacing, border-collapse, list-style, list-style-position, list-style-type, list-style-image, content, quotes, counter-reset, counter-increment, resize, cursor, user-select, nav-index, nav-up, nav-right, nav-down, nav-left, transition, transition-delay, transition-timing-function, transition-duration, transition-property, transform, transform-origin, animation, animation-name, animation-duration, animation-play-state, animation-timing-function, animation-delay, animation-iteration-count, animation-direction, text-align, text-align-last, vertical-align, white-space, text-decoration, text-emphasis, text-emphasis-color, text-emphasis-style, text-emphasis-position, text-indent, text-justify, letter-spacing, word-spacing, text-outline, text-transform, text-wrap, text-overflow, text-overflow-ellipsis, text-overflow-mode, word-wrap, word-break, tab-size, hyphens, pointer-events, opacity, color, border, border-width, border-style, border-color, border-top, border-top-width, border-top-style, border-top-color, border-right, border-right-width, border-right-style, border-right-color, border-bottom, border-bottom-width, border-bottom-style, border-bottom-color, border-left, border-left-width, border-left-style, border-left-color, border-radius, border-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radius, border-image, border-image-source, border-image-slice, border-image-width, border-image-outset, border-image-repeat, outline, outline-width, outline-style, outline-color, outline-offset, background, background-color, background-image, background-repeat, background-attachment, background-position, background-position-x, background-position-y, background-clip, background-origin, background-size, box-decoration-break, box-shadow, text-shadow
ij_scss_space_after_colon = true
ij_scss_space_before_opening_brace = true
ij_scss_use_double_quotes = true
ij_scss_value_alignment = 0
[.editorconfig] [.editorconfig]
ij_editorconfig_align_group_field_declarations = false ij_editorconfig_align_group_field_declarations = false
ij_editorconfig_space_after_colon = false ij_editorconfig_space_after_colon = false
@ -342,548 +257,6 @@ ij_editorconfig_space_before_colon = false
ij_editorconfig_space_before_comma = false ij_editorconfig_space_before_comma = false
ij_editorconfig_spaces_around_assignment_operators = true ij_editorconfig_spaces_around_assignment_operators = true
[{*.ant, *.fxml, *.jhm, *.jnlp, *.jrxml, *.pom, *.rng, *.tld, *.wsdl, *.xml, *.xsd, *.xsl, *.xslt, *.xul}]
ij_xml_align_attributes = true
ij_xml_align_text = false
ij_xml_attribute_wrap = normal
ij_xml_block_comment_at_first_column = true
ij_xml_keep_blank_lines = 2
ij_xml_keep_indents_on_empty_lines = false
ij_xml_keep_line_breaks = true
ij_xml_keep_line_breaks_in_text = true
ij_xml_keep_whitespaces = false
ij_xml_keep_whitespaces_around_cdata = preserve
ij_xml_keep_whitespaces_inside_cdata = false
ij_xml_line_comment_at_first_column = true
ij_xml_space_after_tag_name = false
ij_xml_space_around_equals_in_attribute = false
ij_xml_space_inside_empty_tag = false
ij_xml_text_wrap = normal
[{*.ats, *.ts}]
ij_continuation_indent_size = 4
ij_typescript_align_imports = false
ij_typescript_align_multiline_array_initializer_expression = false
ij_typescript_align_multiline_binary_operation = false
ij_typescript_align_multiline_chained_methods = false
ij_typescript_align_multiline_extends_list = false
ij_typescript_align_multiline_for = true
ij_typescript_align_multiline_parameters = true
ij_typescript_align_multiline_parameters_in_calls = false
ij_typescript_align_multiline_ternary_operation = false
ij_typescript_align_object_properties = 0
ij_typescript_align_union_types = false
ij_typescript_align_var_statements = 0
ij_typescript_array_initializer_new_line_after_left_brace = false
ij_typescript_array_initializer_right_brace_on_new_line = false
ij_typescript_array_initializer_wrap = off
ij_typescript_assignment_wrap = off
ij_typescript_binary_operation_sign_on_next_line = false
ij_typescript_binary_operation_wrap = off
ij_typescript_blacklist_imports = rxjs/Rx, node_modules/**, **/node_modules/**, @angular/material, @angular/material/typings/**
ij_typescript_blank_lines_after_imports = 1
ij_typescript_blank_lines_around_class = 1
ij_typescript_blank_lines_around_field = 0
ij_typescript_blank_lines_around_field_in_interface = 0
ij_typescript_blank_lines_around_function = 1
ij_typescript_blank_lines_around_method = 1
ij_typescript_blank_lines_around_method_in_interface = 1
ij_typescript_block_brace_style = end_of_line
ij_typescript_call_parameters_new_line_after_left_paren = false
ij_typescript_call_parameters_right_paren_on_new_line = false
ij_typescript_call_parameters_wrap = off
ij_typescript_catch_on_new_line = false
ij_typescript_chained_call_dot_on_new_line = true
ij_typescript_class_brace_style = end_of_line
ij_typescript_comma_on_new_line = false
ij_typescript_do_while_brace_force = never
ij_typescript_else_on_new_line = false
ij_typescript_enforce_trailing_comma = keep
ij_typescript_extends_keyword_wrap = off
ij_typescript_extends_list_wrap = off
ij_typescript_field_prefix = _
ij_typescript_file_name_style = relaxed
ij_typescript_finally_on_new_line = false
ij_typescript_for_brace_force = never
ij_typescript_for_statement_new_line_after_left_paren = false
ij_typescript_for_statement_right_paren_on_new_line = false
ij_typescript_for_statement_wrap = off
ij_typescript_force_quote_style = false
ij_typescript_force_semicolon_style = false
ij_typescript_function_expression_brace_style = end_of_line
ij_typescript_if_brace_force = never
ij_typescript_import_merge_members = global
ij_typescript_import_prefer_absolute_path = global
ij_typescript_import_sort_members = true
ij_typescript_import_sort_module_name = false
ij_typescript_import_use_node_resolution = true
ij_typescript_imports_wrap = on_every_item
ij_typescript_indent_case_from_switch = true
ij_typescript_indent_chained_calls = true
ij_typescript_indent_package_children = 0
ij_typescript_jsdoc_include_types = false
ij_typescript_jsx_attribute_value = braces
ij_typescript_keep_blank_lines_in_code = 2
ij_typescript_keep_first_column_comment = true
ij_typescript_keep_indents_on_empty_lines = false
ij_typescript_keep_line_breaks = true
ij_typescript_keep_simple_blocks_in_one_line = false
ij_typescript_keep_simple_methods_in_one_line = false
ij_typescript_line_comment_add_space = true
ij_typescript_line_comment_at_first_column = false
ij_typescript_method_brace_style = end_of_line
ij_typescript_method_call_chain_wrap = off
ij_typescript_method_parameters_new_line_after_left_paren = false
ij_typescript_method_parameters_right_paren_on_new_line = false
ij_typescript_method_parameters_wrap = off
ij_typescript_object_literal_wrap = on_every_item
ij_typescript_parentheses_expression_new_line_after_left_paren = false
ij_typescript_parentheses_expression_right_paren_on_new_line = false
ij_typescript_place_assignment_sign_on_next_line = false
ij_typescript_prefer_as_type_cast = false
ij_typescript_prefer_explicit_types_function_expression_returns = false
ij_typescript_prefer_explicit_types_function_returns = false
ij_typescript_prefer_explicit_types_vars_fields = false
ij_typescript_prefer_parameters_wrap = false
ij_typescript_reformat_c_style_comments = false
ij_typescript_space_after_colon = true
ij_typescript_space_after_comma = true
ij_typescript_space_after_dots_in_rest_parameter = false
ij_typescript_space_after_generator_mult = true
ij_typescript_space_after_property_colon = true
ij_typescript_space_after_quest = true
ij_typescript_space_after_type_colon = true
ij_typescript_space_after_unary_not = false
ij_typescript_space_before_async_arrow_lparen = true
ij_typescript_space_before_catch_keyword = true
ij_typescript_space_before_catch_left_brace = true
ij_typescript_space_before_catch_parentheses = true
ij_typescript_space_before_class_lbrace = true
ij_typescript_space_before_class_left_brace = true
ij_typescript_space_before_colon = true
ij_typescript_space_before_comma = false
ij_typescript_space_before_do_left_brace = true
ij_typescript_space_before_else_keyword = true
ij_typescript_space_before_else_left_brace = true
ij_typescript_space_before_finally_keyword = true
ij_typescript_space_before_finally_left_brace = true
ij_typescript_space_before_for_left_brace = true
ij_typescript_space_before_for_parentheses = true
ij_typescript_space_before_for_semicolon = false
ij_typescript_space_before_function_left_parenth = true
ij_typescript_space_before_generator_mult = false
ij_typescript_space_before_if_left_brace = true
ij_typescript_space_before_if_parentheses = true
ij_typescript_space_before_method_call_parentheses = false
ij_typescript_space_before_method_left_brace = true
ij_typescript_space_before_method_parentheses = false
ij_typescript_space_before_property_colon = false
ij_typescript_space_before_quest = true
ij_typescript_space_before_switch_left_brace = true
ij_typescript_space_before_switch_parentheses = true
ij_typescript_space_before_try_left_brace = true
ij_typescript_space_before_type_colon = false
ij_typescript_space_before_unary_not = false
ij_typescript_space_before_while_keyword = true
ij_typescript_space_before_while_left_brace = true
ij_typescript_space_before_while_parentheses = true
ij_typescript_spaces_around_additive_operators = true
ij_typescript_spaces_around_arrow_function_operator = true
ij_typescript_spaces_around_assignment_operators = true
ij_typescript_spaces_around_bitwise_operators = true
ij_typescript_spaces_around_equality_operators = true
ij_typescript_spaces_around_logical_operators = true
ij_typescript_spaces_around_multiplicative_operators = true
ij_typescript_spaces_around_relational_operators = true
ij_typescript_spaces_around_shift_operators = true
ij_typescript_spaces_around_unary_operator = false
ij_typescript_spaces_within_array_initializer_brackets = false
ij_typescript_spaces_within_brackets = false
ij_typescript_spaces_within_catch_parentheses = false
ij_typescript_spaces_within_for_parentheses = false
ij_typescript_spaces_within_if_parentheses = false
ij_typescript_spaces_within_imports = false
ij_typescript_spaces_within_interpolation_expressions = false
ij_typescript_spaces_within_method_call_parentheses = false
ij_typescript_spaces_within_method_parentheses = false
ij_typescript_spaces_within_object_literal_braces = false
ij_typescript_spaces_within_object_type_braces = true
ij_typescript_spaces_within_parentheses = false
ij_typescript_spaces_within_switch_parentheses = false
ij_typescript_spaces_within_type_assertion = false
ij_typescript_spaces_within_union_types = true
ij_typescript_spaces_within_while_parentheses = false
ij_typescript_special_else_if_treatment = true
ij_typescript_ternary_operation_signs_on_next_line = false
ij_typescript_ternary_operation_wrap = off
ij_typescript_union_types_wrap = on_every_item
ij_typescript_use_chained_calls_group_indents = false
ij_typescript_use_double_quotes = true
ij_typescript_use_explicit_js_extension = global
ij_typescript_use_path_mapping = always
ij_typescript_use_public_modifier = false
ij_typescript_use_semicolon_after_statement = true
ij_typescript_var_declaration_wrap = normal
ij_typescript_while_brace_force = never
ij_typescript_while_on_new_line = false
ij_typescript_wrap_comments = false
[{*.bash, *.sh, *.zsh}]
indent_size = 2
tab_width = 2
ij_shell_binary_ops_start_line = false
ij_shell_keep_column_alignment_padding = false
ij_shell_minify_program = false
ij_shell_redirect_followed_by_space = false
ij_shell_switch_cases_indented = false
[{*.cjs, *.js}]
ij_continuation_indent_size = 4
ij_javascript_align_imports = false
ij_javascript_align_multiline_array_initializer_expression = false
ij_javascript_align_multiline_binary_operation = false
ij_javascript_align_multiline_chained_methods = false
ij_javascript_align_multiline_extends_list = false
ij_javascript_align_multiline_for = true
ij_javascript_align_multiline_parameters = true
ij_javascript_align_multiline_parameters_in_calls = false
ij_javascript_align_multiline_ternary_operation = false
ij_javascript_align_object_properties = 0
ij_javascript_align_union_types = false
ij_javascript_align_var_statements = 0
ij_javascript_array_initializer_new_line_after_left_brace = false
ij_javascript_array_initializer_right_brace_on_new_line = false
ij_javascript_array_initializer_wrap = off
ij_javascript_assignment_wrap = off
ij_javascript_binary_operation_sign_on_next_line = false
ij_javascript_binary_operation_wrap = off
ij_javascript_blacklist_imports = rxjs/Rx, node_modules/**, **/node_modules/**, @angular/material, @angular/material/typings/**
ij_javascript_blank_lines_after_imports = 1
ij_javascript_blank_lines_around_class = 1
ij_javascript_blank_lines_around_field = 0
ij_javascript_blank_lines_around_function = 1
ij_javascript_blank_lines_around_method = 1
ij_javascript_block_brace_style = end_of_line
ij_javascript_call_parameters_new_line_after_left_paren = false
ij_javascript_call_parameters_right_paren_on_new_line = false
ij_javascript_call_parameters_wrap = off
ij_javascript_catch_on_new_line = false
ij_javascript_chained_call_dot_on_new_line = true
ij_javascript_class_brace_style = end_of_line
ij_javascript_comma_on_new_line = false
ij_javascript_do_while_brace_force = never
ij_javascript_else_on_new_line = false
ij_javascript_enforce_trailing_comma = keep
ij_javascript_extends_keyword_wrap = off
ij_javascript_extends_list_wrap = off
ij_javascript_field_prefix = _
ij_javascript_file_name_style = relaxed
ij_javascript_finally_on_new_line = false
ij_javascript_for_brace_force = never
ij_javascript_for_statement_new_line_after_left_paren = false
ij_javascript_for_statement_right_paren_on_new_line = false
ij_javascript_for_statement_wrap = off
ij_javascript_force_quote_style = false
ij_javascript_force_semicolon_style = false
ij_javascript_function_expression_brace_style = end_of_line
ij_javascript_if_brace_force = never
ij_javascript_import_merge_members = global
ij_javascript_import_prefer_absolute_path = global
ij_javascript_import_sort_members = true
ij_javascript_import_sort_module_name = false
ij_javascript_import_use_node_resolution = true
ij_javascript_imports_wrap = on_every_item
ij_javascript_indent_case_from_switch = true
ij_javascript_indent_chained_calls = true
ij_javascript_indent_package_children = 0
ij_javascript_jsx_attribute_value = braces
ij_javascript_keep_blank_lines_in_code = 2
ij_javascript_keep_first_column_comment = true
ij_javascript_keep_indents_on_empty_lines = false
ij_javascript_keep_line_breaks = true
ij_javascript_keep_simple_blocks_in_one_line = false
ij_javascript_keep_simple_methods_in_one_line = false
ij_javascript_line_comment_add_space = true
ij_javascript_line_comment_at_first_column = false
ij_javascript_method_brace_style = end_of_line
ij_javascript_method_call_chain_wrap = off
ij_javascript_method_parameters_new_line_after_left_paren = false
ij_javascript_method_parameters_right_paren_on_new_line = false
ij_javascript_method_parameters_wrap = off
ij_javascript_object_literal_wrap = on_every_item
ij_javascript_parentheses_expression_new_line_after_left_paren = false
ij_javascript_parentheses_expression_right_paren_on_new_line = false
ij_javascript_place_assignment_sign_on_next_line = false
ij_javascript_prefer_as_type_cast = false
ij_javascript_prefer_explicit_types_function_expression_returns = false
ij_javascript_prefer_explicit_types_function_returns = false
ij_javascript_prefer_explicit_types_vars_fields = false
ij_javascript_prefer_parameters_wrap = false
ij_javascript_reformat_c_style_comments = false
ij_javascript_space_after_colon = true
ij_javascript_space_after_comma = true
ij_javascript_space_after_dots_in_rest_parameter = false
ij_javascript_space_after_generator_mult = true
ij_javascript_space_after_property_colon = true
ij_javascript_space_after_quest = true
ij_javascript_space_after_type_colon = true
ij_javascript_space_after_unary_not = false
ij_javascript_space_before_async_arrow_lparen = true
ij_javascript_space_before_catch_keyword = true
ij_javascript_space_before_catch_left_brace = true
ij_javascript_space_before_catch_parentheses = true
ij_javascript_space_before_class_lbrace = true
ij_javascript_space_before_class_left_brace = true
ij_javascript_space_before_colon = true
ij_javascript_space_before_comma = false
ij_javascript_space_before_do_left_brace = true
ij_javascript_space_before_else_keyword = true
ij_javascript_space_before_else_left_brace = true
ij_javascript_space_before_finally_keyword = true
ij_javascript_space_before_finally_left_brace = true
ij_javascript_space_before_for_left_brace = true
ij_javascript_space_before_for_parentheses = true
ij_javascript_space_before_for_semicolon = false
ij_javascript_space_before_function_left_parenth = true
ij_javascript_space_before_generator_mult = false
ij_javascript_space_before_if_left_brace = true
ij_javascript_space_before_if_parentheses = true
ij_javascript_space_before_method_call_parentheses = false
ij_javascript_space_before_method_left_brace = true
ij_javascript_space_before_method_parentheses = false
ij_javascript_space_before_property_colon = false
ij_javascript_space_before_quest = true
ij_javascript_space_before_switch_left_brace = true
ij_javascript_space_before_switch_parentheses = true
ij_javascript_space_before_try_left_brace = true
ij_javascript_space_before_type_colon = false
ij_javascript_space_before_unary_not = false
ij_javascript_space_before_while_keyword = true
ij_javascript_space_before_while_left_brace = true
ij_javascript_space_before_while_parentheses = true
ij_javascript_spaces_around_additive_operators = true
ij_javascript_spaces_around_arrow_function_operator = true
ij_javascript_spaces_around_assignment_operators = true
ij_javascript_spaces_around_bitwise_operators = true
ij_javascript_spaces_around_equality_operators = true
ij_javascript_spaces_around_logical_operators = true
ij_javascript_spaces_around_multiplicative_operators = true
ij_javascript_spaces_around_relational_operators = true
ij_javascript_spaces_around_shift_operators = true
ij_javascript_spaces_around_unary_operator = false
ij_javascript_spaces_within_array_initializer_brackets = false
ij_javascript_spaces_within_brackets = false
ij_javascript_spaces_within_catch_parentheses = false
ij_javascript_spaces_within_for_parentheses = false
ij_javascript_spaces_within_if_parentheses = false
ij_javascript_spaces_within_imports = false
ij_javascript_spaces_within_interpolation_expressions = false
ij_javascript_spaces_within_method_call_parentheses = false
ij_javascript_spaces_within_method_parentheses = false
ij_javascript_spaces_within_object_literal_braces = false
ij_javascript_spaces_within_object_type_braces = true
ij_javascript_spaces_within_parentheses = false
ij_javascript_spaces_within_switch_parentheses = false
ij_javascript_spaces_within_type_assertion = false
ij_javascript_spaces_within_union_types = true
ij_javascript_spaces_within_while_parentheses = false
ij_javascript_special_else_if_treatment = true
ij_javascript_ternary_operation_signs_on_next_line = false
ij_javascript_ternary_operation_wrap = off
ij_javascript_union_types_wrap = on_every_item
ij_javascript_use_chained_calls_group_indents = false
ij_javascript_use_double_quotes = true
ij_javascript_use_explicit_js_extension = global
ij_javascript_use_path_mapping = always
ij_javascript_use_public_modifier = false
ij_javascript_use_semicolon_after_statement = true
ij_javascript_var_declaration_wrap = normal
ij_javascript_while_brace_force = never
ij_javascript_while_on_new_line = false
ij_javascript_wrap_comments = false
[{*.ft, *.vm, *.vsl}]
ij_vtl_keep_indents_on_empty_lines = false
[{*.gant, *.gradle, *.groovy, *.gy}]
ij_groovy_align_group_field_declarations = false
ij_groovy_align_multiline_array_initializer_expression = false
ij_groovy_align_multiline_assignment = false
ij_groovy_align_multiline_binary_operation = false
ij_groovy_align_multiline_chained_methods = false
ij_groovy_align_multiline_extends_list = false
ij_groovy_align_multiline_for = true
ij_groovy_align_multiline_list_or_map = true
ij_groovy_align_multiline_method_parentheses = false
ij_groovy_align_multiline_parameters = true
ij_groovy_align_multiline_parameters_in_calls = false
ij_groovy_align_multiline_resources = true
ij_groovy_align_multiline_ternary_operation = false
ij_groovy_align_multiline_throws_list = false
ij_groovy_align_named_args_in_map = true
ij_groovy_align_throws_keyword = false
ij_groovy_array_initializer_new_line_after_left_brace = false
ij_groovy_array_initializer_right_brace_on_new_line = false
ij_groovy_array_initializer_wrap = off
ij_groovy_assert_statement_wrap = off
ij_groovy_assignment_wrap = off
ij_groovy_binary_operation_wrap = off
ij_groovy_blank_lines_after_class_header = 0
ij_groovy_blank_lines_after_imports = 1
ij_groovy_blank_lines_after_package = 1
ij_groovy_blank_lines_around_class = 1
ij_groovy_blank_lines_around_field = 0
ij_groovy_blank_lines_around_field_in_interface = 0
ij_groovy_blank_lines_around_method = 1
ij_groovy_blank_lines_around_method_in_interface = 1
ij_groovy_blank_lines_before_imports = 1
ij_groovy_blank_lines_before_method_body = 0
ij_groovy_blank_lines_before_package = 0
ij_groovy_block_brace_style = end_of_line
ij_groovy_block_comment_at_first_column = true
ij_groovy_call_parameters_new_line_after_left_paren = false
ij_groovy_call_parameters_right_paren_on_new_line = false
ij_groovy_call_parameters_wrap = off
ij_groovy_catch_on_new_line = false
ij_groovy_class_annotation_wrap = split_into_lines
ij_groovy_class_brace_style = end_of_line
ij_groovy_class_count_to_use_import_on_demand = 5
ij_groovy_do_while_brace_force = never
ij_groovy_else_on_new_line = false
ij_groovy_enum_constants_wrap = off
ij_groovy_extends_keyword_wrap = off
ij_groovy_extends_list_wrap = off
ij_groovy_field_annotation_wrap = split_into_lines
ij_groovy_finally_on_new_line = false
ij_groovy_for_brace_force = never
ij_groovy_for_statement_new_line_after_left_paren = false
ij_groovy_for_statement_right_paren_on_new_line = false
ij_groovy_for_statement_wrap = off
ij_groovy_if_brace_force = never
ij_groovy_import_annotation_wrap = 2
ij_groovy_imports_layout = *, |, javax.**, java.**, |, $*
ij_groovy_indent_case_from_switch = true
ij_groovy_indent_label_blocks = true
ij_groovy_insert_inner_class_imports = false
ij_groovy_keep_blank_lines_before_right_brace = 2
ij_groovy_keep_blank_lines_in_code = 2
ij_groovy_keep_blank_lines_in_declarations = 2
ij_groovy_keep_control_statement_in_one_line = true
ij_groovy_keep_first_column_comment = true
ij_groovy_keep_indents_on_empty_lines = false
ij_groovy_keep_line_breaks = true
ij_groovy_keep_multiple_expressions_in_one_line = false
ij_groovy_keep_simple_blocks_in_one_line = false
ij_groovy_keep_simple_classes_in_one_line = true
ij_groovy_keep_simple_lambdas_in_one_line = true
ij_groovy_keep_simple_methods_in_one_line = true
ij_groovy_label_indent_absolute = false
ij_groovy_label_indent_size = 0
ij_groovy_lambda_brace_style = end_of_line
ij_groovy_layout_static_imports_separately = true
ij_groovy_line_comment_add_space = false
ij_groovy_line_comment_at_first_column = true
ij_groovy_method_annotation_wrap = split_into_lines
ij_groovy_method_brace_style = end_of_line
ij_groovy_method_call_chain_wrap = off
ij_groovy_method_parameters_new_line_after_left_paren = false
ij_groovy_method_parameters_right_paren_on_new_line = false
ij_groovy_method_parameters_wrap = off
ij_groovy_modifier_list_wrap = false
ij_groovy_names_count_to_use_import_on_demand = 3
ij_groovy_parameter_annotation_wrap = off
ij_groovy_parentheses_expression_new_line_after_left_paren = false
ij_groovy_parentheses_expression_right_paren_on_new_line = false
ij_groovy_prefer_parameters_wrap = false
ij_groovy_resource_list_new_line_after_left_paren = false
ij_groovy_resource_list_right_paren_on_new_line = false
ij_groovy_resource_list_wrap = off
ij_groovy_space_after_assert_separator = true
ij_groovy_space_after_colon = true
ij_groovy_space_after_comma = true
ij_groovy_space_after_comma_in_type_arguments = true
ij_groovy_space_after_for_semicolon = true
ij_groovy_space_after_quest = true
ij_groovy_space_after_type_cast = true
ij_groovy_space_before_annotation_parameter_list = false
ij_groovy_space_before_array_initializer_left_brace = false
ij_groovy_space_before_assert_separator = false
ij_groovy_space_before_catch_keyword = true
ij_groovy_space_before_catch_left_brace = true
ij_groovy_space_before_catch_parentheses = true
ij_groovy_space_before_class_left_brace = true
ij_groovy_space_before_closure_left_brace = true
ij_groovy_space_before_colon = true
ij_groovy_space_before_comma = false
ij_groovy_space_before_do_left_brace = true
ij_groovy_space_before_else_keyword = true
ij_groovy_space_before_else_left_brace = true
ij_groovy_space_before_finally_keyword = true
ij_groovy_space_before_finally_left_brace = true
ij_groovy_space_before_for_left_brace = true
ij_groovy_space_before_for_parentheses = true
ij_groovy_space_before_for_semicolon = false
ij_groovy_space_before_if_left_brace = true
ij_groovy_space_before_if_parentheses = true
ij_groovy_space_before_method_call_parentheses = false
ij_groovy_space_before_method_left_brace = true
ij_groovy_space_before_method_parentheses = false
ij_groovy_space_before_quest = true
ij_groovy_space_before_switch_left_brace = true
ij_groovy_space_before_switch_parentheses = true
ij_groovy_space_before_synchronized_left_brace = true
ij_groovy_space_before_synchronized_parentheses = true
ij_groovy_space_before_try_left_brace = true
ij_groovy_space_before_try_parentheses = true
ij_groovy_space_before_while_keyword = true
ij_groovy_space_before_while_left_brace = true
ij_groovy_space_before_while_parentheses = true
ij_groovy_space_in_named_argument = true
ij_groovy_space_in_named_argument_before_colon = false
ij_groovy_space_within_empty_array_initializer_braces = false
ij_groovy_space_within_empty_method_call_parentheses = false
ij_groovy_spaces_around_additive_operators = true
ij_groovy_spaces_around_assignment_operators = true
ij_groovy_spaces_around_bitwise_operators = true
ij_groovy_spaces_around_equality_operators = true
ij_groovy_spaces_around_lambda_arrow = true
ij_groovy_spaces_around_logical_operators = true
ij_groovy_spaces_around_multiplicative_operators = true
ij_groovy_spaces_around_regex_operators = true
ij_groovy_spaces_around_relational_operators = true
ij_groovy_spaces_around_shift_operators = true
ij_groovy_spaces_within_annotation_parentheses = false
ij_groovy_spaces_within_array_initializer_braces = false
ij_groovy_spaces_within_braces = true
ij_groovy_spaces_within_brackets = false
ij_groovy_spaces_within_cast_parentheses = false
ij_groovy_spaces_within_catch_parentheses = false
ij_groovy_spaces_within_for_parentheses = false
ij_groovy_spaces_within_gstring_injection_braces = false
ij_groovy_spaces_within_if_parentheses = false
ij_groovy_spaces_within_list_or_map = false
ij_groovy_spaces_within_method_call_parentheses = false
ij_groovy_spaces_within_method_parentheses = false
ij_groovy_spaces_within_parentheses = false
ij_groovy_spaces_within_switch_parentheses = false
ij_groovy_spaces_within_synchronized_parentheses = false
ij_groovy_spaces_within_try_parentheses = false
ij_groovy_spaces_within_tuple_expression = false
ij_groovy_spaces_within_while_parentheses = false
ij_groovy_special_else_if_treatment = true
ij_groovy_ternary_operation_wrap = off
ij_groovy_throws_keyword_wrap = off
ij_groovy_throws_list_wrap = off
ij_groovy_use_flying_geese_braces = false
ij_groovy_use_fq_class_names = false
ij_groovy_use_fq_class_names_in_javadoc = true
ij_groovy_use_relative_indents = false
ij_groovy_use_single_class_imports = true
ij_groovy_variable_annotation_wrap = off
ij_groovy_while_brace_force = never
ij_groovy_while_on_new_line = false
ij_groovy_wrap_long_lines = false
[{*.gradle.kts, *.kt, *.kts, *.main.kts}] [{*.gradle.kts, *.kt, *.kts, *.main.kts}]
ij_kotlin_align_in_columns_case_branch = false ij_kotlin_align_in_columns_case_branch = false
ij_kotlin_align_multiline_binary_operation = false ij_kotlin_align_multiline_binary_operation = false
@ -963,7 +336,8 @@ ij_kotlin_wrap_elvis_expressions = 1
ij_kotlin_wrap_expression_body_functions = 0 ij_kotlin_wrap_expression_body_functions = 0
ij_kotlin_wrap_first_method_in_call_chain = false ij_kotlin_wrap_first_method_in_call_chain = false
[{*.har, *.jsb2, *.jsb3, *.json, .babelrc, .eslintrc, .stylelintrc, bowerrc, jest.config, mcmod.info}]
[*.json]
indent_size = 2 indent_size = 2
ij_json_keep_blank_lines_in_code = 0 ij_json_keep_blank_lines_in_code = 0
ij_json_keep_indents_on_empty_lines = false ij_json_keep_indents_on_empty_lines = false

View File

@ -27,10 +27,12 @@ body:
description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first. description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first.
multiple: false multiple: false
options: options:
- '1.19.3'
- '1.19.2'
- '1.19.1'
- '1.19' - '1.19'
- '1.18.2' - '1.18.2'
- '1.18.1' - '1.18.1'
- '1.18'
- '1.17.1' - '1.17.1'
- '1.16.5' - '1.16.5'
validations: validations:

View File

@ -0,0 +1,25 @@
name: Announce release on discord
on:
release:
types: [published]
jobs:
send_announcement:
runs-on: ubuntu-latest
steps:
- name: send custom message with args
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
DISCORD_USERNAME: PlotSquared Release
DISCORD_AVATAR: https://raw.githubusercontent.com/IntellectualSites/Assets/main/plugins/PlotSquared/PlotSquared.png
uses: Ilshidur/action-discord@0.3.2
with:
args: |
"<@&525015541815967744> <@&679322738552471574> <@&699293353862496266>"
""
"<:plotsquared:730750385886593039> **PlotSquared ${{ github.event.release.tag_name }} has been released!**"
""
"Click here to view changelog: https://github.com/IntellectualSites/PlotSquared/releases/tag/${{ github.event.release.tag_name }}"
""
"The download is available at:"
"- Spigot: <https://www.spigotmc.org/resources/77506/>"

23
.github/workflows/build-pr.yml vendored Normal file
View File

@ -0,0 +1,23 @@
name: Build PR
on: [ pull_request ]
jobs:
build_pr:
if: github.repository_owner == 'IntellectualSites'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ ubuntu-latest, windows-latest, macos-latest ]
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v1
- name: Setup Java
uses: actions/setup-java@v3
with:
distribution: temurin
java-version: 17
- name: Clean Build
run: ./gradlew clean build

View File

@ -1,15 +1,18 @@
name: build name: build
on: [ pull_request, push ] on:
push:
branches:
- v6
jobs: jobs:
build: build:
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }} if: github.repository_owner == 'IntellectualSites'
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout Repository - name: Checkout Repository
uses: actions/checkout@v3 uses: actions/checkout@v3
- name: Validate Gradle Wrapper" - name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v1 uses: gradle/wrapper-validation-action@v1
- name: Setup Java - name: Setup Java
uses: actions/setup-java@v3 uses: actions/setup-java@v3

View File

@ -1,8 +1,6 @@
name: "CodeQL" name: "CodeQL"
on: on:
push:
branches: [ v6 ]
pull_request: pull_request:
# The branches below must be a subset of the branches above # The branches below must be a subset of the branches above
branches: [ v6 ] branches: [ v6 ]

View File

@ -24,7 +24,7 @@ dependencies {
implementation("org.bstats:bstats-bukkit") implementation("org.bstats:bstats-bukkit")
// Paper // Paper
compileOnly(libs.paper) compileOnly("io.papermc.paper:paper-api")
implementation("io.papermc:paperlib") implementation("io.papermc:paperlib")
// Plugins // Plugins
@ -50,6 +50,7 @@ dependencies {
implementation(libs.arkitektonika) implementation(libs.arkitektonika)
implementation(libs.http4j) implementation(libs.http4j)
implementation("com.intellectualsites.paster:Paster") implementation("com.intellectualsites.paster:Paster")
implementation("com.intellectualsites.informative-annotations:informative-annotations")
// Adventure // Adventure
implementation("net.kyori:adventure-platform-bukkit") implementation("net.kyori:adventure-platform-bukkit")
@ -87,6 +88,7 @@ tasks.named<ShadowJar>("shadowJar") {
relocate("javax.inject", "com.plotsquared.core.annotation.inject") relocate("javax.inject", "com.plotsquared.core.annotation.inject")
relocate("net.jcip", "com.plotsquared.core.annotations.jcip") relocate("net.jcip", "com.plotsquared.core.annotations.jcip")
relocate("edu.umd.cs.findbugs", "com.plotsquared.core.annotations.findbugs") relocate("edu.umd.cs.findbugs", "com.plotsquared.core.annotations.findbugs")
relocate("com.intellectualsites.informative-annotations", "com.plotsquared.core.annotation.informative")
// Get rid of all the libs which are 100% unused. // Get rid of all the libs which are 100% unused.
minimize() minimize()
@ -96,6 +98,7 @@ tasks.named<ShadowJar>("shadowJar") {
tasks { tasks {
withType<Javadoc> { withType<Javadoc> {
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
val opt = options as StandardJavadocDocletOptions val opt = options as StandardJavadocDocletOptions
opt.links("https://jd.papermc.io/paper/1.18/") opt.links("https://jd.papermc.io/paper/1.18/")
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString()) opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString())
@ -103,5 +106,11 @@ tasks {
opt.links("https://jd.adventure.kyori.net/api/4.9.3/") opt.links("https://jd.adventure.kyori.net/api/4.9.3/")
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/") opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
opt.links("https://checkerframework.org/api/") opt.links("https://checkerframework.org/api/")
opt.isLinkSource = true
opt.bottom(File("$rootDir/javadocfooter.html").readText())
opt.isUse = true
opt.encoding("UTF-8")
opt.keyWords()
opt.addStringOption("-since", isRelease)
} }
} }

View File

@ -36,11 +36,11 @@ import com.plotsquared.bukkit.listener.ChunkListener;
import com.plotsquared.bukkit.listener.EntityEventListener; import com.plotsquared.bukkit.listener.EntityEventListener;
import com.plotsquared.bukkit.listener.EntitySpawnListener; import com.plotsquared.bukkit.listener.EntitySpawnListener;
import com.plotsquared.bukkit.listener.PaperListener; import com.plotsquared.bukkit.listener.PaperListener;
import com.plotsquared.bukkit.listener.PaperListener113;
import com.plotsquared.bukkit.listener.PlayerEventListener; import com.plotsquared.bukkit.listener.PlayerEventListener;
import com.plotsquared.bukkit.listener.ProjectileEventListener; import com.plotsquared.bukkit.listener.ProjectileEventListener;
import com.plotsquared.bukkit.listener.ServerListener; import com.plotsquared.bukkit.listener.ServerListener;
import com.plotsquared.bukkit.listener.SingleWorldListener; import com.plotsquared.bukkit.listener.SingleWorldListener;
import com.plotsquared.bukkit.listener.SpigotListener;
import com.plotsquared.bukkit.listener.WorldEvents; import com.plotsquared.bukkit.listener.WorldEvents;
import com.plotsquared.bukkit.placeholder.PAPIPlaceholders; import com.plotsquared.bukkit.placeholder.PAPIPlaceholders;
import com.plotsquared.bukkit.placeholder.PlaceholderFormatter; import com.plotsquared.bukkit.placeholder.PlaceholderFormatter;
@ -109,11 +109,11 @@ import com.plotsquared.core.uuid.CacheUUIDService;
import com.plotsquared.core.uuid.UUIDPipeline; import com.plotsquared.core.uuid.UUIDPipeline;
import com.plotsquared.core.uuid.offline.OfflineModeUUIDService; import com.plotsquared.core.uuid.offline.OfflineModeUUIDService;
import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.internal.util.LogManagerCompat;
import io.papermc.lib.PaperLib; import io.papermc.lib.PaperLib;
import net.kyori.adventure.audience.Audience; import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.bstats.bukkit.Metrics; import org.bstats.bukkit.Metrics;
import org.bstats.charts.DrilldownPie; import org.bstats.charts.DrilldownPie;
@ -165,7 +165,7 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass;
@Singleton @Singleton
public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPlatform<Player> { public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPlatform<Player> {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BukkitPlatform.class.getSimpleName());
private static final int BSTATS_ID = 1404; private static final int BSTATS_ID = 1404;
static { static {
@ -355,11 +355,9 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
getServer().getPluginManager().registerEvents(injector().getInstance(ServerListener.class), this); getServer().getPluginManager().registerEvents(injector().getInstance(ServerListener.class), this);
getServer().getPluginManager().registerEvents(injector().getInstance(EntitySpawnListener.class), this); getServer().getPluginManager().registerEvents(injector().getInstance(EntitySpawnListener.class), this);
if (PaperLib.isPaper() && Settings.Paper_Components.PAPER_LISTENERS) { if (PaperLib.isPaper() && Settings.Paper_Components.PAPER_LISTENERS) {
if (serverVersion()[1] == 13) {
getServer().getPluginManager().registerEvents(injector().getInstance(PaperListener113.class), this);
} else {
getServer().getPluginManager().registerEvents(injector().getInstance(PaperListener.class), this); getServer().getPluginManager().registerEvents(injector().getInstance(PaperListener.class), this);
} } else {
getServer().getPluginManager().registerEvents(injector().getInstance(SpigotListener.class), this);
} }
this.plotListener.startRunnable(); this.plotListener.startRunnable();
} }
@ -656,20 +654,15 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
final @NonNull SQLiteUUIDService sqLiteUUIDService, final @NonNull SQLiteUUIDService sqLiteUUIDService,
final @NonNull CacheUUIDService cacheUUIDService final @NonNull CacheUUIDService cacheUUIDService
) { ) {
// Load all uuids into a big chunky boi queue // Record all unique UUID's and put them into a queue
final Queue<UUID> uuidQueue = new LinkedBlockingQueue<>(); final Set<UUID> uuidSet = new HashSet<>();
PlotSquared.get().forEachPlotRaw(plot -> { PlotSquared.get().forEachPlotRaw(plot -> {
final Set<UUID> uuids = new HashSet<>(); uuidSet.add(plot.getOwnerAbs());
uuids.add(plot.getOwnerAbs()); uuidSet.addAll(plot.getMembers());
uuids.addAll(plot.getMembers()); uuidSet.addAll(plot.getTrusted());
uuids.addAll(plot.getTrusted()); uuidSet.addAll(plot.getDenied());
uuids.addAll(plot.getDenied());
for (final UUID uuid : uuids) {
if (!uuidQueue.contains(uuid)) {
uuidQueue.add(uuid);
}
}
}); });
final Queue<UUID> uuidQueue = new LinkedBlockingQueue<>(uuidSet);
LOGGER.info("(UUID) {} UUIDs will be cached", uuidQueue.size()); LOGGER.info("(UUID) {} UUIDs will be cached", uuidQueue.size());
@ -732,6 +725,11 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
this.getServer().getPluginManager().disablePlugin(this); this.getServer().getPluginManager().disablePlugin(this);
} }
@Override
public void shutdownServer() {
getServer().shutdown();
}
private void registerCommands() { private void registerCommands() {
final BukkitCommand bukkitCommand = new BukkitCommand(); final BukkitCommand bukkitCommand = new BukkitCommand();
final PluginCommand plotCommand = getCommand("plots"); final PluginCommand plotCommand = getCommand("plots");
@ -846,11 +844,11 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
// managed elsewhere // managed elsewhere
continue; continue;
case "SHULKER": case "SHULKER":
if (Settings.Enabled_Components.KILL_ROAD_MOBS) { if (Settings.Enabled_Components.KILL_ROAD_MOBS && (Settings.Enabled_Components.KILL_NAMED_ROAD_MOBS || entity.getCustomName() == null)) {
LivingEntity livingEntity = (LivingEntity) entity; LivingEntity livingEntity = (LivingEntity) entity;
List<MetadataValue> meta = entity.getMetadata("shulkerPlot"); List<MetadataValue> meta = entity.getMetadata("shulkerPlot");
if (!meta.isEmpty()) { if (!meta.isEmpty()) {
if (livingEntity.isLeashed()) { if (livingEntity.isLeashed() && !Settings.Enabled_Components.KILL_OWNED_ROAD_MOBS) {
continue; continue;
} }
List<MetadataValue> keep = entity.getMetadata("keep"); List<MetadataValue> keep = entity.getMetadata("keep");
@ -863,10 +861,8 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
com.plotsquared.core.location.Location pLoc = BukkitUtil.adapt(entity.getLocation()); com.plotsquared.core.location.Location pLoc = BukkitUtil.adapt(entity.getLocation());
PlotArea area = pLoc.getPlotArea(); PlotArea area = pLoc.getPlotArea();
if (area != null) { if (area != null) {
PlotId currentPlotId = area.getPlotAbs(pLoc).getId(); Plot currentPlot = area.getPlotAbs(pLoc);
if (!originalPlotId.equals(currentPlotId) && (currentPlotId == null || !area.getPlot( if (currentPlot == null || !originalPlotId.equals(currentPlot.getId())) {
originalPlotId)
.equals(area.getPlot(currentPlotId)))) {
if (entity.hasMetadata("ps-tmp-teleport")) { if (entity.hasMetadata("ps-tmp-teleport")) {
continue; continue;
} }
@ -880,11 +876,11 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
com.plotsquared.core.location.Location pLoc = BukkitUtil.adapt(entity.getLocation()); com.plotsquared.core.location.Location pLoc = BukkitUtil.adapt(entity.getLocation());
PlotArea area = pLoc.getPlotArea(); PlotArea area = pLoc.getPlotArea();
if (area != null) { if (area != null) {
PlotId currentPlotId = area.getPlotAbs(pLoc).getId(); Plot currentPlot = area.getPlotAbs(pLoc);
if (currentPlotId != null) { if (currentPlot != null) {
entity.setMetadata( entity.setMetadata(
"shulkerPlot", "shulkerPlot",
new FixedMetadataValue((Plugin) PlotSquared.platform(), currentPlotId) new FixedMetadataValue((Plugin) PlotSquared.platform(), currentPlot.getId())
); );
} }
} }
@ -970,7 +966,9 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
|| !entity.hasMetadata("keep")) { || !entity.hasMetadata("keep")) {
Entity passenger = entity.getPassenger(); Entity passenger = entity.getPassenger();
if ((Settings.Enabled_Components.KILL_OWNED_ROAD_MOBS if ((Settings.Enabled_Components.KILL_OWNED_ROAD_MOBS
|| !(passenger instanceof Player)) && entity.getMetadata("keep").isEmpty()) { || !((passenger instanceof Player) || livingEntity.isLeashed()))
&& (Settings.Enabled_Components.KILL_NAMED_ROAD_MOBS || entity.getCustomName() == null)
&& entity.getMetadata("keep").isEmpty()) {
if (entity.hasMetadata("ps-tmp-teleport")) { if (entity.hasMetadata("ps-tmp-teleport")) {
continue; continue;
} }
@ -980,8 +978,9 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
} }
} else { } else {
Entity passenger = entity.getPassenger(); Entity passenger = entity.getPassenger();
if ((Settings.Enabled_Components.KILL_OWNED_ROAD_MOBS if ((Settings.Enabled_Components.KILL_OWNED_ROAD_MOBS || !(passenger instanceof Player))
|| !(passenger instanceof Player)) && entity.getMetadata("keep").isEmpty()) { && (Settings.Enabled_Components.KILL_NAMED_ROAD_MOBS && entity.getCustomName() != null)
&& entity.getMetadata("keep").isEmpty()) {
if (entity.hasMetadata("ps-tmp-teleport")) { if (entity.hasMetadata("ps-tmp-teleport")) {
continue; continue;
} }

View File

@ -19,7 +19,7 @@
package com.plotsquared.bukkit.entity; package com.plotsquared.bukkit.entity;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.bukkit.Art; import org.bukkit.Art;
import org.bukkit.DyeColor; import org.bukkit.DyeColor;
@ -55,7 +55,7 @@ import java.util.List;
public final class ReplicatingEntityWrapper extends EntityWrapper { public final class ReplicatingEntityWrapper extends EntityWrapper {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + ReplicatingEntityWrapper.class.getSimpleName());
private final short depth; private final short depth;
private final int hash; private final int hash;

View File

@ -33,7 +33,6 @@ import org.bukkit.Chunk;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.BlockPopulator;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.NotNull;
import java.util.Random; import java.util.Random;
@ -51,7 +50,7 @@ final class LegacyBlockStatePopulator extends BlockPopulator {
} }
@Override @Override
public void populate(@NotNull final World world, @NotNull final Random random, @NotNull final Chunk source) { public void populate(@NonNull final World world, @NonNull final Random random, @NonNull final Chunk source) {
int chunkMinX = source.getX() << 4; int chunkMinX = source.getX() << 4;
int chunkMinZ = source.getZ() << 4; int chunkMinZ = source.getZ() << 4;
PlotArea area = Location.at(world.getName(), chunkMinX, 0, chunkMinZ).getPlotArea(); PlotArea area = Location.at(world.getName(), chunkMinX, 0, chunkMinZ).getPlotArea();

View File

@ -26,12 +26,12 @@ import com.plotsquared.core.backup.NullBackupManager;
import com.plotsquared.core.backup.PlayerBackupProfile; import com.plotsquared.core.backup.PlayerBackupProfile;
import com.plotsquared.core.backup.SimpleBackupManager; import com.plotsquared.core.backup.SimpleBackupManager;
import com.plotsquared.core.inject.factory.PlayerBackupProfileFactory; import com.plotsquared.core.inject.factory.PlayerBackupProfileFactory;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
public class BackupModule extends AbstractModule { public class BackupModule extends AbstractModule {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BackupModule.class.getSimpleName());
@Override @Override
protected void configure() { protected void configure() {

View File

@ -65,7 +65,7 @@ import com.plotsquared.core.util.SetupUtils;
import com.plotsquared.core.util.WorldUtil; import com.plotsquared.core.util.WorldUtil;
import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.ConsoleCommandSender; import org.bukkit.command.ConsoleCommandSender;
@ -74,7 +74,7 @@ import org.checkerframework.checker.nullness.qual.NonNull;
public class BukkitModule extends AbstractModule { public class BukkitModule extends AbstractModule {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BukkitModule.class.getSimpleName());
private final BukkitPlatform bukkitPlatform; private final BukkitPlatform bukkitPlatform;

View File

@ -56,6 +56,7 @@ import com.plotsquared.core.plot.flag.types.BlockTypeWrapper;
import com.plotsquared.core.plot.flag.types.BooleanFlag; import com.plotsquared.core.plot.flag.types.BooleanFlag;
import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.PlotFlagUtil;
import com.plotsquared.core.util.task.TaskManager; import com.plotsquared.core.util.task.TaskManager;
import com.plotsquared.core.util.task.TaskTime; import com.plotsquared.core.util.task.TaskTime;
import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEdit;
@ -70,6 +71,7 @@ import org.bukkit.block.Block;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState; import org.bukkit.block.BlockState;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.Dispenser;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Fireball; import org.bukkit.entity.Fireball;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -99,7 +101,6 @@ import org.bukkit.event.block.EntityBlockFormEvent;
import org.bukkit.event.block.LeavesDecayEvent; import org.bukkit.event.block.LeavesDecayEvent;
import org.bukkit.event.block.SpongeAbsorbEvent; import org.bukkit.event.block.SpongeAbsorbEvent;
import org.bukkit.event.world.StructureGrowEvent; import org.bukkit.event.world.StructureGrowEvent;
import org.bukkit.material.Directional;
import org.bukkit.projectiles.BlockProjectileSource; import org.bukkit.projectiles.BlockProjectileSource;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
@ -109,6 +110,8 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class BlockEventListener implements Listener { public class BlockEventListener implements Listener {
@ -121,6 +124,11 @@ public class BlockEventListener implements Listener {
Material.TURTLE_EGG, Material.TURTLE_EGG,
Material.TURTLE_SPAWN_EGG Material.TURTLE_SPAWN_EGG
); );
private static final Set<Material> SNOW = Stream.of(Material.values()) // needed as Tag.SNOW isn't present in 1.16.5
.filter(material -> material.name().contains("SNOW"))
.filter(Material::isBlock)
.collect(Collectors.toUnmodifiableSet());
private final PlotAreaManager plotAreaManager; private final PlotAreaManager plotAreaManager;
private final WorldEdit worldEdit; private final WorldEdit worldEdit;
@ -159,7 +167,7 @@ public class BlockEventListener implements Listener {
} }
Plot plot = location.getOwnedPlot(); Plot plot = location.getOwnedPlot();
if (plot == null) { if (plot == null) {
if (area.isRoadFlags() && !area.getRoadFlag(RedstoneFlag.class)) { if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, RedstoneFlag.class, false)) {
event.setNewCurrent(0); event.setNewCurrent(0);
} }
return; return;
@ -265,15 +273,9 @@ public class BlockEventListener implements Listener {
BukkitPlayer pp = BukkitUtil.adapt(player); BukkitPlayer pp = BukkitUtil.adapt(player);
Plot plot = area.getPlot(location); Plot plot = area.getPlot(location);
if (plot != null) { if (plot != null) {
if ((location.getY() >= area.getMaxBuildHeight() || location.getY() < area if (area.notifyIfOutsideBuildArea(pp, location.getY())) {
.getMinBuildHeight()) && !Permissions
.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
event.setCancelled(true); event.setCancelled(true);
pp.sendMessage( return;
TranslatableCaption.of("height.height_limit"),
Template.of("minHeight", String.valueOf(area.getMinBuildHeight())),
Template.of("maxHeight", String.valueOf(area.getMaxBuildHeight()))
);
} }
if (!plot.hasOwner()) { if (!plot.hasOwner()) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) { if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
@ -351,15 +353,9 @@ public class BlockEventListener implements Listener {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
} else if ((location.getY() >= area.getMaxBuildHeight() || location.getY() < area } else if (area.notifyIfOutsideBuildArea(plotPlayer, location.getY())) {
.getMinBuildHeight()) && !Permissions
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
event.setCancelled(true); event.setCancelled(true);
plotPlayer.sendMessage( return;
TranslatableCaption.of("height.height_limit"),
Template.of("minHeight", String.valueOf(area.getMinBuildHeight())),
Template.of("maxHeight", String.valueOf(area.getMaxBuildHeight()))
);
} }
if (!plot.hasOwner()) { if (!plot.hasOwner()) {
if (!Permissions if (!Permissions
@ -447,6 +443,7 @@ public class BlockEventListener implements Listener {
case "TWISTING_VINES": case "TWISTING_VINES":
case "CAVE_VINES": case "CAVE_VINES":
case "VINE": case "VINE":
case "GLOW_BERRIES":
if (!plot.getFlag(VineGrowFlag.class)) { if (!plot.getFlag(VineGrowFlag.class)) {
plot.debug("Vine could not grow because vine-grow = false"); plot.debug("Vine could not grow because vine-grow = false");
event.setCancelled(true); event.setCancelled(true);
@ -537,11 +534,11 @@ public class BlockEventListener implements Listener {
if (plot == null) { if (plot == null) {
return; return;
} }
if (location.getY() >= area.getMaxBuildHeight() || location.getY() < area.getMinBuildHeight()) { if (!area.buildRangeContainsY(location.getY())) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if (Tag.SNOW.isTagged(event.getNewState().getType())) { if (SNOW.contains(event.getNewState().getType())) {
if (!plot.getFlag(SnowFormFlag.class)) { if (!plot.getFlag(SnowFormFlag.class)) {
plot.debug("Snow could not form because snow-form = false"); plot.debug("Snow could not form because snow-form = false");
event.setCancelled(true); event.setCancelled(true);
@ -573,7 +570,7 @@ public class BlockEventListener implements Listener {
return; return;
} }
Class<? extends BooleanFlag<?>> flag; Class<? extends BooleanFlag<?>> flag;
if (Tag.SNOW.isTagged(event.getNewState().getType())) { if (SNOW.contains(event.getNewState().getType())) {
flag = SnowFormFlag.class; flag = SnowFormFlag.class;
} else if (Tag.ICE.isTagged(event.getNewState().getType())) { } else if (Tag.ICE.isTagged(event.getNewState().getType())) {
flag = IceFormFlag.class; flag = IceFormFlag.class;
@ -690,7 +687,7 @@ public class BlockEventListener implements Listener {
} }
return; return;
} }
if (Tag.SNOW.isTagged(blockType)) { if (SNOW.contains(blockType)) {
if (!plot.getFlag(SnowMeltFlag.class)) { if (!plot.getFlag(SnowMeltFlag.class)) {
plot.debug("Snow could not melt because snow-melt = false"); plot.debug("Snow could not melt because snow-melt = false");
event.setCancelled(true); event.setCancelled(true);
@ -704,7 +701,7 @@ public class BlockEventListener implements Listener {
} }
return; return;
} }
if (Tag.CORAL_BLOCKS.isTagged(blockType) || Tag.CORALS.isTagged(blockType)) { if (Tag.CORAL_BLOCKS.isTagged(blockType) || Tag.CORALS.isTagged(blockType) || Tag.WALL_CORALS.isTagged(blockType)) {
if (!plot.getFlag(CoralDryFlag.class)) { if (!plot.getFlag(CoralDryFlag.class)) {
plot.debug("Coral could not dry because coral-dry = false"); plot.debug("Coral could not dry because coral-dry = false");
event.setCancelled(true); event.setCancelled(true);
@ -739,7 +736,7 @@ public class BlockEventListener implements Listener {
} }
return; return;
} }
if (toLocation.getY() >= toArea.getMaxBuildHeight() || toLocation.getY() < toArea.getMinBuildHeight()) { if (!toArea.buildRangeContainsY(toLocation.getY())) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -813,6 +810,11 @@ public class BlockEventListener implements Listener {
return; return;
} }
if (!area.buildRangeContainsY(location.getY())) {
event.setCancelled(true);
return;
}
Plot plot = location.getOwnedPlot(); Plot plot = location.getOwnedPlot();
if (plot == null || !plot.getFlag(CropGrowFlag.class)) { if (plot == null || !plot.getFlag(CropGrowFlag.class)) {
if (plot != null) { if (plot != null) {
@ -856,15 +858,16 @@ public class BlockEventListener implements Listener {
} }
for (Block block1 : event.getBlocks()) { for (Block block1 : event.getBlocks()) {
Location bloc = BukkitUtil.adapt(block1.getLocation()); Location bloc = BukkitUtil.adapt(block1.getLocation());
if (!area.contains(bloc.getX(), bloc.getZ()) || !area.contains( Location newLoc = bloc.add(relative.getBlockX(), relative.getBlockY(), relative.getBlockZ());
bloc.getX() + relative.getBlockX(), if (!area.contains(bloc.getX(), bloc.getZ()) || !area.contains(newLoc)) {
bloc.getZ() + relative.getBlockZ()
)) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if (!plot.equals(area.getOwnedPlot(bloc)) || !plot if (!plot.equals(area.getOwnedPlot(bloc)) || !plot.equals(area.getOwnedPlot(newLoc))) {
.equals(area.getOwnedPlot(bloc.add(relative.getBlockX(), relative.getBlockY(), relative.getBlockZ())))) { event.setCancelled(true);
return;
}
if (!area.buildRangeContainsY(bloc.getY()) || !area.buildRangeContainsY(newLoc.getY())) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -890,9 +893,8 @@ public class BlockEventListener implements Listener {
} }
for (Block block1 : event.getBlocks()) { for (Block block1 : event.getBlocks()) {
Location bloc = BukkitUtil.adapt(block1.getLocation()); Location bloc = BukkitUtil.adapt(block1.getLocation());
if (bloc.isPlotArea() || bloc Location newLoc = bloc.add(relative.getBlockX(), relative.getBlockY(), relative.getBlockZ());
.add(relative.getBlockX(), relative.getBlockY(), relative.getBlockZ()) if (bloc.isPlotArea() || newLoc.isPlotArea()) {
.isPlotArea()) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -906,15 +908,16 @@ public class BlockEventListener implements Listener {
} }
for (Block block1 : event.getBlocks()) { for (Block block1 : event.getBlocks()) {
Location bloc = BukkitUtil.adapt(block1.getLocation()); Location bloc = BukkitUtil.adapt(block1.getLocation());
if (!area.contains(bloc.getX(), bloc.getZ()) || !area.contains( Location newLoc = bloc.add(relative.getBlockX(), relative.getBlockY(), relative.getBlockZ());
bloc.getX() + relative.getBlockX(), if (!area.contains(bloc.getX(), bloc.getZ()) || !area.contains(newLoc)) {
bloc.getZ() + relative.getBlockZ()
)) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if (!plot.equals(area.getOwnedPlot(bloc)) || !plot if (!plot.equals(area.getOwnedPlot(bloc)) || !plot.equals(area.getOwnedPlot(newLoc))) {
.equals(area.getOwnedPlot(bloc.add(relative.getBlockX(), relative.getBlockY(), relative.getBlockZ())))) { event.setCancelled(true);
return;
}
if (!area.buildRangeContainsY(bloc.getY()) || !area.buildRangeContainsY(newLoc.getY())) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -923,6 +926,9 @@ public class BlockEventListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockDispense(BlockDispenseEvent event) { public void onBlockDispense(BlockDispenseEvent event) {
if (!this.plotAreaManager.hasPlotArea(event.getBlock().getWorld().getName())) {
return;
}
Material type = event.getItem().getType(); Material type = event.getItem().getType();
switch (type.toString()) { switch (type.toString()) {
case "SHULKER_BOX", "WHITE_SHULKER_BOX", "ORANGE_SHULKER_BOX", "MAGENTA_SHULKER_BOX", "LIGHT_BLUE_SHULKER_BOX", case "SHULKER_BOX", "WHITE_SHULKER_BOX", "ORANGE_SHULKER_BOX", "MAGENTA_SHULKER_BOX", "LIGHT_BLUE_SHULKER_BOX",
@ -934,10 +940,15 @@ public class BlockEventListener implements Listener {
if (event.getBlock().getType() == Material.DROPPER) { if (event.getBlock().getType() == Material.DROPPER) {
return; return;
} }
BlockFace targetFace = ((Directional) event.getBlock().getState().getData()).getFacing(); BlockFace targetFace = ((Dispenser) event.getBlock().getBlockData()).getFacing();
Location location = BukkitUtil.adapt(event.getBlock().getRelative(targetFace).getLocation()); Location location = BukkitUtil.adapt(event.getBlock().getRelative(targetFace).getLocation());
if (location.isPlotRoad()) { if (location.isPlotRoad()) {
event.setCancelled(true); event.setCancelled(true);
return;
}
PlotArea area = location.getPlotArea();
if (area != null && !area.buildRangeContainsY(location.getY())) {
event.setCancelled(true);
} }
} }
} }
@ -977,6 +988,10 @@ public class BlockEventListener implements Listener {
Plot plot = area.getOwnedPlot(location); Plot plot = area.getOwnedPlot(location);
if (!Objects.equals(plot, origin)) { if (!Objects.equals(plot, origin)) {
event.getBlocks().remove(i); event.getBlocks().remove(i);
continue;
}
if (!area.buildRangeContainsY(location.getY())) {
event.getBlocks().remove(i);
} }
} }
} }
@ -1068,8 +1083,15 @@ public class BlockEventListener implements Listener {
Plot plot = area.getOwnedPlot(location1); Plot plot = area.getOwnedPlot(location1);
if (player != null) { if (player != null) {
BukkitPlayer pp = BukkitUtil.adapt(player); BukkitPlayer pp = BukkitUtil.adapt(player);
if (area.notifyIfOutsideBuildArea(pp, location1.getY())) {
event.setCancelled(true);
return;
}
if (plot == null) { if (plot == null) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_ROAD)) { if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, BlockIgnitionFlag.class, true) && !Permissions.hasPermission(
pp,
Permission.PERMISSION_ADMIN_BUILD_ROAD
)) {
pp.sendMessage( pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"), TranslatableCaption.of("permission.no_permission_event"),
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD)) Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_ROAD))
@ -1077,7 +1099,10 @@ public class BlockEventListener implements Listener {
event.setCancelled(true); event.setCancelled(true);
} }
} else if (!plot.hasOwner()) { } else if (!plot.hasOwner()) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) { if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, BlockIgnitionFlag.class, true) && !Permissions.hasPermission(
pp,
Permission.PERMISSION_ADMIN_BUILD_UNOWNED
)) {
pp.sendMessage( pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"), TranslatableCaption.of("permission.no_permission_event"),
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_UNOWNED))
@ -1175,7 +1200,10 @@ public class BlockEventListener implements Listener {
return true; return true;
} }
Plot plot = area.getOwnedPlot(blockLocation); Plot plot = area.getOwnedPlot(blockLocation);
return !Objects.equals(plot, origin); if (!Objects.equals(plot, origin)) {
return true;
}
return !area.buildRangeContainsY(location.getY());
}); });
} }
if (blocks.isEmpty()) { if (blocks.isEmpty()) {
@ -1217,15 +1245,7 @@ public class BlockEventListener implements Listener {
event.setCancelled(true); event.setCancelled(true);
break; break;
} }
if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) { if (area.notifyIfOutsideBuildArea(pp, currentLocation.getY())) {
continue;
}
if (currentLocation.getY() >= area.getMaxBuildHeight() || currentLocation.getY() < area.getMinBuildHeight()) {
pp.sendMessage(
TranslatableCaption.of("height.height_limit"),
Template.of("minHeight", String.valueOf(area.getMinBuildHeight())),
Template.of("maxHeight", String.valueOf(area.getMaxBuildHeight()))
);
event.setCancelled(true); event.setCancelled(true);
break; break;
} }

View File

@ -26,6 +26,7 @@ import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag; import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag;
import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag; import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag;
import com.plotsquared.core.util.PlotFlagUtil;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
@ -80,10 +81,20 @@ public class BlockEventListener117 implements Listener {
return; return;
} }
Plot plot = location.getOwnedPlot(); BukkitPlayer plotPlayer = null;
if (plot == null || !plot.getFlag(MiscInteractFlag.class)) {
if (entity instanceof Player player) { if (entity instanceof Player player) {
BukkitPlayer plotPlayer = BukkitUtil.adapt(player); plotPlayer = BukkitUtil.adapt(player);
if (area.notifyIfOutsideBuildArea(plotPlayer, location.getY())) {
event.setCancelled(true);
return;
}
}
Plot plot = location.getOwnedPlot();
if (plot == null && !PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, MiscInteractFlag.class, true) || plot != null && !plot.getFlag(
MiscInteractFlag.class)) {
if (plotPlayer != null) {
if (plot != null) { if (plot != null) {
if (!plot.isAdded(plotPlayer.getUUID())) { if (!plot.isAdded(plotPlayer.getUUID())) {
plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because misc-interact = false"); plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because misc-interact = false");
@ -95,6 +106,12 @@ public class BlockEventListener117 implements Listener {
if (entity instanceof Item item) { if (entity instanceof Item item) {
UUID itemThrower = item.getThrower(); UUID itemThrower = item.getThrower();
if (plot != null) { if (plot != null) {
if (itemThrower == null && (itemThrower = item.getOwner()) == null) {
plot.debug(
"A thrown item couldn't trigger sculk sensors because misc-interact = false and the item's owner could not be resolved.");
event.setCancelled(true);
return;
}
if (!plot.isAdded(itemThrower)) { if (!plot.isAdded(itemThrower)) {
if (!plot.isAdded(itemThrower)) { if (!plot.isAdded(itemThrower)) {
plot.debug("A thrown item couldn't trigger sculk sensors because misc-interact = false"); plot.debug("A thrown item couldn't trigger sculk sensors because misc-interact = false");
@ -115,12 +132,12 @@ public class BlockEventListener117 implements Listener {
PlotArea area = location.getPlotArea(); PlotArea area = location.getPlotArea();
if (area == null) { if (area == null) {
for (int i = blocks.size() - 1; i >= 0; i--) { for (int i = blocks.size() - 1; i >= 0; i--) {
location = BukkitUtil.adapt(blocks.get(i).getLocation()); Location blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation());
if (location.isPlotArea()) { blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation());
if (blockLocation.isPlotArea()) {
blocks.remove(i); blocks.remove(i);
} }
} }
return;
} else { } else {
Plot origin = area.getOwnedPlot(location); Plot origin = area.getOwnedPlot(location);
if (origin == null) { if (origin == null) {
@ -128,30 +145,22 @@ public class BlockEventListener117 implements Listener {
return; return;
} }
for (int i = blocks.size() - 1; i >= 0; i--) { for (int i = blocks.size() - 1; i >= 0; i--) {
location = BukkitUtil.adapt(blocks.get(i).getLocation()); Location blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation());
if (!area.contains(location.getX(), location.getZ())) { if (!area.contains(blockLocation.getX(), blockLocation.getZ())) {
blocks.remove(i); blocks.remove(i);
continue; continue;
} }
Plot plot = area.getOwnedPlot(location); Plot plot = area.getOwnedPlot(blockLocation);
if (!Objects.equals(plot, origin)) { if (!Objects.equals(plot, origin)) {
event.getBlocks().remove(i); event.getBlocks().remove(i);
continue;
} }
} if (!area.buildRangeContainsY(location.getY())) {
}
Plot origin = area.getPlot(location);
if (origin == null) {
event.setCancelled(true);
return;
}
for (int i = blocks.size() - 1; i >= 0; i--) {
location = BukkitUtil.adapt(blocks.get(i).getLocation());
Plot plot = area.getOwnedPlot(location);
if (!Objects.equals(plot, origin) && (!plot.isMerged() && !origin.isMerged())) {
event.getBlocks().remove(i); event.getBlocks().remove(i);
} }
} }
} }
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockForm(BlockFormEvent event) { public void onBlockForm(BlockFormEvent event) {

View File

@ -38,6 +38,7 @@ import com.plotsquared.core.plot.flag.implementations.InvincibleFlag;
import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.PlotFlagUtil;
import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockType;
import org.bukkit.Material; import org.bukkit.Material;
@ -261,7 +262,7 @@ public class EntityEventListener implements Listener {
} }
Plot plot = location.getOwnedPlot(); Plot plot = location.getOwnedPlot();
if (plot == null) { if (plot == null) {
if (area.isRoadFlags() && area.getRoadFlag(InvincibleFlag.class)) { if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, InvincibleFlag.class, true)) {
event.setCancelled(true); event.setCancelled(true);
} }
return; return;

View File

@ -126,16 +126,16 @@ public class EntitySpawnListener implements Listener {
Plot plot = location.getOwnedPlotAbs(); Plot plot = location.getOwnedPlotAbs();
EntityType type = entity.getType(); EntityType type = entity.getType();
if (plot == null) { if (plot == null) {
if (!area.isMobSpawning()) {
if (type == EntityType.PLAYER) {
return;
}
if (type == EntityType.DROPPED_ITEM) { if (type == EntityType.DROPPED_ITEM) {
if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { if (Settings.Enabled_Components.KILL_ROAD_ITEMS) {
event.setCancelled(true); event.setCancelled(true);
} }
return; return;
} }
if (!area.isMobSpawning()) {
if (type == EntityType.PLAYER) {
return;
}
if (type.isAlive()) { if (type.isAlive()) {
event.setCancelled(true); event.setCancelled(true);
} }

View File

@ -18,7 +18,6 @@
*/ */
package com.plotsquared.bukkit.listener; package com.plotsquared.bukkit.listener;
import com.google.common.collect.Iterables;
import com.plotsquared.bukkit.player.BukkitPlayer; import com.plotsquared.bukkit.player.BukkitPlayer;
import com.plotsquared.bukkit.util.BukkitUtil; import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.core.location.Location; import com.plotsquared.core.location.Location;
@ -39,8 +38,11 @@ public class ForceFieldListener {
private static Set<PlotPlayer<?>> getNearbyPlayers(Player player, Plot plot) { private static Set<PlotPlayer<?>> getNearbyPlayers(Player player, Plot plot) {
Set<PlotPlayer<?>> players = new HashSet<>(); Set<PlotPlayer<?>> players = new HashSet<>();
for (Player nearPlayer : Iterables for (Player nearPlayer : player.getNearbyEntities(5d, 5d, 5d).stream()
.filter(player.getNearbyEntities(5d, 5d, 5d), Player.class)) { .filter(entity -> entity instanceof Player)
.map(entity -> (Player) entity)
.toList()
) {
PlotPlayer<?> plotPlayer; PlotPlayer<?> plotPlayer;
if ((plotPlayer = BukkitUtil.adapt(nearPlayer)) == null || !plot if ((plotPlayer = BukkitUtil.adapt(nearPlayer)) == null || !plot
.equals(plotPlayer.getCurrentPlot())) { .equals(plotPlayer.getCurrentPlot())) {
@ -54,8 +56,11 @@ public class ForceFieldListener {
} }
private static PlotPlayer<?> hasNearbyPermitted(Player player, Plot plot) { private static PlotPlayer<?> hasNearbyPermitted(Player player, Plot plot) {
for (Player nearPlayer : Iterables for (Player nearPlayer : player.getNearbyEntities(5d, 5d, 5d).stream()
.filter(player.getNearbyEntities(5d, 5d, 5d), Player.class)) { .filter(entity -> entity instanceof Player)
.map(entity -> (Player) entity)
.toList()
) {
PlotPlayer<?> plotPlayer; PlotPlayer<?> plotPlayer;
if ((plotPlayer = BukkitUtil.adapt(nearPlayer)) == null || !plot if ((plotPlayer = BukkitUtil.adapt(nearPlayer)) == null || !plot
.equals(plotPlayer.getCurrentPlot())) { .equals(plotPlayer.getCurrentPlot())) {

View File

@ -18,6 +18,7 @@
*/ */
package com.plotsquared.bukkit.listener; package com.plotsquared.bukkit.listener;
import com.destroystokyo.paper.event.block.BeaconEffectEvent;
import com.destroystokyo.paper.event.entity.EntityPathfindEvent; import com.destroystokyo.paper.event.entity.EntityPathfindEvent;
import com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent; import com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent;
import com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent; import com.destroystokyo.paper.event.entity.PreCreatureSpawnEvent;
@ -36,10 +37,14 @@ import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.flag.FlagContainer;
import com.plotsquared.core.plot.flag.implementations.BeaconEffectsFlag;
import com.plotsquared.core.plot.flag.implementations.DoneFlag; import com.plotsquared.core.plot.flag.implementations.DoneFlag;
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag; import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
import com.plotsquared.core.plot.flag.types.BooleanFlag;
import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.PlotFlagUtil;
import net.kyori.adventure.text.minimessage.Template; import net.kyori.adventure.text.minimessage.Template;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -229,17 +234,17 @@ public class PaperListener implements Listener {
Plot plot = location.getOwnedPlotAbs(); Plot plot = location.getOwnedPlotAbs();
if (plot == null) { if (plot == null) {
EntityType type = event.getType(); EntityType type = event.getType();
if (!area.isMobSpawning()) { // PreCreatureSpawnEvent **should** not be called for DROPPED_ITEM, just for the sake of consistency
if (type == EntityType.PLAYER) {
return;
}
if (type == EntityType.DROPPED_ITEM) { if (type == EntityType.DROPPED_ITEM) {
if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { if (Settings.Enabled_Components.KILL_ROAD_ITEMS) {
event.setShouldAbortSpawn(true);
event.setCancelled(true); event.setCancelled(true);
} }
return; return;
} }
if (!area.isMobSpawning()) {
if (type == EntityType.PLAYER) {
return;
}
if (type.isAlive()) { if (type.isAlive()) {
event.setShouldAbortSpawn(true); event.setShouldAbortSpawn(true);
event.setCancelled(true); event.setCancelled(true);
@ -322,14 +327,18 @@ public class PaperListener implements Listener {
return; return;
} }
Location location = BukkitUtil.adapt(entity.getLocation()); Location location = BukkitUtil.adapt(entity.getLocation());
if (!this.plotAreaManager.hasPlotArea(location.getWorldName())) { PlotArea area = location.getPlotArea();
if (area == null) {
return; return;
} }
PlotPlayer<Player> pp = BukkitUtil.adapt((Player) shooter); PlotPlayer<Player> pp = BukkitUtil.adapt((Player) shooter);
Plot plot = location.getOwnedPlot(); Plot plot = location.getOwnedPlot();
if (plot == null) { if (plot == null) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_ROAD)) { if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true) && !Permissions.hasPermission(
pp,
Permission.PERMISSION_ADMIN_PROJECTILE_ROAD
)) {
pp.sendMessage( pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"), TranslatableCaption.of("permission.no_permission_event"),
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_ROAD)) Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_ROAD))
@ -400,4 +409,50 @@ public class PaperListener implements Listener {
} }
} }
@EventHandler(ignoreCancelled = true)
public void onBeaconEffect(final BeaconEffectEvent event) {
Block block = event.getBlock();
Location beaconLocation = BukkitUtil.adapt(block.getLocation());
Plot beaconPlot = beaconLocation.getPlot();
PlotArea area = beaconLocation.getPlotArea();
if (area == null) {
return;
}
Player player = event.getPlayer();
Location playerLocation = BukkitUtil.adapt(player.getLocation());
PlotPlayer<Player> plotPlayer = BukkitUtil.adapt(player);
Plot playerStandingPlot = playerLocation.getPlot();
if (playerStandingPlot == null) {
FlagContainer container = area.getRoadFlagContainer();
if (!getBooleanFlagValue(container, BeaconEffectsFlag.class, true) ||
(beaconPlot != null && Settings.Enabled_Components.DISABLE_BEACON_EFFECT_OVERFLOW)) {
event.setCancelled(true);
}
return;
}
FlagContainer container = playerStandingPlot.getFlagContainer();
boolean plotBeaconEffects = getBooleanFlagValue(container, BeaconEffectsFlag.class, true);
if (playerStandingPlot.equals(beaconPlot)) {
if (!plotBeaconEffects) {
event.setCancelled(true);
}
return;
}
if (!plotBeaconEffects || Settings.Enabled_Components.DISABLE_BEACON_EFFECT_OVERFLOW) {
event.setCancelled(true);
}
}
private boolean getBooleanFlagValue(@NonNull FlagContainer container,
@NonNull Class<? extends BooleanFlag<?>> flagClass,
boolean defaultValue) {
BooleanFlag<?> flag = container.getFlag(flagClass);
return flag == null ? defaultValue : flag.getValue();
}
} }

View File

@ -48,6 +48,10 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockPlaceEvent;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
/**
* @deprecated P2 effectively no longer supports 1.13
*/
@Deprecated(forRemoval = true, since = "6.10.4")
public class PaperListener113 extends PaperListener { public class PaperListener113 extends PaperListener {
@Inject @Inject

View File

@ -68,6 +68,7 @@ import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.MathMan;
import com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.PlotFlagUtil;
import com.plotsquared.core.util.PremiumVerification; import com.plotsquared.core.util.PremiumVerification;
import com.plotsquared.core.util.entity.EntityCategories; import com.plotsquared.core.util.entity.EntityCategories;
import com.plotsquared.core.util.task.TaskManager; import com.plotsquared.core.util.task.TaskManager;
@ -106,6 +107,7 @@ import org.bukkit.event.Listener;
import org.bukkit.event.block.Action; import org.bukkit.event.block.Action;
import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.entity.EntityPickupItemEvent;
import org.bukkit.event.entity.EntityPlaceEvent; import org.bukkit.event.entity.EntityPlaceEvent;
import org.bukkit.event.entity.EntityPotionEffectEvent;
import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent;
import org.bukkit.event.hanging.HangingPlaceEvent; import org.bukkit.event.hanging.HangingPlaceEvent;
@ -142,23 +144,22 @@ import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.metadata.MetadataValue; import org.bukkit.metadata.MetadataValue;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.potion.PotionEffect;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.regex.Pattern;
/** /**
* Player Events involving plots. * Player Events involving plots.
*/ */
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class PlayerEventListener extends PlotListener implements Listener { public class PlayerEventListener implements Listener {
private static final Set<Material> MINECARTS = Set.of( private static final Set<Material> MINECARTS = Set.of(
Material.MINECART, Material.MINECART,
@ -177,6 +178,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
private final EventDispatcher eventDispatcher; private final EventDispatcher eventDispatcher;
private final WorldEdit worldEdit; private final WorldEdit worldEdit;
private final PlotAreaManager plotAreaManager; private final PlotAreaManager plotAreaManager;
private final PlotListener plotListener;
// To prevent recursion // To prevent recursion
private boolean tmpTeleport = true; private boolean tmpTeleport = true;
private Field fieldPlayer; private Field fieldPlayer;
@ -196,12 +198,36 @@ public class PlayerEventListener extends PlotListener implements Listener {
public PlayerEventListener( public PlayerEventListener(
final @NonNull PlotAreaManager plotAreaManager, final @NonNull PlotAreaManager plotAreaManager,
final @NonNull EventDispatcher eventDispatcher, final @NonNull EventDispatcher eventDispatcher,
final @NonNull WorldEdit worldEdit final @NonNull WorldEdit worldEdit,
final @NonNull PlotListener plotListener
) { ) {
super(eventDispatcher);
this.eventDispatcher = eventDispatcher; this.eventDispatcher = eventDispatcher;
this.worldEdit = worldEdit; this.worldEdit = worldEdit;
this.plotAreaManager = plotAreaManager; this.plotAreaManager = plotAreaManager;
this.plotListener = plotListener;
}
@EventHandler(ignoreCancelled = true)
public void onEffect(@NonNull EntityPotionEffectEvent event) {
if (Settings.Enabled_Components.DISABLE_BEACON_EFFECT_OVERFLOW ||
event.getCause() != EntityPotionEffectEvent.Cause.BEACON ||
!(event.getEntity() instanceof Player player)) {
return;
}
UUID uuid = player.getUniqueId();
PotionEffect effect = event.getNewEffect();
if (effect == null) {
PotionEffect oldEffect = event.getOldEffect();
if (oldEffect != null) {
String name = oldEffect.getType().getName();
plotListener.addEffect(uuid, name, -1);
}
} else {
long expiresAt = System.currentTimeMillis() + effect.getDuration() * 50L; //Convert ticks to milliseconds
String name = effect.getType().getName();
plotListener.addEffect(uuid, name, expiresAt);
}
} }
@EventHandler @EventHandler
@ -354,7 +380,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
if (area != null) { if (area != null) {
Plot plot = area.getPlot(location); Plot plot = area.getPlot(location);
if (plot != null) { if (plot != null) {
plotEntry(pp, plot); plotListener.plotEntry(pp, plot);
} }
} }
// Delayed // Delayed
@ -406,7 +432,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
PlotArea area = location.getPlotArea(); PlotArea area = location.getPlotArea();
if (area == null) { if (area == null) {
if (lastPlot != null) { if (lastPlot != null) {
plotExit(pp, lastPlot); plotListener.plotExit(pp, lastPlot);
lastPlotAccess.remove(); lastPlotAccess.remove();
} }
try (final MetaDataAccess<Location> lastLocationAccess = try (final MetaDataAccess<Location> lastLocationAccess =
@ -540,7 +566,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
if (now == null) { if (now == null) {
try (final MetaDataAccess<Boolean> kickAccess = try (final MetaDataAccess<Boolean> kickAccess =
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) { pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
if (lastPlot != null && !plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(false)) { if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(false)) {
pp.sendMessage( pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"), TranslatableCaption.of("permission.no_permission_event"),
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_EXIT_DENIED)) Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_EXIT_DENIED))
@ -558,7 +584,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
} }
} else if (now.equals(lastPlot)) { } else if (now.equals(lastPlot)) {
ForceFieldListener.handleForcefield(player, pp, now); ForceFieldListener.handleForcefield(player, pp, now);
} else if (!plotEntry(pp, now) && this.tmpTeleport) { } else if (!plotListener.plotEntry(pp, now) && this.tmpTeleport) {
pp.sendMessage( pp.sendMessage(
TranslatableCaption.of("deny.no_enter"), TranslatableCaption.of("deny.no_enter"),
Template.of("plot", now.toString()) Template.of("plot", now.toString())
@ -630,7 +656,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
if (plot == null) { if (plot == null) {
try (final MetaDataAccess<Boolean> kickAccess = try (final MetaDataAccess<Boolean> kickAccess =
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) { pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
if (lastPlot != null && !plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(false)) { if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(false)) {
pp.sendMessage( pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"), TranslatableCaption.of("permission.no_permission_event"),
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_EXIT_DENIED)) Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_EXIT_DENIED))
@ -648,7 +674,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
} }
} else if (plot.equals(lastPlot)) { } else if (plot.equals(lastPlot)) {
ForceFieldListener.handleForcefield(player, pp, plot); ForceFieldListener.handleForcefield(player, pp, plot);
} else if (!plotEntry(pp, plot) && this.tmpTeleport) { } else if (!plotListener.plotEntry(pp, plot) && this.tmpTeleport) {
pp.sendMessage( pp.sendMessage(
TranslatableCaption.of("deny.no_enter"), TranslatableCaption.of("deny.no_enter"),
Template.of("plot", plot.toString()) Template.of("plot", plot.toString())
@ -795,7 +821,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
lastLocationAccess.remove(); lastLocationAccess.remove();
} }
if (plot != null) { if (plot != null) {
plotExit(pp, plot); plotListener.plotExit(pp, plot);
} }
if (this.worldEdit != null) { if (this.worldEdit != null) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_WORLDEDIT_BYPASS)) { if (!Permissions.hasPermission(pp, Permission.PERMISSION_WORLDEDIT_BYPASS)) {
@ -809,7 +835,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
if (location.isPlotArea()) { if (location.isPlotArea()) {
plot = location.getPlot(); plot = location.getPlot();
if (plot != null) { if (plot != null) {
plotEntry(pp, plot); plotListener.plotEntry(pp, plot);
} }
} }
} }
@ -864,8 +890,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
} }
} else { } else {
PlotArea area = pp.getPlotAreaAbs(); PlotArea area = pp.getPlotAreaAbs();
if (area != null && area.isRoadFlags() && area if (area != null && PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, PreventCreativeCopyFlag.class, true)) {
.getRoadFlag(PreventCreativeCopyFlag.class)) {
final ItemStack newStack = final ItemStack newStack =
new ItemStack(newItem.getType(), newItem.getAmount()); new ItemStack(newItem.getType(), newItem.getAmount());
event.setCursor(newStack); event.setCursor(newStack);
@ -973,8 +998,10 @@ public class PlayerEventListener extends PlotListener implements Listener {
Plot plot = location.getPlotAbs(); Plot plot = location.getPlotAbs();
BukkitPlayer pp = BukkitUtil.adapt(e.getPlayer()); BukkitPlayer pp = BukkitUtil.adapt(e.getPlayer());
if (plot == null) { if (plot == null) {
if (!area.isRoadFlags() && !area.getRoadFlag(MiscInteractFlag.class) && !Permissions if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, MiscInteractFlag.class, true) && !Permissions.hasPermission(
.hasPermission(pp, Permission.PERMISSION_ADMIN_INTERACT_ROAD)) { pp,
Permission.PERMISSION_ADMIN_INTERACT_ROAD
)) {
pp.sendMessage( pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"), TranslatableCaption.of("permission.no_permission_event"),
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_ROAD)) Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_INTERACT_ROAD))
@ -984,9 +1011,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
} else { } else {
if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) { if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
pp.sendMessage( pp.sendMessage(TranslatableCaption.of("done.building_restricted"));
TranslatableCaption.of("done.building_restricted")
);
e.setCancelled(true); e.setCancelled(true);
return; return;
} }
@ -1282,7 +1307,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
TaskManager.removeFromTeleportQueue(event.getPlayer().getName()); TaskManager.removeFromTeleportQueue(event.getPlayer().getName());
BukkitPlayer pp = BukkitUtil.adapt(event.getPlayer()); BukkitPlayer pp = BukkitUtil.adapt(event.getPlayer());
pp.unregister(); pp.unregister();
this.logout(pp.getUUID()); plotListener.logout(pp.getUUID());
} }
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
@ -1569,7 +1594,10 @@ public class PlayerEventListener extends PlotListener implements Listener {
BukkitPlayer pp = BukkitUtil.adapt(p); BukkitPlayer pp = BukkitUtil.adapt(p);
Plot plot = area.getPlot(location); Plot plot = area.getPlot(location);
if (plot == null) { if (plot == null) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_ROAD)) { if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, VehicleBreakFlag.class, true) && !Permissions.hasPermission(
pp,
Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_ROAD
)) {
pp.sendMessage( pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"), TranslatableCaption.of("permission.no_permission_event"),
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_ROAD)) Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_VEHICLE_ROAD))
@ -1617,7 +1645,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
} }
Plot plot = location.getOwnedPlot(); Plot plot = location.getOwnedPlot();
if (plot == null) { if (plot == null) {
if (area.isRoadFlags() && !area.getRoadFlag(ItemDropFlag.class)) { if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ItemDropFlag.class, false)) {
event.setCancelled(true); event.setCancelled(true);
} }
return; return;
@ -1643,7 +1671,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
} }
Plot plot = location.getOwnedPlot(); Plot plot = location.getOwnedPlot();
if (plot == null) { if (plot == null) {
if (area.isRoadFlags() && area.getRoadFlag(DropProtectionFlag.class)) { if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, DropProtectionFlag.class, true)) {
event.setCancelled(true); event.setCancelled(true);
} }
return; return;
@ -1665,19 +1693,17 @@ public class PlayerEventListener extends PlotListener implements Listener {
} }
Plot plot = location.getOwnedPlot(); Plot plot = location.getOwnedPlot();
if (plot == null) { if (plot == null) {
if (area.isRoadFlags() && area.getRoadFlag(KeepInventoryFlag.class)) { if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, KeepInventoryFlag.class, true)) {
event.setCancelled(true); event.setCancelled(true);
} }
return; return;
} }
if (plot.getFlag(KeepInventoryFlag.class)) {
if (plot.getFlag(KeepInventoryFlag.class)) { if (plot.getFlag(KeepInventoryFlag.class)) {
plot.debug(event.getEntity().getName() + " kept their inventory because of keep-inventory = true"); plot.debug(event.getEntity().getName() + " kept their inventory because of keep-inventory = true");
event.getDrops().clear(); event.getDrops().clear();
event.setKeepInventory(true); event.setKeepInventory(true);
} }
} }
}
@SuppressWarnings("deprecation") // #getLocate is needed for Spigot compatibility @SuppressWarnings("deprecation") // #getLocate is needed for Spigot compatibility
@EventHandler @EventHandler
@ -1700,18 +1726,16 @@ public class PlayerEventListener extends PlotListener implements Listener {
} }
Plot plot = location.getOwnedPlot(); Plot plot = location.getOwnedPlot();
if (plot == null) { if (plot == null) {
if (area.isRoadFlags() && area.getRoadFlag(DenyPortalTravelFlag.class)) { if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, DenyPortalTravelFlag.class, true)) {
event.setCancelled(true); event.setCancelled(true);
} }
return; return;
} }
if (plot.getFlag(DenyPortalTravelFlag.class)) {
if (plot.getFlag(DenyPortalTravelFlag.class)) { if (plot.getFlag(DenyPortalTravelFlag.class)) {
plot.debug(event.getPlayer().getName() + " did not travel thru a portal because of deny-portal-travel = true"); plot.debug(event.getPlayer().getName() + " did not travel thru a portal because of deny-portal-travel = true");
event.setCancelled(true); event.setCancelled(true);
} }
} }
}
@EventHandler @EventHandler
public void onPortalCreation(PortalCreateEvent event) { public void onPortalCreation(PortalCreateEvent event) {
@ -1719,6 +1743,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
if (PlotSquared.get().getPlotAreaManager().getPlotAreasSet(world).size() == 0) { if (PlotSquared.get().getPlotAreaManager().getPlotAreasSet(world).size() == 0) {
return; return;
} }
BukkitPlayer pp = (event.getEntity() instanceof Player player) ? BukkitUtil.adapt(player) : null;
int minX = Integer.MAX_VALUE; int minX = Integer.MAX_VALUE;
int maxX = Integer.MIN_VALUE; int maxX = Integer.MIN_VALUE;
int minZ = Integer.MAX_VALUE; int minZ = Integer.MAX_VALUE;
@ -1730,19 +1755,23 @@ public class PlayerEventListener extends PlotListener implements Listener {
maxZ = Math.max(state.getZ(), maxZ); maxZ = Math.max(state.getZ(), maxZ);
} }
int y = event.getBlocks().get(0).getY(); // Don't need to worry about this too much int y = event.getBlocks().get(0).getY(); // Don't need to worry about this too much
for (Location location : Set.of( // Use Set to lazily avoid duplicate locations for (Location location : List.of( // We don't care about duplicate locations
Location.at(world, minX, y, maxX), Location.at(world, minX, y, minZ),
Location.at(world, minZ, y, maxZ),
Location.at(world, minX, y, maxZ), Location.at(world, minX, y, maxZ),
Location.at(world, minZ, y, maxX) Location.at(world, maxX, y, minZ),
Location.at(world, maxX, y, maxZ)
)) { )) {
PlotArea area = location.getPlotArea(); PlotArea area = location.getPlotArea();
if (area == null) { if (area == null) {
continue; continue;
} }
if (area.notifyIfOutsideBuildArea(pp, location.getY())) {
event.setCancelled(true);
return;
}
Plot plot = location.getOwnedPlot(); Plot plot = location.getOwnedPlot();
if (plot == null) { if (plot == null) {
if (area.isRoadFlags() && area.getRoadFlag(DenyPortalsFlag.class)) { if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, DenyPortalsFlag.class, true)) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -1771,17 +1800,15 @@ public class PlayerEventListener extends PlotListener implements Listener {
} }
Plot plot = location.getOwnedPlot(); Plot plot = location.getOwnedPlot();
if (plot == null) { if (plot == null) {
if (area.isRoadFlags() && area.getRoadFlag(LecternReadBookFlag.class)) { if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, LecternReadBookFlag.class, true)) {
event.setCancelled(true); event.setCancelled(true);
} }
return; return;
} }
if (plot.getFlag(LecternReadBookFlag.class)) {
if (plot.getFlag(LecternReadBookFlag.class)) { if (plot.getFlag(LecternReadBookFlag.class)) {
plot.debug(event.getPlayer().getName() + " could not take the book because of lectern-read-book = true"); plot.debug(event.getPlayer().getName() + " could not take the book because of lectern-read-book = true");
event.setCancelled(true); event.setCancelled(true);
} }
} }
}
} }

View File

@ -31,6 +31,7 @@ import com.plotsquared.core.plot.PlotHandler;
import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag; import com.plotsquared.core.plot.flag.implementations.ProjectilesFlag;
import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.PlotFlagUtil;
import net.kyori.adventure.text.minimessage.Template; import net.kyori.adventure.text.minimessage.Template;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
@ -89,7 +90,7 @@ public class ProjectileEventListener implements Listener {
} }
} }
@EventHandler @EventHandler(ignoreCancelled = true)
public void onProjectileLaunch(ProjectileLaunchEvent event) { public void onProjectileLaunch(ProjectileLaunchEvent event) {
Projectile entity = event.getEntity(); Projectile entity = event.getEntity();
ProjectileSource shooter = entity.getShooter(); ProjectileSource shooter = entity.getShooter();
@ -97,14 +98,18 @@ public class ProjectileEventListener implements Listener {
return; return;
} }
Location location = BukkitUtil.adapt(entity.getLocation()); Location location = BukkitUtil.adapt(entity.getLocation());
if (!this.plotAreaManager.hasPlotArea(location.getWorldName())) { PlotArea area = location.getPlotArea();
if (area == null) {
return; return;
} }
PlotPlayer<Player> pp = BukkitUtil.adapt((Player) shooter); PlotPlayer<Player> pp = BukkitUtil.adapt((Player) shooter);
Plot plot = location.getOwnedPlot(); Plot plot = location.getOwnedPlot();
if (plot == null) { if (plot == null) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_ROAD)) { if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true) && !Permissions.hasPermission(
pp,
Permission.PERMISSION_ADMIN_PROJECTILE_ROAD
)) {
pp.sendMessage( pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"), TranslatableCaption.of("permission.no_permission_event"),
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_ROAD)) Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_PROJECTILE_ROAD))
@ -149,9 +154,26 @@ public class ProjectileEventListener implements Listener {
Plot plot = area.getPlot(location); Plot plot = area.getPlot(location);
ProjectileSource shooter = entity.getShooter(); ProjectileSource shooter = entity.getShooter();
if (shooter instanceof Player) { if (shooter instanceof Player) {
if (!((Player) shooter).isOnline()) {
if (plot != null) {
if (plot.isAdded(((Player) shooter).getUniqueId()) || plot.getFlag(ProjectilesFlag.class)) {
return;
}
} else if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true)) {
return;
}
entity.remove();
event.setCancelled(true);
return;
}
PlotPlayer<?> pp = BukkitUtil.adapt((Player) shooter); PlotPlayer<?> pp = BukkitUtil.adapt((Player) shooter);
if (plot == null) { if (plot == null) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED)) { if (!PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, ProjectilesFlag.class, true) && !Permissions.hasPermission(
pp,
Permission.PERMISSION_ADMIN_PROJECTILE_UNOWNED
)) {
entity.remove(); entity.remove();
event.setCancelled(true); event.setCancelled(true);
} }
@ -182,7 +204,6 @@ public class ProjectileEventListener implements Listener {
if (sPlot == null || !PlotHandler.sameOwners(plot, sPlot)) { if (sPlot == null || !PlotHandler.sameOwners(plot, sPlot)) {
entity.remove(); entity.remove();
event.setCancelled(true); event.setCancelled(true);
return;
} }
} }
} }

View File

@ -0,0 +1,57 @@
/*
* PlotSquared, a land and world management plugin for Minecraft.
* Copyright (C) IntellectualSites <https://intellectualsites.com>
* Copyright (C) IntellectualSites team and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.plotsquared.bukkit.listener;
import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.flag.FlagContainer;
import com.plotsquared.core.plot.flag.implementations.BeaconEffectsFlag;
import org.bukkit.entity.Entity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityPotionEffectEvent;
import org.checkerframework.checker.nullness.qual.NonNull;
/**
* Fallback listener for paper events on spigot
*/
public class SpigotListener implements Listener {
@EventHandler(ignoreCancelled = true)
public void onEffect(@NonNull EntityPotionEffectEvent event) {
if (event.getCause() != EntityPotionEffectEvent.Cause.BEACON) {
return;
}
Entity entity = event.getEntity();
Location location = BukkitUtil.adapt(entity.getLocation());
Plot plot = location.getPlot();
if (plot == null) {
return;
}
FlagContainer container = plot.getFlagContainer();
BeaconEffectsFlag effectsEnabled = container.getFlag(BeaconEffectsFlag.class);
if (effectsEnabled != null && !effectsEnabled.getValue()) {
event.setCancelled(true);
}
}
}

View File

@ -30,8 +30,9 @@ import org.checkerframework.checker.nullness.qual.Nullable;
* *
* @deprecated Deprecated and scheduled for removal without replacement * @deprecated Deprecated and scheduled for removal without replacement
* in favor of the build in setup wizard. * in favor of the build in setup wizard.
* However, this class will be kept around for a while, given it's not a maintenance burden.
*/ */
@Deprecated(forRemoval = true, since = "6.0.0") @Deprecated
@Singleton @Singleton
public class MultiverseWorldManager extends BukkitWorldManager { public class MultiverseWorldManager extends BukkitWorldManager {

View File

@ -47,13 +47,13 @@ import org.bukkit.event.EventException;
import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.permissions.PermissionAttachmentInfo;
import org.bukkit.plugin.RegisteredListener; import org.bukkit.plugin.RegisteredListener;
import org.bukkit.potion.PotionEffectType;
import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.index.qual.NonNegative;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.Arrays; import java.util.Arrays;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors;
import static com.sk89q.worldedit.world.gamemode.GameModes.ADVENTURE; import static com.sk89q.worldedit.world.gamemode.GameModes.ADVENTURE;
import static com.sk89q.worldedit.world.gamemode.GameModes.CREATIVE; import static com.sk89q.worldedit.world.gamemode.GameModes.CREATIVE;
@ -67,14 +67,15 @@ public class BukkitPlayer extends PlotPlayer<Player> {
private String name; private String name;
/** /**
* <p>Please do not use this method. Instead use
* BukkitUtil.getPlayer(Player), as it caches player objects.</p>
*
* @param plotAreaManager PlotAreaManager instance * @param plotAreaManager PlotAreaManager instance
* @param eventDispatcher EventDispatcher instance * @param eventDispatcher EventDispatcher instance
* @param player Bukkit player instance * @param player Bukkit player instance
* @param permissionHandler PermissionHandler instance * @param permissionHandler PermissionHandler instance
*
* @deprecated Please do not use this method. Instead use {@link BukkitUtil#adapt(Player)}, as it caches player objects.
* This method will be made private in a future release.
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public BukkitPlayer( public BukkitPlayer(
final @NonNull PlotAreaManager plotAreaManager, final @NonNull EventDispatcher eventDispatcher, final @NonNull PlotAreaManager plotAreaManager, final @NonNull EventDispatcher eventDispatcher,
final @NonNull Player player, final @NonNull PermissionHandler permissionHandler final @NonNull Player player, final @NonNull PermissionHandler permissionHandler
@ -82,6 +83,16 @@ public class BukkitPlayer extends PlotPlayer<Player> {
this(plotAreaManager, eventDispatcher, player, false, permissionHandler); this(plotAreaManager, eventDispatcher, player, false, permissionHandler);
} }
/**
* @param plotAreaManager PlotAreaManager instance
* @param eventDispatcher EventDispatcher instance
* @param player Bukkit player instance
* @param permissionHandler PermissionHandler instance
*
* @deprecated Please do not use this method. Instead use {@link BukkitUtil#adapt(Player)}, as it caches player objects.
* This method will be made private in a future release.
*/
@Deprecated(forRemoval = true, since = "TODO")
public BukkitPlayer( public BukkitPlayer(
final @NonNull PlotAreaManager plotAreaManager, final @NonNull final @NonNull PlotAreaManager plotAreaManager, final @NonNull
EventDispatcher eventDispatcher, final @NonNull Player player, EventDispatcher eventDispatcher, final @NonNull Player player,
@ -348,6 +359,14 @@ public class BukkitPlayer extends PlotPlayer<Player> {
return BukkitUtil.BUKKIT_AUDIENCES.player(this.player); return BukkitUtil.BUKKIT_AUDIENCES.player(this.player);
} }
@Override
public void removeEffect(@NonNull String name) {
PotionEffectType type = PotionEffectType.getByName(name);
if (type != null) {
player.removePotionEffect(type);
}
}
@Override @Override
public boolean canSee(final PlotPlayer<?> other) { public boolean canSee(final PlotPlayer<?> other) {
if (other instanceof ConsolePlayer) { if (other instanceof ConsolePlayer) {

View File

@ -54,6 +54,7 @@ public class BukkitPlayerManager extends PlayerManager<BukkitPlayer, Player> {
@NonNull @NonNull
@Override @Override
@SuppressWarnings("deprecation")
public BukkitPlayer getPlayer(final @NonNull Player object) { public BukkitPlayer getPlayer(final @NonNull Player object) {
if (object.getUniqueId().version() == 2) { // not a real player if (object.getUniqueId().version() == 2) { // not a real player
return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, object, false, this.permissionHandler); return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, object, false, this.permissionHandler);
@ -65,6 +66,7 @@ public class BukkitPlayerManager extends PlayerManager<BukkitPlayer, Player> {
} }
@Override @Override
@SuppressWarnings("deprecation")
public @NonNull BukkitPlayer createPlayer(final @NonNull UUID uuid) { public @NonNull BukkitPlayer createPlayer(final @NonNull UUID uuid) {
final Player player = Bukkit.getPlayer(uuid); final Player player = Bukkit.getPlayer(uuid);
if (player == null || !player.isOnline()) { if (player == null || !player.isOnline()) {

View File

@ -19,12 +19,12 @@
package com.plotsquared.bukkit.queue; package com.plotsquared.bukkit.queue;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.intellectualsites.annotations.DoNotUse;
import com.plotsquared.bukkit.util.BukkitBlockUtil; import com.plotsquared.bukkit.util.BukkitBlockUtil;
import com.plotsquared.bukkit.util.BukkitUtil; import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.core.location.ChunkWrapper; import com.plotsquared.core.location.ChunkWrapper;
import com.plotsquared.core.location.Location; import com.plotsquared.core.location.Location;
import com.plotsquared.core.queue.ScopedQueueCoordinator; import com.plotsquared.core.queue.ScopedQueueCoordinator;
import com.plotsquared.core.util.AnnotationHelper;
import com.plotsquared.core.util.ChunkUtil; import com.plotsquared.core.util.ChunkUtil;
import com.plotsquared.core.util.PatternUtil; import com.plotsquared.core.util.PatternUtil;
import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.BukkitAdapter;
@ -44,7 +44,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.Arrays; import java.util.Arrays;
@AnnotationHelper.ApiDescription(info = "Internal use only. Subject to changes at any time.") @DoNotUse
public class GenChunk extends ScopedQueueCoordinator { public class GenChunk extends ScopedQueueCoordinator {
public final Biome[] biomes; public final Biome[] biomes;
@ -183,7 +183,11 @@ public class GenChunk extends ScopedQueueCoordinator {
@Override @Override
public boolean setBlock(int x, int y, int z, @NonNull Pattern pattern) { public boolean setBlock(int x, int y, int z, @NonNull Pattern pattern) {
return setBlock(x, y, z, PatternUtil.apply(Preconditions.checkNotNull(pattern, "Pattern may not be null"), x, y, z)); final BaseBlock block = PatternUtil.apply(Preconditions.checkNotNull(
pattern,
"Pattern may not be null"
), x + (chunkX << 4), y, z + (chunkZ << 4));
return setBlock(x, y, z, block);
} }
@Override @Override

View File

@ -27,7 +27,7 @@ import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
@ -41,9 +41,10 @@ import org.checkerframework.checker.nullness.qual.NonNull;
*/ */
public class LimitedRegionWrapperQueue extends DelegateQueueCoordinator { public class LimitedRegionWrapperQueue extends DelegateQueueCoordinator {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + LimitedRegionWrapperQueue.class.getSimpleName());
private final LimitedRegion limitedRegion; private final LimitedRegion limitedRegion;
private boolean useOtherRestoreTagMethod = false;
/** /**
* @since 6.9.0 * @since 6.9.0
@ -65,10 +66,18 @@ public class LimitedRegionWrapperQueue extends DelegateQueueCoordinator {
CompoundTag tag = id.getNbtData(); CompoundTag tag = id.getNbtData();
StateWrapper sw = new StateWrapper(tag); StateWrapper sw = new StateWrapper(tag);
try { try {
if (useOtherRestoreTagMethod && getWorld() != null) {
sw.restoreTag(getWorld().getName(), x, y, z);
} else {
sw.restoreTag(limitedRegion.getBlockState(x, y, z).getBlock()); sw.restoreTag(limitedRegion.getBlockState(x, y, z).getBlock());
}
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
LOGGER.error("Error attempting to populate tile entity into the world at location {},{},{}", x, y, z, e); LOGGER.error("Error attempting to populate tile entity into the world at location {},{},{}", x, y, z, e);
return false; return false;
} catch (IllegalStateException e) {
useOtherRestoreTagMethod = true;
LOGGER.warn("IllegalStateException attempting to populate tile entity into the world at location {},{},{}. " +
"Possibly on <=1.17.1, switching to secondary method.", x, y, z, e);
} }
} }
return result; return result;

View File

@ -47,7 +47,7 @@ import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.Template; import net.kyori.adventure.text.minimessage.Template;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Chunk; import org.bukkit.Chunk;
@ -58,6 +58,7 @@ import org.bukkit.block.BlockFace;
import org.bukkit.block.Sign; import org.bukkit.block.Sign;
import org.bukkit.block.data.Directional; import org.bukkit.block.data.Directional;
import org.bukkit.block.data.type.WallSign; import org.bukkit.block.data.type.WallSign;
import org.bukkit.entity.Allay;
import org.bukkit.entity.Ambient; import org.bukkit.entity.Ambient;
import org.bukkit.entity.Animals; import org.bukkit.entity.Animals;
import org.bukkit.entity.AreaEffectCloud; import org.bukkit.entity.AreaEffectCloud;
@ -108,7 +109,7 @@ public class BukkitUtil extends WorldUtil {
public static final BukkitAudiences BUKKIT_AUDIENCES = BukkitAudiences.create(BukkitPlatform.getPlugin(BukkitPlatform.class)); public static final BukkitAudiences BUKKIT_AUDIENCES = BukkitAudiences.create(BukkitPlatform.getPlugin(BukkitPlatform.class));
public static final LegacyComponentSerializer LEGACY_COMPONENT_SERIALIZER = LegacyComponentSerializer.legacySection(); public static final LegacyComponentSerializer LEGACY_COMPONENT_SERIALIZER = LegacyComponentSerializer.legacySection();
public static final MiniMessage MINI_MESSAGE = MiniMessage.builder().build(); public static final MiniMessage MINI_MESSAGE = MiniMessage.builder().build();
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BukkitUtil.class.getSimpleName());
private final Collection<BlockType> tileEntityTypes = new HashSet<>(); private final Collection<BlockType> tileEntityTypes = new HashSet<>();
/** /**
@ -437,6 +438,9 @@ public class BukkitUtil extends WorldUtil {
allowedInterfaces.add(Animals.class); allowedInterfaces.add(Animals.class);
allowedInterfaces.add(WaterMob.class); allowedInterfaces.add(WaterMob.class);
allowedInterfaces.add(Ambient.class); allowedInterfaces.add(Ambient.class);
if (PlotSquared.platform().serverVersion()[1] >= 19) {
allowedInterfaces.add(Allay.class);
}
} }
case "tameable" -> allowedInterfaces.add(Tameable.class); case "tameable" -> allowedInterfaces.add(Tameable.class);
case "vehicle" -> allowedInterfaces.add(Vehicle.class); case "vehicle" -> allowedInterfaces.add(Vehicle.class);

View File

@ -26,7 +26,7 @@ import com.sk89q.worldedit.bukkit.BukkitWorld;
import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.World; import org.bukkit.World;
@ -40,7 +40,7 @@ import java.util.Set;
public class ContentMap { public class ContentMap {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + ContentMap.class.getSimpleName());
final Set<EntityWrapper> entities; final Set<EntityWrapper> entities;
final Map<PlotLoc, BaseBlock[]> allBlocks; final Map<PlotLoc, BaseBlock[]> allBlocks;

View File

@ -25,7 +25,7 @@ import com.google.inject.Inject;
import com.plotsquared.core.PlotSquared; import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.PlotVersion; import com.plotsquared.core.PlotVersion;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@ -39,7 +39,7 @@ import java.net.URL;
public class UpdateUtility implements Listener { public class UpdateUtility implements Listener {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + UpdateUtility.class.getSimpleName());
public static PlotVersion internalVersion; public static PlotVersion internalVersion;
public static String spigotVersion; public static String spigotVersion;

View File

@ -36,8 +36,7 @@ import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.biome.BiomeType;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.NotNull; import org.checkerframework.checker.nullness.qual.Nullable;
import org.jetbrains.annotations.Nullable;
import java.util.Set; import java.util.Set;
@ -46,10 +45,7 @@ public class FaweRegionManager extends BukkitRegionManager {
private final FaweDelegateRegionManager delegate = new FaweDelegateRegionManager(); private final FaweDelegateRegionManager delegate = new FaweDelegateRegionManager();
@Inject @Inject
public FaweRegionManager( public FaweRegionManager(WorldUtil worldUtil, GlobalBlockQueue blockQueue, ProgressSubscriberFactory subscriberFactory) {
@NonNull WorldUtil worldUtil, @NonNull GlobalBlockQueue blockQueue, @NonNull
ProgressSubscriberFactory subscriberFactory
) {
super(worldUtil, blockQueue, subscriberFactory); super(worldUtil, blockQueue, subscriberFactory);
} }
@ -76,9 +72,9 @@ public class FaweRegionManager extends BukkitRegionManager {
@Override @Override
public boolean handleClear( public boolean handleClear(
@NotNull Plot plot, @NonNull Plot plot,
@Nullable Runnable whenDone, @Nullable Runnable whenDone,
@NotNull PlotManager manager, @NonNull PlotManager manager,
final @Nullable PlotPlayer<?> player final @Nullable PlotPlayer<?> player
) { ) {
if (!Settings.FAWE_Components.CLEAR || !(manager instanceof HybridPlotManager)) { if (!Settings.FAWE_Components.CLEAR || !(manager instanceof HybridPlotManager)) {

View File

@ -29,7 +29,7 @@ import com.plotsquared.core.util.SchematicHandler;
import com.plotsquared.core.util.WorldUtil; import com.plotsquared.core.util.WorldUtil;
import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.RunnableVal;
import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.CompoundTag;
import org.jetbrains.annotations.NotNull; import org.checkerframework.checker.nullness.qual.NonNull;
import java.io.InputStream; import java.io.InputStream;
import java.net.URL; import java.net.URL;
@ -40,7 +40,7 @@ public class FaweSchematicHandler extends SchematicHandler {
private final FaweDelegateSchematicHandler delegate = new FaweDelegateSchematicHandler(); private final FaweDelegateSchematicHandler delegate = new FaweDelegateSchematicHandler();
@Inject @Inject
public FaweSchematicHandler(@NotNull WorldUtil worldUtil, @NotNull ProgressSubscriberFactory subscriberFactory) { public FaweSchematicHandler(WorldUtil worldUtil, ProgressSubscriberFactory subscriberFactory) {
super(worldUtil, subscriberFactory); super(worldUtil, subscriberFactory);
} }
@ -75,7 +75,7 @@ public class FaweSchematicHandler extends SchematicHandler {
} }
@Override @Override
public Schematic getSchematic(@NotNull InputStream is) { public Schematic getSchematic(@NonNull InputStream is) {
return delegate.getSchematic(is); return delegate.getSchematic(is);
} }

View File

@ -22,7 +22,7 @@ import com.google.common.util.concurrent.RateLimiter;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.uuid.UUIDMapping; import com.plotsquared.core.uuid.UUIDMapping;
import com.plotsquared.core.uuid.UUIDService; import com.plotsquared.core.uuid.UUIDService;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.enginehub.squirrelid.Profile; import org.enginehub.squirrelid.Profile;
@ -41,7 +41,7 @@ import java.util.UUID;
@SuppressWarnings("UnstableApiUsage") @SuppressWarnings("UnstableApiUsage")
public class SquirrelIdUUIDService implements UUIDService { public class SquirrelIdUUIDService implements UUIDService {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + SquirrelIdUUIDService.class.getSimpleName());
private final ProfileService profileService; private final ProfileService profileService;
private final RateLimiter rateLimiter; private final RateLimiter rateLimiter;

View File

@ -43,6 +43,7 @@ dependencies {
api(libs.cloudServices) api(libs.cloudServices)
api(libs.arkitektonika) api(libs.arkitektonika)
api("com.intellectualsites.paster:Paster") api("com.intellectualsites.paster:Paster")
api("com.intellectualsites.informative-annotations:informative-annotations")
} }
tasks.processResources { tasks.processResources {
@ -53,14 +54,29 @@ tasks.processResources {
"date" to rootProject.grgit.head().dateTime.format(DateTimeFormatter.ofPattern("yy.MM.dd")) "date" to rootProject.grgit.head().dateTime.format(DateTimeFormatter.ofPattern("yy.MM.dd"))
) )
} }
doLast {
copy {
from(File("$rootDir/LICENSE"))
into("$buildDir/resources/main/")
}
}
} }
tasks { tasks {
withType<Javadoc> { withType<Javadoc> {
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
val opt = options as StandardJavadocDocletOptions val opt = options as StandardJavadocDocletOptions
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/" + libs.worldeditCore.get().versionConstraint.toString()) opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/" + libs.worldeditCore.get().versionConstraint.toString())
opt.links("https://jd.adventure.kyori.net/api/4.9.3/") opt.links("https://jd.adventure.kyori.net/api/4.9.3/")
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/") opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
opt.links("https://checkerframework.org/api/") opt.links("https://checkerframework.org/api/")
opt.links("https://javadoc.io/doc/com.intellectualsites.informative-annotations/informative-annotations/latest/")
opt.isLinkSource = true
opt.bottom(File("$rootDir/javadocfooter.html").readText())
opt.isUse = true
opt.encoding("UTF-8")
opt.keyWords()
opt.addStringOption("-since", isRelease)
} }
} }

View File

@ -22,6 +22,7 @@ import cloud.commandframework.services.ServicePipeline;
import com.google.inject.Injector; import com.google.inject.Injector;
import com.google.inject.Key; import com.google.inject.Key;
import com.google.inject.TypeLiteral; import com.google.inject.TypeLiteral;
import com.intellectualsites.annotations.DoNotUse;
import com.plotsquared.core.backup.BackupManager; import com.plotsquared.core.backup.BackupManager;
import com.plotsquared.core.configuration.caption.LocaleHolder; import com.plotsquared.core.configuration.caption.LocaleHolder;
import com.plotsquared.core.generator.GeneratorWrapper; import com.plotsquared.core.generator.GeneratorWrapper;
@ -31,9 +32,9 @@ import com.plotsquared.core.inject.annotations.DefaultGenerator;
import com.plotsquared.core.location.World; import com.plotsquared.core.location.World;
import com.plotsquared.core.permissions.PermissionHandler; import com.plotsquared.core.permissions.PermissionHandler;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.expiration.ExpireManager;
import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.queue.GlobalBlockQueue;
import com.plotsquared.core.util.AnnotationHelper;
import com.plotsquared.core.util.ChunkManager; import com.plotsquared.core.util.ChunkManager;
import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.EconHandler;
import com.plotsquared.core.util.PlatformWorldManager; import com.plotsquared.core.util.PlatformWorldManager;
@ -75,6 +76,11 @@ public interface PlotPlatform<P> extends LocaleHolder {
*/ */
void shutdown(); void shutdown();
/**
* Completely shuts down the server.
*/
void shutdownServer();
/** /**
* Get the name of the plugin * Get the name of the plugin
* *
@ -279,6 +285,16 @@ public interface PlotPlatform<P> extends LocaleHolder {
return injector().getInstance(ChunkManager.class); return injector().getInstance(ChunkManager.class);
} }
/**
* Get the {@link ExpireManager} implementation for the platform
*
* @return Expire manager
* @since 6.10.2
*/
default @NonNull ExpireManager expireManager() {
return injector().getInstance(ExpireManager.class);
}
/** /**
* Get the {@link PlotAreaManager} implementation. * Get the {@link PlotAreaManager} implementation.
* *
@ -308,7 +324,7 @@ public interface PlotPlatform<P> extends LocaleHolder {
* @return worldedit implementations * @return worldedit implementations
* @since 6.3.0 * @since 6.3.0
*/ */
@AnnotationHelper.ApiDescription(info = "Internal use only") @DoNotUse
@NonNull String worldEditImplementations(); @NonNull String worldEditImplementations();
/** /**

View File

@ -69,7 +69,7 @@ import com.sk89q.worldedit.event.platform.PlatformReadyEvent;
import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.util.eventbus.EventHandler; import com.sk89q.worldedit.util.eventbus.EventHandler;
import com.sk89q.worldedit.util.eventbus.Subscribe; import com.sk89q.worldedit.util.eventbus.Subscribe;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
@ -117,7 +117,7 @@ import java.util.zip.ZipInputStream;
@SuppressWarnings({"WeakerAccess"}) @SuppressWarnings({"WeakerAccess"})
public class PlotSquared { public class PlotSquared {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + PlotSquared.class.getSimpleName());
private static @MonotonicNonNull PlotSquared instance; private static @MonotonicNonNull PlotSquared instance;
// Implementation // Implementation
@ -197,6 +197,9 @@ public class PlotSquared {
this.loadCaptionMap(); this.loadCaptionMap();
} catch (final Exception e) { } catch (final Exception e) {
LOGGER.error("Failed to load caption map", e); LOGGER.error("Failed to load caption map", e);
LOGGER.error("Shutting down server to prevent further issues");
this.platform.shutdownServer();
throw new RuntimeException("Abort loading PlotSquared");
} }
// Setup the global flag container // Setup the global flag container
@ -267,7 +270,7 @@ public class PlotSquared {
captionMap = this.captionLoader.loadAll(this.platform.getDirectory().toPath().resolve("lang")); captionMap = this.captionLoader.loadAll(this.platform.getDirectory().toPath().resolve("lang"));
} else { } else {
String fileName = "messages_" + Settings.Enabled_Components.DEFAULT_LOCALE + ".json"; String fileName = "messages_" + Settings.Enabled_Components.DEFAULT_LOCALE + ".json";
captionMap = this.captionLoader.loadSingle(this.platform.getDirectory().toPath().resolve("lang").resolve(fileName)); captionMap = this.captionLoader.loadOrCreateSingle(this.platform.getDirectory().toPath().resolve("lang").resolve(fileName));
} }
this.captionMaps.put(TranslatableCaption.DEFAULT_NAMESPACE, captionMap); this.captionMaps.put(TranslatableCaption.DEFAULT_NAMESPACE, captionMap);
LOGGER.info( LOGGER.info(
@ -287,11 +290,11 @@ public class PlotSquared {
public void startExpiryTasks() { public void startExpiryTasks() {
if (Settings.Enabled_Components.PLOT_EXPIRY) { if (Settings.Enabled_Components.PLOT_EXPIRY) {
ExpireManager.IMP = new ExpireManager(this.eventDispatcher); ExpireManager expireManager = PlotSquared.platform().expireManager();
ExpireManager.IMP.runAutomatedTask(); expireManager.runAutomatedTask();
for (Settings.Auto_Clear settings : Settings.AUTO_CLEAR.getInstances()) { for (Settings.Auto_Clear settings : Settings.AUTO_CLEAR.getInstances()) {
ExpiryTask task = new ExpiryTask(settings, this.getPlotAreaManager()); ExpiryTask task = new ExpiryTask(settings, this.getPlotAreaManager());
ExpireManager.IMP.addTask(task); expireManager.addTask(task);
} }
} }
} }
@ -642,7 +645,8 @@ public class PlotSquared {
} else { } else {
list = new ArrayList<>(input); list = new ArrayList<>(input);
} }
list.sort(Comparator.comparingLong(a -> ExpireManager.IMP.getTimestamp(a.getOwnerAbs()))); ExpireManager expireManager = PlotSquared.platform().expireManager();
list.sort(Comparator.comparingLong(a -> expireManager.getTimestamp(a.getOwnerAbs())));
return list; return list;
} }

View File

@ -251,6 +251,7 @@ public class Auto extends SubCommand {
TranslatableCaption.of("permission.no_permission"), TranslatableCaption.of("permission.no_permission"),
Template.of("node", String.valueOf(Permission.PERMISSION_AUTO_MEGA)) Template.of("node", String.valueOf(Permission.PERMISSION_AUTO_MEGA))
); );
return false;
} }
if (!force && sizeX * sizeZ > Settings.Claim.MAX_AUTO_AREA) { if (!force && sizeX * sizeZ > Settings.Claim.MAX_AUTO_AREA) {
player.sendMessage( player.sendMessage(

View File

@ -126,6 +126,7 @@ public class Buy extends Command {
plot.removeFlag(event.getFlag()); plot.removeFlag(event.getFlag());
} }
plot.setOwner(player.getUUID()); plot.setOwner(player.getUUID());
plot.getPlotModificationManager().setSign(player.getName());
player.sendMessage( player.sendMessage(
TranslatableCaption.of("working.claimed"), TranslatableCaption.of("working.claimed"),
Template.of("plot", plot.getId().toString()) Template.of("plot", plot.getId().toString())

View File

@ -39,7 +39,7 @@ import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.PlotExpression; import com.plotsquared.core.util.PlotExpression;
import com.plotsquared.core.util.task.TaskManager; import com.plotsquared.core.util.task.TaskManager;
import net.kyori.adventure.text.minimessage.Template; import net.kyori.adventure.text.minimessage.Template;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
@ -51,7 +51,7 @@ import org.checkerframework.checker.nullness.qual.NonNull;
usage = "/plot claim") usage = "/plot claim")
public class Claim extends SubCommand { public class Claim extends SubCommand {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + Claim.class.getSimpleName());
private final EventDispatcher eventDispatcher; private final EventDispatcher eventDispatcher;
private final EconHandler econHandler; private final EconHandler econHandler;

View File

@ -176,7 +176,7 @@ public class DatabaseCommand extends SubCommand {
); );
worldFile.renameTo(newFile); worldFile.renameTo(newFile);
} }
plot.setId(newId.copy()); plot.setId(newId);
plot.setArea(pa); plot.setArea(pa);
plots.add(plot); plots.add(plot);
continue; continue;

View File

@ -19,6 +19,7 @@
package com.plotsquared.core.command; package com.plotsquared.core.command;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.caption.StaticCaption; import com.plotsquared.core.configuration.caption.StaticCaption;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.events.PlotFlagRemoveEvent; import com.plotsquared.core.events.PlotFlagRemoveEvent;
@ -139,10 +140,7 @@ public class DebugExec extends SubCommand {
return true; return true;
} }
case "start-expire" -> { case "start-expire" -> {
if (ExpireManager.IMP == null) { if (PlotSquared.platform().expireManager().runAutomatedTask()) {
ExpireManager.IMP = new ExpireManager(this.eventDispatcher);
}
if (ExpireManager.IMP.runAutomatedTask()) {
player.sendMessage(TranslatableCaption.of("debugexec.expiry_started")); player.sendMessage(TranslatableCaption.of("debugexec.expiry_started"));
} else { } else {
player.sendMessage(TranslatableCaption.of("debugexec.expiry_already_started")); player.sendMessage(TranslatableCaption.of("debugexec.expiry_already_started"));
@ -150,7 +148,7 @@ public class DebugExec extends SubCommand {
return true; return true;
} }
case "stop-expire" -> { case "stop-expire" -> {
if (ExpireManager.IMP == null || !ExpireManager.IMP.cancelTask()) { if (!PlotSquared.platform().expireManager().cancelTask()) {
player.sendMessage(TranslatableCaption.of("debugexec.task_halted")); player.sendMessage(TranslatableCaption.of("debugexec.task_halted"));
} else { } else {
player.sendMessage(TranslatableCaption.of("debugexec.task_cancelled")); player.sendMessage(TranslatableCaption.of("debugexec.task_cancelled"));

View File

@ -19,6 +19,7 @@
package com.plotsquared.core.command; package com.plotsquared.core.command;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.events.PlotDoneEvent; import com.plotsquared.core.events.PlotDoneEvent;
@ -29,7 +30,6 @@ import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.expiration.ExpireManager;
import com.plotsquared.core.plot.expiration.PlotAnalysis; import com.plotsquared.core.plot.expiration.PlotAnalysis;
import com.plotsquared.core.plot.flag.PlotFlag; import com.plotsquared.core.plot.flag.PlotFlag;
import com.plotsquared.core.plot.flag.implementations.DoneFlag; import com.plotsquared.core.plot.flag.implementations.DoneFlag;
@ -94,7 +94,7 @@ public class Done extends SubCommand {
Template.of("plot", plot.getId().toString()) Template.of("plot", plot.getId().toString())
); );
final Settings.Auto_Clear doneRequirements = Settings.AUTO_CLEAR.get("done"); final Settings.Auto_Clear doneRequirements = Settings.AUTO_CLEAR.get("done");
if (ExpireManager.IMP == null || doneRequirements == null) { if (PlotSquared.platform().expireManager() == null || doneRequirements == null) {
finish(plot, player, true); finish(plot, player, true);
plot.removeRunning(); plot.removeRunning();
} else { } else {

View File

@ -181,6 +181,7 @@ public class Download extends SubCommand {
schematicHandler.upload(compoundTag, null, null, new RunnableVal<>() { schematicHandler.upload(compoundTag, null, null, new RunnableVal<>() {
@Override @Override
public void run(URL value) { public void run(URL value) {
plot.removeRunning();
player.sendMessage( player.sendMessage(
TranslatableCaption.of("web.generation_link_success"), TranslatableCaption.of("web.generation_link_success"),
Template.of("download", value.toString()), Template.of("download", value.toString()),

View File

@ -462,6 +462,7 @@ public final class FlagCommand extends Command {
return; return;
} }
final Plot plot = player.getLocation().getPlotAbs(); final Plot plot = player.getLocation().getPlotAbs();
final PlotFlag<?, ?> flagWithOldValue = plot.getFlagContainer().getFlag(flag.getClass());
PlotFlagRemoveEvent event = eventDispatcher.callFlagRemove(flag, plot); PlotFlagRemoveEvent event = eventDispatcher.callFlagRemove(flag, plot);
if (event.getEventResult() == Result.DENY) { if (event.getEventResult() == Result.DENY) {
player.sendMessage( player.sendMessage(
@ -506,7 +507,7 @@ public final class FlagCommand extends Command {
if (plot.removeFlag(flag)) { if (plot.removeFlag(flag)) {
player.sendMessage(TranslatableCaption.of("flag.flag_removed"), Template.of("flag", args[0]), Template.of( player.sendMessage(TranslatableCaption.of("flag.flag_removed"), Template.of("flag", args[0]), Template.of(
"value", "value",
String.valueOf(flag) String.valueOf(flagWithOldValue)
)); ));
return; return;
} else { } else {
@ -544,7 +545,7 @@ public final class FlagCommand extends Command {
} }
player.sendMessage(TranslatableCaption.of("flag.flag_removed"), Template.of("flag", args[0]), Template.of( player.sendMessage(TranslatableCaption.of("flag.flag_removed"), Template.of("flag", args[0]), Template.of(
"value", "value",
String.valueOf(flag) String.valueOf(flagWithOldValue)
)); ));
} }

View File

@ -32,7 +32,6 @@ import com.plotsquared.core.util.TabCompletions;
import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.RunnableVal;
import com.plotsquared.core.util.task.RunnableVal2; import com.plotsquared.core.util.task.RunnableVal2;
import com.plotsquared.core.util.task.RunnableVal3; import com.plotsquared.core.util.task.RunnableVal3;
import com.plotsquared.core.uuid.UUIDMapping;
import net.kyori.adventure.text.minimessage.Template; import net.kyori.adventure.text.minimessage.Template;
import java.util.Collection; import java.util.Collection;
@ -40,6 +39,7 @@ import java.util.Collections;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -88,8 +88,8 @@ public class Grant extends Command {
Template.of("value", String.valueOf(uuids)) Template.of("value", String.valueOf(uuids))
); );
} else { } else {
final UUIDMapping uuid = uuids.toArray(new UUIDMapping[0])[0]; final UUID uuid = uuids.iterator().next();
PlotPlayer<?> pp = PlotSquared.platform().playerManager().getPlayerIfExists(uuid.getUuid()); PlotPlayer<?> pp = PlotSquared.platform().playerManager().getPlayerIfExists(uuid);
if (pp != null) { if (pp != null) {
try (final MetaDataAccess<Integer> access = pp.accessPersistentMetaData( try (final MetaDataAccess<Integer> access = pp.accessPersistentMetaData(
PlayerMetaDataKeys.PERSISTENT_GRANTED_PLOTS)) { PlayerMetaDataKeys.PERSISTENT_GRANTED_PLOTS)) {
@ -103,7 +103,7 @@ public class Grant extends Command {
} }
} }
} else { } else {
DBFunc.getPersistentMeta(uuid.getUuid(), new RunnableVal<>() { DBFunc.getPersistentMeta(uuid, new RunnableVal<>() {
@Override @Override
public void run(Map<String, byte[]> value) { public void run(Map<String, byte[]> value) {
final byte[] array = value.get("grantedPlots"); final byte[] array = value.get("grantedPlots");
@ -128,7 +128,7 @@ public class Grant extends Command {
boolean replace = array != null; boolean replace = array != null;
String key = "grantedPlots"; String key = "grantedPlots";
byte[] rawData = Ints.toByteArray(amount); byte[] rawData = Ints.toByteArray(amount);
DBFunc.addPersistentMeta(uuid.getUuid(), key, rawData, replace); DBFunc.addPersistentMeta(uuid, key, rawData, replace);
player.sendMessage( player.sendMessage(
TranslatableCaption.of("grants.added"), TranslatableCaption.of("grants.added"),
Template.of("grants", String.valueOf(amount)) Template.of("grants", String.valueOf(amount))

View File

@ -30,7 +30,6 @@ import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.expiration.ExpireManager;
import com.plotsquared.core.plot.flag.implementations.DoneFlag; import com.plotsquared.core.plot.flag.implementations.DoneFlag;
import com.plotsquared.core.plot.flag.implementations.PriceFlag; import com.plotsquared.core.plot.flag.implementations.PriceFlag;
import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag; import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag;
@ -240,7 +239,7 @@ public class ListCmd extends SubCommand {
); );
return false; return false;
} }
if (ExpireManager.IMP == null) { if (PlotSquared.platform().expireManager() == null) {
plotConsumer.accept(PlotQuery.newQuery().noPlots()); plotConsumer.accept(PlotQuery.newQuery().noPlots());
} else { } else {
plotConsumer.accept(PlotQuery.newQuery().expiredPlots()); plotConsumer.accept(PlotQuery.newQuery().expiredPlots());

View File

@ -36,7 +36,7 @@ import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.PlotExpression; import com.plotsquared.core.util.PlotExpression;
import com.plotsquared.core.util.task.RunnableVal2; import com.plotsquared.core.util.task.RunnableVal2;
import com.plotsquared.core.util.task.RunnableVal3; import com.plotsquared.core.util.task.RunnableVal3;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import java.util.Arrays; import java.util.Arrays;
@ -51,7 +51,7 @@ import java.util.concurrent.CompletableFuture;
aliases = {"plots", "p", "plotsquared", "plot2", "p2", "ps", "2", "plotme", "plotz", "ap"}) aliases = {"plots", "p", "plotsquared", "plot2", "p2", "ps", "2", "plotme", "plotz", "ap"})
public class MainCommand extends Command { public class MainCommand extends Command {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + MainCommand.class.getSimpleName());
private static MainCommand instance; private static MainCommand instance;
public Help help; public Help help;

View File

@ -282,7 +282,28 @@ public class Merge extends SubCommand {
run.run(); run.run();
} }
} }
if (!force && !isOnline) { if (force || !isOnline) {
if (force || Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_COMMAND_MERGE_OTHER_OFFLINE)) {
if (plot.getPlotModificationManager().autoMerge(direction, maxSize - size, uuids.iterator().next(), player, terrain)) {
if (this.econHandler.isEnabled(plotArea) && price > 0d) {
if (!force && this.econHandler.getMoney(player) < price) {
player.sendMessage(
TranslatableCaption.of("economy.cannot_afford_merge"),
Template.of("money", this.econHandler.format(price))
);
return false;
}
this.econHandler.withdrawMoney(player, price);
player.sendMessage(
TranslatableCaption.of("economy.removed_balance"),
Template.of("money", this.econHandler.format(price))
);
}
player.sendMessage(TranslatableCaption.of("merge.success_merge"));
eventDispatcher.callPostMerge(player, plot);
return true;
}
}
player.sendMessage(TranslatableCaption.of("merge.no_available_automerge")); player.sendMessage(TranslatableCaption.of("merge.no_available_automerge"));
return false; return false;
} }

View File

@ -26,6 +26,7 @@ import com.plotsquared.core.util.task.RunnableVal2;
import com.plotsquared.core.util.task.RunnableVal3; import com.plotsquared.core.util.task.RunnableVal3;
import net.kyori.adventure.text.minimessage.Template; import net.kyori.adventure.text.minimessage.Template;
import java.util.List;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@CommandDeclaration(command = "near", @CommandDeclaration(command = "near",
@ -48,9 +49,13 @@ public class Near extends Command {
final Plot plot = check(player.getCurrentPlot(), TranslatableCaption.of("errors.not_in_plot")); final Plot plot = check(player.getCurrentPlot(), TranslatableCaption.of("errors.not_in_plot"));
player.sendMessage( player.sendMessage(
TranslatableCaption.of("near.plot_near"), TranslatableCaption.of("near.plot_near"),
Template.of("list", StringMan.join(plot.getPlayersInPlot(), ", ")) Template.of("list", StringMan.join(getPlayersInPlotVisible(plot, player), ", "))
); );
return CompletableFuture.completedFuture(true); return CompletableFuture.completedFuture(true);
} }
private List<PlotPlayer<?>> getPlayersInPlotVisible(Plot plot, PlotPlayer<?> executor) {
return plot.getPlayersInPlot().stream().filter(executor::canSee).toList();
}
} }

View File

@ -34,7 +34,7 @@ import com.plotsquared.core.util.query.PlotQuery;
import com.plotsquared.core.util.task.TaskManager; import com.plotsquared.core.util.task.TaskManager;
import com.plotsquared.core.uuid.UUIDMapping; import com.plotsquared.core.uuid.UUIDMapping;
import net.kyori.adventure.text.minimessage.Template; import net.kyori.adventure.text.minimessage.Template;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
@ -53,7 +53,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
confirmation = true) confirmation = true)
public class Purge extends SubCommand { public class Purge extends SubCommand {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + Purge.class.getSimpleName());
private final PlotAreaManager plotAreaManager; private final PlotAreaManager plotAreaManager;
private final PlotListener plotListener; private final PlotListener plotListener;

View File

@ -115,8 +115,8 @@ public class Remove extends SubCommand {
} }
if (count == 0) { if (count == 0) {
player.sendMessage( player.sendMessage(
TranslatableCaption.of("errors.invalid_player"), TranslatableCaption.of("member.player_not_removed"),
Template.of("value", args[0]) Template.of("player", args[0])
); );
} else { } else {
player.sendMessage( player.sendMessage(

View File

@ -25,7 +25,6 @@ import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.location.Location; import com.plotsquared.core.location.Location;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.expiration.ExpireManager;
import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.queue.GlobalBlockQueue;
import com.plotsquared.core.queue.QueueCoordinator; import com.plotsquared.core.queue.QueueCoordinator;
@ -39,7 +38,7 @@ import com.plotsquared.core.util.task.TaskManager;
import com.plotsquared.core.util.task.TaskTime; import com.plotsquared.core.util.task.TaskTime;
import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
@ -55,7 +54,7 @@ import java.util.Set;
category = CommandCategory.ADMINISTRATION) category = CommandCategory.ADMINISTRATION)
public class Trim extends SubCommand { public class Trim extends SubCommand {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + Trim.class.getSimpleName());
private static volatile boolean TASK = false; private static volatile boolean TASK = false;
private final PlotAreaManager plotAreaManager; private final PlotAreaManager plotAreaManager;
@ -92,8 +91,8 @@ public class Trim extends SubCommand {
} }
TranslatableCaption.of("trim.trim_starting"); TranslatableCaption.of("trim.trim_starting");
final List<Plot> plots = PlotQuery.newQuery().inWorld(world).asList(); final List<Plot> plots = PlotQuery.newQuery().inWorld(world).asList();
if (ExpireManager.IMP != null) { if (PlotSquared.platform().expireManager() != null) {
plots.removeAll(ExpireManager.IMP.getPendingExpired()); plots.removeAll(PlotSquared.platform().expireManager().getPendingExpired());
} }
result.value1 = new HashSet<>(PlotSquared.platform().worldUtil().getChunkChunks(world)); result.value1 = new HashSet<>(PlotSquared.platform().worldUtil().getChunkChunks(world));
result.value2 = new HashSet<>(); result.value2 = new HashSet<>();

View File

@ -40,7 +40,7 @@ import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.world.item.ItemTypes; import com.sk89q.worldedit.world.item.ItemTypes;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.Template; import net.kyori.adventure.text.minimessage.Template;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@ -61,7 +61,7 @@ import java.util.stream.Collectors;
public class ComponentPresetManager { public class ComponentPresetManager {
private static final MiniMessage MINI_MESSAGE = MiniMessage.builder().build(); private static final MiniMessage MINI_MESSAGE = MiniMessage.builder().build();
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + ComponentPresetManager.class.getSimpleName());
private final List<ComponentPreset> presets; private final List<ComponentPreset> presets;
private final EconHandler econHandler; private final EconHandler econHandler;

View File

@ -21,7 +21,7 @@ package com.plotsquared.core.configuration;
import com.plotsquared.core.configuration.Settings.Enabled_Components; import com.plotsquared.core.configuration.Settings.Enabled_Components;
import com.plotsquared.core.configuration.file.YamlConfiguration; import com.plotsquared.core.configuration.file.YamlConfiguration;
import com.plotsquared.core.util.StringMan; import com.plotsquared.core.util.StringMan;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import java.io.File; import java.io.File;
@ -40,7 +40,7 @@ import java.util.Map;
public class Config { public class Config {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + Config.class.getSimpleName());
/** /**
* Get the value for a node<br> * Get the value for a node<br>

View File

@ -759,6 +759,8 @@ public class Settings extends Config {
@Comment("Also kill any road mobs that are being ridden, or are leashed") @Comment("Also kill any road mobs that are being ridden, or are leashed")
public static boolean public static boolean
KILL_OWNED_ROAD_MOBS = false; KILL_OWNED_ROAD_MOBS = false;
@Comment("Also kill any road mobs that are named")
public static boolean KILL_NAMED_ROAD_MOBS = false;
@Comment("Kill items on roads (Stick, Paper, etc.)") @Comment("Kill items on roads (Stick, Paper, etc.)")
public static boolean KILL_ROAD_ITEMS = false; public static boolean KILL_ROAD_ITEMS = false;
@Comment("Kill vehicles on roads (Boat, Minecart, etc.)") @Comment("Kill vehicles on roads (Boat, Minecart, etc.)")
@ -808,6 +810,8 @@ public class Settings extends Config {
); );
@Comment("Whether PlotSquared should hook into MvDWPlaceholderAPI or not") @Comment("Whether PlotSquared should hook into MvDWPlaceholderAPI or not")
public static boolean USE_MVDWAPI = true; public static boolean USE_MVDWAPI = true;
@Comment("Prevent cross plot beacon effects")
public static boolean DISABLE_BEACON_EFFECT_OVERFLOW = true;
} }

View File

@ -21,16 +21,15 @@ package com.plotsquared.core.configuration.caption;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.ClickEvent;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.NotNull;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.Set; import java.util.Set;
final class ClickStripTransform implements ComponentTransform { final class ClickStripTransform implements ComponentTransform {
private final Set<ClickEvent.@NotNull Action> actionsToStrip; private final Set<ClickEvent.@NonNull Action> actionsToStrip;
public ClickStripTransform(final Set<ClickEvent.@NotNull Action> actionsToStrip) { public ClickStripTransform(final Set<ClickEvent.@NonNull Action> actionsToStrip) {
this.actionsToStrip = EnumSet.copyOf(actionsToStrip); this.actionsToStrip = EnumSet.copyOf(actionsToStrip);
} }

View File

@ -25,7 +25,7 @@ import com.plotsquared.core.configuration.caption.CaptionMap;
import com.plotsquared.core.configuration.caption.LocalizedCaptionMap; import com.plotsquared.core.configuration.caption.LocalizedCaptionMap;
import com.plotsquared.core.configuration.caption.PerUserLocaleCaptionMap; import com.plotsquared.core.configuration.caption.PerUserLocaleCaptionMap;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
@ -54,7 +54,7 @@ import java.util.stream.Stream;
*/ */
public final class CaptionLoader { public final class CaptionLoader {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + CaptionLoader.class.getSimpleName());
private static final Gson GSON; private static final Gson GSON;
@ -174,7 +174,7 @@ public final class CaptionLoader {
public @NonNull CaptionMap loadAll(final @NonNull Path directory) throws IOException { public @NonNull CaptionMap loadAll(final @NonNull Path directory) throws IOException {
final Map<Locale, CaptionMap> localeMaps = new HashMap<>(); final Map<Locale, CaptionMap> localeMaps = new HashMap<>();
try (final Stream<Path> files = Files.list(directory)) { try (final Stream<Path> files = Files.list(directory)) {
final List<Path> captionFiles = files.filter(Files::isRegularFile).collect(Collectors.toList()); final List<Path> captionFiles = files.filter(Files::isRegularFile).toList();
for (Path file : captionFiles) { for (Path file : captionFiles) {
try { try {
final CaptionMap localeMap = loadSingle(file); final CaptionMap localeMap = loadSingle(file);
@ -190,13 +190,14 @@ public final class CaptionLoader {
/** /**
* Load a message file into a new CaptionMap. The file name must match * Load a message file into a new CaptionMap. The file name must match
* the pattern {@code messages_<locale>.json} where {@code <locale>} * the pattern expected by the {@link #localeExtractor}.
* is a valid {@link Locale} string. * Note that this method does not attempt to create a new file.
* *
* @param file The file to load * @param file The file to load
* @return A new CaptionMap containing the loaded messages * @return A new CaptionMap containing the loaded messages
* @throws IOException if the file couldn't be accessed or read successfully. * @throws IOException if the file couldn't be accessed or read successfully.
* @throws IllegalArgumentException if the file name doesn't match the specified format. * @throws IllegalArgumentException if the file name doesn't match the specified format.
* @see #loadOrCreateSingle(Path)
*/ */
public @NonNull CaptionMap loadSingle(final @NonNull Path file) throws IOException { public @NonNull CaptionMap loadSingle(final @NonNull Path file) throws IOException {
final Locale locale = this.localeExtractor.apply(file); final Locale locale = this.localeExtractor.apply(file);
@ -205,14 +206,42 @@ public final class CaptionLoader {
if (patch(map, locale)) { if (patch(map, locale)) {
save(file, map); // update the file using the modified map save(file, map); // update the file using the modified map
} }
return new LocalizedCaptionMap(locale, map.entrySet().stream() return new LocalizedCaptionMap(locale, mapToCaptions(map));
.collect(Collectors.toMap( }
}
/**
* Load a message file into a new CaptionMap. The file name must match
* the pattern expected by the {@link #localeExtractor}.
* If no file exists at the given path, this method will
* attempt to create one and fill it with default values.
*
* @param file The file to load
* @return A new CaptionMap containing the loaded messages
* @throws IOException if the file couldn't be accessed or read successfully.
* @throws IllegalArgumentException if the file name doesn't match the specified format.
* @see #loadSingle(Path)
* @since 6.9.3
*/
public @NonNull CaptionMap loadOrCreateSingle(final @NonNull Path file) throws IOException {
final Locale locale = this.localeExtractor.apply(file);
if (!Files.exists(file) ) {
Map<String, String> map = new LinkedHashMap<>();
patch(map, locale);
save(file, map);
return new LocalizedCaptionMap(locale, mapToCaptions(map));
} else {
return loadSingle(file);
}
}
private @NonNull Map<TranslatableCaption, String> mapToCaptions(Map<String, String> map) {
return map.entrySet().stream().collect(
Collectors.toMap(
entry -> TranslatableCaption.of(this.namespace, entry.getKey()), entry -> TranslatableCaption.of(this.namespace, entry.getKey()),
Map.Entry::getValue Map.Entry::getValue
)
)); ));
} }
}
/** /**
* Add missing entries to the given map. * Add missing entries to the given map.

View File

@ -18,7 +18,7 @@
*/ */
package com.plotsquared.core.configuration.caption.load; package com.plotsquared.core.configuration.caption.load;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@ -35,7 +35,7 @@ import static com.plotsquared.core.configuration.caption.load.CaptionLoader.load
final class ClassLoaderCaptionProvider implements DefaultCaptionProvider { final class ClassLoaderCaptionProvider implements DefaultCaptionProvider {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + ClassLoaderCaptionProvider.class.getSimpleName());
private final ClassLoader classLoader; private final ClassLoader classLoader;
private final Function<@NonNull Locale, @NonNull String> urlProvider; private final Function<@NonNull Locale, @NonNull String> urlProvider;
@ -53,7 +53,10 @@ final class ClassLoaderCaptionProvider implements DefaultCaptionProvider {
try { try {
final InputStream stream = this.classLoader.getResourceAsStream(url); final InputStream stream = this.classLoader.getResourceAsStream(url);
if (stream == null) { if (stream == null) {
LOGGER.warn("No resource for locale '{}' found", locale); LOGGER.info("No resource for locale '{}' found in the plugin file." +
"Please ensure you have placed the latest version of the file messages_{}.json in the 'lang' folder." +
"You may be able to find completed translations at https://intellectualsites.crowdin.com/plotsquared",
locale, locale);
return null; return null;
} }
try (final BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) { try (final BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) {

View File

@ -21,7 +21,7 @@ package com.plotsquared.core.configuration.file;
import com.plotsquared.core.configuration.Configuration; import com.plotsquared.core.configuration.Configuration;
import com.plotsquared.core.configuration.ConfigurationSection; import com.plotsquared.core.configuration.ConfigurationSection;
import com.plotsquared.core.configuration.InvalidConfigurationException; import com.plotsquared.core.configuration.InvalidConfigurationException;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.Yaml;
@ -40,7 +40,7 @@ import java.util.Map;
*/ */
public class YamlConfiguration extends FileConfiguration { public class YamlConfiguration extends FileConfiguration {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + YamlConfiguration.class.getSimpleName());
private static final String COMMENT_PREFIX = "# "; private static final String COMMENT_PREFIX = "# ";
private static final String BLANK_CONFIG = "{}\n"; private static final String BLANK_CONFIG = "{}\n";

View File

@ -44,7 +44,7 @@ import com.plotsquared.core.util.HashUtil;
import com.plotsquared.core.util.StringMan; import com.plotsquared.core.util.StringMan;
import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.RunnableVal;
import com.plotsquared.core.util.task.TaskManager; import com.plotsquared.core.util.task.TaskManager;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
@ -78,7 +78,7 @@ import java.util.concurrent.atomic.AtomicInteger;
@SuppressWarnings("SqlDialectInspection") @SuppressWarnings("SqlDialectInspection")
public class SQLManager implements AbstractDB { public class SQLManager implements AbstractDB {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + SQLManager.class.getSimpleName());
// Public final // Public final
public final String SET_OWNER; public final String SET_OWNER;

View File

@ -19,7 +19,7 @@
package com.plotsquared.core.database; package com.plotsquared.core.database;
import com.plotsquared.core.PlotSquared; import com.plotsquared.core.PlotSquared;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import java.io.File; import java.io.File;
@ -35,7 +35,7 @@ import java.sql.Statement;
*/ */
public class SQLite extends Database { public class SQLite extends Database {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + SQLite.class.getSimpleName());
private final String dbLocation; private final String dbLocation;
private Connection connection; private Connection connection;

View File

@ -114,7 +114,7 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
} }
/** /**
* @deprecated for removal. Use {@link PlayerAutoPlotEvent#setSizeX(int)} )} * @deprecated for removal. Use {@link PlayerAutoPlotEvent#setSizeX(int)}
*/ */
@Deprecated(forRemoval = true, since = "6.1.0") @Deprecated(forRemoval = true, since = "6.1.0")
public void setSize_x(int sizeX) { public void setSize_x(int sizeX) {
@ -130,7 +130,7 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
} }
/** /**
* @deprecated for removal. Use {@link PlayerAutoPlotEvent#setSizeZ(int)} )} * @deprecated for removal. Use {@link PlayerAutoPlotEvent#setSizeZ(int)}
*/ */
@Deprecated(forRemoval = true, since = "6.1.0") @Deprecated(forRemoval = true, since = "6.1.0")
public void setSize_z(int sizeZ) { public void setSize_z(int sizeZ) {

View File

@ -28,13 +28,17 @@ import com.plotsquared.core.inject.annotations.WorldConfig;
import com.plotsquared.core.plot.BlockBucket; import com.plotsquared.core.plot.BlockBucket;
import com.plotsquared.core.plot.PlotId; import com.plotsquared.core.plot.PlotId;
import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.queue.GlobalBlockQueue;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.block.BlockTypes;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@SuppressWarnings("WeakerAccess") @SuppressWarnings("WeakerAccess")
public abstract class ClassicPlotWorld extends SquarePlotWorld { public abstract class ClassicPlotWorld extends SquarePlotWorld {
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + ClassicPlotWorld.class.getSimpleName());
public int ROAD_HEIGHT = 62; public int ROAD_HEIGHT = 62;
public int PLOT_HEIGHT = 62; public int PLOT_HEIGHT = 62;
@ -121,15 +125,15 @@ public abstract class ClassicPlotWorld extends SquarePlotWorld {
super.loadConfiguration(config); super.loadConfiguration(config);
this.PLOT_BEDROCK = config.getBoolean("plot.bedrock"); this.PLOT_BEDROCK = config.getBoolean("plot.bedrock");
this.PLOT_HEIGHT = Math.min(getMaxGenHeight(), config.getInt("plot.height")); this.PLOT_HEIGHT = Math.min(getMaxGenHeight(), config.getInt("plot.height"));
this.MAIN_BLOCK = new BlockBucket(config.getString("plot.filling")); this.MAIN_BLOCK = createCheckedBlockBucket(config.getString("plot.filling"), MAIN_BLOCK);
this.TOP_BLOCK = new BlockBucket(config.getString("plot.floor")); this.TOP_BLOCK = createCheckedBlockBucket(config.getString("plot.floor"), TOP_BLOCK);
this.WALL_BLOCK = new BlockBucket(config.getString("wall.block")); this.WALL_BLOCK = createCheckedBlockBucket(config.getString("wall.block"), WALL_BLOCK);
this.ROAD_HEIGHT = Math.min(getMaxGenHeight(), config.getInt("road.height")); this.ROAD_HEIGHT = Math.min(getMaxGenHeight(), config.getInt("road.height"));
this.ROAD_BLOCK = new BlockBucket(config.getString("road.block")); this.ROAD_BLOCK = createCheckedBlockBucket(config.getString("road.block"), ROAD_BLOCK);
this.WALL_FILLING = new BlockBucket(config.getString("wall.filling")); this.WALL_FILLING = createCheckedBlockBucket(config.getString("wall.filling"), WALL_FILLING);
this.PLACE_TOP_BLOCK = config.getBoolean("wall.place_top_block"); this.PLACE_TOP_BLOCK = config.getBoolean("wall.place_top_block");
this.WALL_HEIGHT = Math.min(getMaxGenHeight() - (PLACE_TOP_BLOCK ? 1 : 0), config.getInt("wall.height")); this.WALL_HEIGHT = Math.min(getMaxGenHeight() - (PLACE_TOP_BLOCK ? 1 : 0), config.getInt("wall.height"));
this.CLAIMED_WALL_BLOCK = new BlockBucket(config.getString("wall.block_claimed")); this.CLAIMED_WALL_BLOCK = createCheckedBlockBucket(config.getString("wall.block_claimed"), CLAIMED_WALL_BLOCK);
} }
int schematicStartHeight() { int schematicStartHeight() {
@ -140,4 +144,19 @@ public abstract class ClassicPlotWorld extends SquarePlotWorld {
return Math.min(WALL_HEIGHT, plotRoadMin); return Math.min(WALL_HEIGHT, plotRoadMin);
} }
private static BlockBucket createCheckedBlockBucket(String input, BlockBucket def) {
final BlockBucket bucket = new BlockBucket(input);
Pattern pattern = null;
try {
pattern = bucket.toPattern();
} catch (Exception ignore) {
}
if (pattern == null) {
LOGGER.error("Failed to parse pattern '{}', check your worlds.yml", input);
LOGGER.error("Falling back to {}", def);
return def;
}
return bucket;
}
} }

View File

@ -174,8 +174,9 @@ public class HybridPlotManager extends ClassicPlotManager {
for (int y = 0; y < blocks.length; y++) { for (int y = 0; y < blocks.length; y++) {
if (blocks[y] != null) { if (blocks[y] != null) {
queue.setBlock(x, minY + y, z, blocks[y]); queue.setBlock(x, minY + y, z, blocks[y]);
} else { } else if (!isRoad) {
// This is necessary, otherwise any blocks not specified in the schematic will remain after a clear // This is necessary, otherwise any blocks not specified in the schematic will remain after a clear
// Do not set air for road as this may cause cavernous roads when debugroadregen is used
queue.setBlock(x, minY + y, z, airBlock); queue.setBlock(x, minY + y, z, airBlock);
} }
} }

View File

@ -20,6 +20,7 @@ package com.plotsquared.core.generator;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted; import com.google.inject.assistedinject.Assisted;
import com.intellectualsites.annotations.DoNotUse;
import com.plotsquared.core.PlotSquared; import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.ConfigurationSection; import com.plotsquared.core.configuration.ConfigurationSection;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
@ -33,7 +34,6 @@ import com.plotsquared.core.plot.PlotId;
import com.plotsquared.core.plot.PlotManager; import com.plotsquared.core.plot.PlotManager;
import com.plotsquared.core.plot.schematic.Schematic; import com.plotsquared.core.plot.schematic.Schematic;
import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.queue.GlobalBlockQueue;
import com.plotsquared.core.util.AnnotationHelper;
import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.util.FileUtils;
import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.MathMan;
import com.plotsquared.core.util.SchematicHandler; import com.plotsquared.core.util.SchematicHandler;
@ -50,7 +50,7 @@ import com.sk89q.worldedit.math.transform.AffineTransform;
import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.util.Direction;
import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@ -64,7 +64,7 @@ import java.util.Locale;
public class HybridPlotWorld extends ClassicPlotWorld { public class HybridPlotWorld extends ClassicPlotWorld {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + HybridPlotWorld.class.getSimpleName());
private static final AffineTransform transform = new AffineTransform().rotateY(90); private static final AffineTransform transform = new AffineTransform().rotateY(90);
public boolean ROAD_SCHEMATIC_ENABLED; public boolean ROAD_SCHEMATIC_ENABLED;
public boolean PLOT_SCHEMATIC = false; public boolean PLOT_SCHEMATIC = false;
@ -93,10 +93,10 @@ public class HybridPlotWorld extends ClassicPlotWorld {
@Inject @Inject
public HybridPlotWorld( public HybridPlotWorld(
@Assisted("world") final String worldName, @Assisted("world") final String worldName,
@Nullable @Assisted("id") final String id, @javax.annotation.Nullable @Assisted("id") final String id,
@Assisted final @NonNull IndependentPlotGenerator generator, @Assisted final @NonNull IndependentPlotGenerator generator,
@Nullable @Assisted("min") final PlotId min, @javax.annotation.Nullable @Assisted("min") final PlotId min,
@Nullable @Assisted("max") final PlotId max, @javax.annotation.Nullable @Assisted("max") final PlotId max,
@WorldConfig final @NonNull YamlConfiguration worldConfiguration, @WorldConfig final @NonNull YamlConfiguration worldConfiguration,
final @NonNull GlobalBlockQueue blockQueue final @NonNull GlobalBlockQueue blockQueue
) { ) {
@ -281,10 +281,12 @@ public class HybridPlotWorld extends ClassicPlotWorld {
int worldGenHeight = getMaxGenHeight() - getMinGenHeight() + 1; int worldGenHeight = getMaxGenHeight() - getMinGenHeight() + 1;
int maxSchematicHeight = 0; int maxSchematicHeight = 0;
int plotSchemHeight = 0;
// SCHEM_Y should be normalised to the plot "start" height // SCHEM_Y should be normalised to the plot "start" height
if (schematic3 != null) { if (schematic3 != null) {
if ((maxSchematicHeight = schematic3.getClipboard().getDimensions().getY()) == worldGenHeight) { plotSchemHeight = maxSchematicHeight = schematic3.getClipboard().getDimensions().getY();
if (maxSchematicHeight == worldGenHeight) {
SCHEM_Y = getMinGenHeight(); SCHEM_Y = getMinGenHeight();
plotY = 0; plotY = 0;
} else if (!Settings.Schematics.PASTE_ON_TOP) { } else if (!Settings.Schematics.PASTE_ON_TOP) {
@ -293,11 +295,15 @@ public class HybridPlotWorld extends ClassicPlotWorld {
} }
} }
int roadSchemHeight;
if (schematic1 != null) { if (schematic1 != null) {
if ((maxSchematicHeight = Math.max( roadSchemHeight = Math.max(
schematic1.getClipboard().getDimensions().getY(), schematic1.getClipboard().getDimensions().getY(),
maxSchematicHeight schematic2.getClipboard().getDimensions().getY()
)) == worldGenHeight) { );
maxSchematicHeight = Math.max(roadSchemHeight, maxSchematicHeight);
if (maxSchematicHeight == worldGenHeight) {
SCHEM_Y = getMinGenHeight(); SCHEM_Y = getMinGenHeight();
roadY = 0; // Road is the lowest schematic roadY = 0; // Road is the lowest schematic
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldGenHeight) { if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldGenHeight) {
@ -319,8 +325,11 @@ public class HybridPlotWorld extends ClassicPlotWorld {
// Road is the lowest schematic. Normalize plotY to it. // Road is the lowest schematic. Normalize plotY to it.
plotY = PLOT_HEIGHT - getMinBuildHeight(); plotY = PLOT_HEIGHT - getMinBuildHeight();
} }
// If plot schematic is not paste-on-top, it will be from min build height thus plotY = 0 as well already. maxSchematicHeight = Math.max(maxSchematicHeight, plotY + plotSchemHeight);
} }
} else {
roadY = minRoadWall - SCHEM_Y;
maxSchematicHeight = Math.max(maxSchematicHeight, roadY + roadSchemHeight);
} }
} }
@ -480,7 +489,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
/** /**
* @deprecated This method should not be available for public API usage and will be made private. * @deprecated This method should not be available for public API usage and will be made private.
*/ */
@Deprecated(forRemoval = true, since = "TODO") @Deprecated(forRemoval = true, since = "6.10.2")
public void addOverlayBlock(short x, short y, short z, BaseBlock id, boolean rotate, int height) { public void addOverlayBlock(short x, short y, short z, BaseBlock id, boolean rotate, int height) {
if (z < 0) { if (z < 0) {
z += this.SIZE; z += this.SIZE;
@ -498,9 +507,14 @@ public class HybridPlotWorld extends ClassicPlotWorld {
int pair = MathMan.pair(x, z); int pair = MathMan.pair(x, z);
BaseBlock[] existing = this.G_SCH.computeIfAbsent(pair, k -> new BaseBlock[height]); BaseBlock[] existing = this.G_SCH.computeIfAbsent(pair, k -> new BaseBlock[height]);
if (y >= height) { if (y >= height) {
if (y != lastOverlayHeightError) { if (y > lastOverlayHeightError) {
lastOverlayHeightError = y; lastOverlayHeightError = y;
LOGGER.error(String.format("Error adding overlay block. `y > height`. y=%s, height=%s", y, height)); LOGGER.error(
"Error adding overlay block in world {}. `y > height`. y={}, height={}",
getWorldName(),
y,
height
);
} }
return; return;
} }
@ -510,7 +524,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
/** /**
* @deprecated This method should not be available for public API usage and will be made private. * @deprecated This method should not be available for public API usage and will be made private.
*/ */
@Deprecated(forRemoval = true, since = "TODO") @Deprecated(forRemoval = true, since = "6.10.2")
public void addOverlayBiome(short x, short z, BiomeType id) { public void addOverlayBiome(short x, short z, BiomeType id) {
if (z < 0) { if (z < 0) {
z += this.SIZE; z += this.SIZE;
@ -531,7 +545,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
* *
* @since 6.9.0 * @since 6.9.0
*/ */
@AnnotationHelper.ApiDescription(info = "Internal use only. Subject to changes at any time.") @DoNotUse
public @Nullable List<Entity> getPlotSchematicEntities() { public @Nullable List<Entity> getPlotSchematicEntities() {
return schem3Entities; return schem3Entities;
} }
@ -541,7 +555,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
* *
* @since 6.9.0 * @since 6.9.0
*/ */
@AnnotationHelper.ApiDescription(info = "Internal use only. Subject to changes at any time.") @DoNotUse
public @Nullable BlockVector3 getPlotSchematicMinPoint() { public @Nullable BlockVector3 getPlotSchematicMinPoint() {
return schem3MinPoint; return schem3MinPoint;
} }
@ -551,7 +565,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
* *
* @since 6.9.0 * @since 6.9.0
*/ */
@AnnotationHelper.ApiDescription(info = "Internal use only. Subject to changes at any time.") @DoNotUse
public boolean populationNeeded() { public boolean populationNeeded() {
return schem1PopulationNeeded || schem2PopulationNeeded || schem3PopulationNeeded; return schem1PopulationNeeded || schem2PopulationNeeded || schem3PopulationNeeded;
} }

View File

@ -55,7 +55,7 @@ import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.block.BlockTypes;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@ -75,7 +75,7 @@ import java.util.concurrent.atomic.AtomicInteger;
public class HybridUtils { public class HybridUtils {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + HybridUtils.class.getSimpleName());
private static final BlockState AIR = BlockTypes.AIR.getDefaultState(); private static final BlockState AIR = BlockTypes.AIR.getDefaultState();
public static HybridUtils manager; public static HybridUtils manager;
@ -189,13 +189,13 @@ public class HybridUtils {
if (X == ctx) { if (X == ctx) {
maxX = tx & 15; maxX = tx & 15;
} else { } else {
maxX = 16; maxX = 15;
} }
int maxZ; int maxZ;
if (Z == ctz) { if (Z == ctz) {
maxZ = tz & 15; maxZ = tz & 15;
} else { } else {
maxZ = 16; maxZ = 15;
} }
int chunkBlockX = X << 4; int chunkBlockX = X << 4;
@ -221,7 +221,7 @@ public class HybridUtils {
} }
}); });
final Runnable run = () -> TaskManager.runTaskAsync(() -> { final Runnable run = () -> {
int size = width * length; int size = width * length;
int[] changes = new int[size]; int[] changes = new int[size];
int[] faces = new int[size]; int[] faces = new int[size];
@ -234,8 +234,19 @@ public class HybridUtils {
Set<BlockType> types = new HashSet<>(); Set<BlockType> types = new HashSet<>();
for (int yIndex = 0; yIndex < height; yIndex++) { for (int yIndex = 0; yIndex < height; yIndex++) {
BlockState old = oldBlocks[yIndex][x][z]; // Nullable BlockState old = oldBlocks[yIndex][x][z]; // Nullable
try {
BlockState now = newBlocks[yIndex][x][z]; // Not null BlockState now = newBlocks[yIndex][x][z]; // Not null
if (now == null) {
throw new NullPointerException(String.format(
"\"now\" block null attempting to perform plot analysis. Indexes: x=%d of %d, yIndex=%d" +
" of %d, z=%d of %d",
x,
width,
yIndex,
height,
z,
length
));
}
if (!now.equals(old) && !(old == null && now.getBlockType().equals(BlockTypes.AIR))) { if (!now.equals(old) && !(old == null && now.getBlockType().equals(BlockTypes.AIR))) {
changes[i]++; changes[i]++;
} }
@ -270,9 +281,6 @@ public class HybridUtils {
} }
types.add(now.getBlockType()); types.add(now.getBlockType());
} }
} catch (NullPointerException e) {
e.printStackTrace();
}
} }
variety[i] = types.size(); variety[i] = types.size();
i++; i++;
@ -296,7 +304,7 @@ public class HybridUtils {
analysis.variety_sd = (int) (MathMan.getSD(variety, analysis.variety) * 100); analysis.variety_sd = (int) (MathMan.getSD(variety, analysis.variety) * 100);
whenDone.value = analysis; whenDone.value = analysis;
whenDone.run(); whenDone.run();
}); };
queue.setCompleteTask(run); queue.setCompleteTask(run);
queue.enqueue(); queue.enqueue();
}); });

View File

@ -28,7 +28,7 @@ import com.plotsquared.core.queue.QueueCoordinator;
import com.plotsquared.core.util.HashUtil; import com.plotsquared.core.util.HashUtil;
import com.plotsquared.core.util.RegionManager; import com.plotsquared.core.util.RegionManager;
import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@ -41,7 +41,7 @@ import java.util.Set;
*/ */
public abstract class SquarePlotManager extends GridPlotManager { public abstract class SquarePlotManager extends GridPlotManager {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + SquarePlotManager.class.getSimpleName());
private final SquarePlotWorld squarePlotWorld; private final SquarePlotWorld squarePlotWorld;
private final RegionManager regionManager; private final RegionManager regionManager;
@ -114,26 +114,14 @@ public abstract class SquarePlotManager extends GridPlotManager {
end = pathWidthLower + squarePlotWorld.PLOT_WIDTH; end = pathWidthLower + squarePlotWorld.PLOT_WIDTH;
} }
int size = squarePlotWorld.PLOT_WIDTH + squarePlotWorld.ROAD_WIDTH; int size = squarePlotWorld.PLOT_WIDTH + squarePlotWorld.ROAD_WIDTH;
int idx; int dx = Math.floorDiv(x, size) + 1;
if (x < 0) { int rx = Math.floorMod(x, size);
idx = x / size; int dz = Math.floorDiv(z, size) + 1;
x = size + (x % size); int rz = Math.floorMod(z, size);
} else { if (rz <= pathWidthLower || rz > end || rx <= pathWidthLower || rx > end) {
idx = (x / size) + 1;
x = x % size;
}
int idz;
if (z < 0) {
idz = z / size;
z = size + (z % size);
} else {
idz = (z / size) + 1;
z = z % size;
}
if (z <= pathWidthLower || z > end || x <= pathWidthLower || x > end) {
return null; return null;
} else { } else {
return PlotId.of(idx, idz); return PlotId.of(dx, dz);
} }
} }
@ -180,24 +168,10 @@ public abstract class SquarePlotManager extends GridPlotManager {
} }
end = pathWidthLower + squarePlotWorld.PLOT_WIDTH; end = pathWidthLower + squarePlotWorld.PLOT_WIDTH;
} }
int dx; int dx = Math.floorDiv(x, size) + 1;
int rx; int rx = Math.floorMod(x, size);
if (x < 0) { int dz = Math.floorDiv(z, size) + 1;
dx = x / size; int rz = Math.floorMod(z, size);
rx = size + (x % size);
} else {
dx = (x / size) + 1;
rx = x % size;
}
int dz;
int rz;
if (z < 0) {
dz = z / size;
rz = size + (z % size);
} else {
dz = (z / size) + 1;
rz = z % size;
}
PlotId id = PlotId.of(dx, dz); PlotId id = PlotId.of(dx, dz);
boolean[] merged = new boolean[]{rz <= pathWidthLower, rx > end, rz > end, rx <= pathWidthLower}; boolean[] merged = new boolean[]{rz <= pathWidthLower, rx > end, rz > end, rx <= pathWidthLower};
int hash = HashUtil.hash(merged); int hash = HashUtil.hash(merged);

View File

@ -24,14 +24,14 @@ import com.plotsquared.core.configuration.file.YamlConfiguration;
import com.plotsquared.core.inject.annotations.WorldConfig; import com.plotsquared.core.inject.annotations.WorldConfig;
import com.plotsquared.core.plot.PlotId; import com.plotsquared.core.plot.PlotId;
import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.queue.GlobalBlockQueue;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
public abstract class SquarePlotWorld extends GridPlotWorld { public abstract class SquarePlotWorld extends GridPlotWorld {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + SquarePlotWorld.class.getSimpleName());
public int PLOT_WIDTH = 42; public int PLOT_WIDTH = 42;
public int ROAD_WIDTH = 7; public int ROAD_WIDTH = 7;

View File

@ -36,7 +36,6 @@ import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.PlotTitle; import com.plotsquared.core.plot.PlotTitle;
import com.plotsquared.core.plot.PlotWeather; import com.plotsquared.core.plot.PlotWeather;
import com.plotsquared.core.plot.comment.CommentManager; import com.plotsquared.core.plot.comment.CommentManager;
import com.plotsquared.core.plot.expiration.ExpireManager;
import com.plotsquared.core.plot.flag.GlobalFlagContainer; import com.plotsquared.core.plot.flag.GlobalFlagContainer;
import com.plotsquared.core.plot.flag.PlotFlag; import com.plotsquared.core.plot.flag.PlotFlag;
import com.plotsquared.core.plot.flag.implementations.DenyExitFlag; import com.plotsquared.core.plot.flag.implementations.DenyExitFlag;
@ -67,10 +66,13 @@ import com.sk89q.worldedit.world.item.ItemType;
import com.sk89q.worldedit.world.item.ItemTypes; import com.sk89q.worldedit.world.item.ItemTypes;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.Template; import net.kyori.adventure.text.minimessage.Template;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.UUID; import java.util.UUID;
@ -82,6 +84,7 @@ public class PlotListener {
private final HashMap<UUID, Interval> feedRunnable = new HashMap<>(); private final HashMap<UUID, Interval> feedRunnable = new HashMap<>();
private final HashMap<UUID, Interval> healRunnable = new HashMap<>(); private final HashMap<UUID, Interval> healRunnable = new HashMap<>();
private final Map<UUID, List<StatusEffect>> playerEffects = new HashMap<>();
private final EventDispatcher eventDispatcher; private final EventDispatcher eventDispatcher;
@ -131,6 +134,17 @@ public class PlotListener {
} }
} }
} }
if (!playerEffects.isEmpty()) {
long currentTime = System.currentTimeMillis();
for (Iterator<Map.Entry<UUID, List<StatusEffect>>> iterator =
playerEffects.entrySet().iterator(); iterator.hasNext(); ) {
Map.Entry<UUID, List<StatusEffect>> entry = iterator.next();
List<StatusEffect> effects = entry.getValue();
effects.removeIf(effect -> currentTime > effect.expiresAt);
if (effects.isEmpty()) iterator.remove();
}
}
}, TaskTime.seconds(1L)); }, TaskTime.seconds(1L));
} }
@ -148,8 +162,8 @@ public class PlotListener {
if ((last != null) && !last.getId().equals(plot.getId())) { if ((last != null) && !last.getId().equals(plot.getId())) {
plotExit(player, last); plotExit(player, last);
} }
if (ExpireManager.IMP != null) { if (PlotSquared.platform().expireManager() != null) {
ExpireManager.IMP.handleEntry(player, plot); PlotSquared.platform().expireManager().handleEntry(player, plot);
} }
lastPlot.set(plot); lastPlot.set(plot);
} }
@ -360,6 +374,17 @@ public class PlotListener {
try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) { try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
final Plot previous = lastPlot.remove(); final Plot previous = lastPlot.remove();
this.eventDispatcher.callLeave(player, plot); this.eventDispatcher.callLeave(player, plot);
List<StatusEffect> effects = playerEffects.remove(player.getUUID());
if (effects != null) {
long currentTime = System.currentTimeMillis();
effects.forEach(effect -> {
if (currentTime <= effect.expiresAt) {
player.removeEffect(effect.name);
}
});
}
if (plot.hasOwner()) { if (plot.hasOwner()) {
PlotArea pw = plot.getArea(); PlotArea pw = plot.getArea();
if (pw == null) { if (pw == null) {
@ -468,6 +493,23 @@ public class PlotListener {
public void logout(UUID uuid) { public void logout(UUID uuid) {
feedRunnable.remove(uuid); feedRunnable.remove(uuid);
healRunnable.remove(uuid); healRunnable.remove(uuid);
playerEffects.remove(uuid);
}
/**
* Marks an effect as a status effect that will be removed on leaving a plot
* @param uuid The uuid of the player the effect belongs to
* @param name The name of the status effect
* @param expiresAt The time when the effect expires
* @since 6.10.0
*/
public void addEffect(@NonNull UUID uuid, @NonNull String name, long expiresAt) {
List<StatusEffect> effects = playerEffects.getOrDefault(uuid, new ArrayList<>());
effects.removeIf(effect -> effect.name.equals(name));
if (expiresAt != -1) {
effects.add(new StatusEffect(name, expiresAt));
}
playerEffects.put(uuid, effects);
} }
private static class Interval { private static class Interval {
@ -485,4 +527,13 @@ public class PlotListener {
} }
private record StatusEffect(@NonNull String name, long expiresAt) {
private StatusEffect(@NonNull String name, long expiresAt) {
this.name = name;
this.expiresAt = expiresAt;
}
}
} }

View File

@ -313,7 +313,7 @@ public sealed class Location extends BlockLoc implements Comparable<Location> pe
/** /**
* Get the absolute {@link Plot}, if any, that contains this location * Get the absolute {@link Plot}, if any, that contains this location
* *
* @return (Absolute) plot containing the location, or {code null} * @return (Absolute) plot containing the location, or {@code null}
*/ */
public @Nullable Plot getPlotAbs() { public @Nullable Plot getPlotAbs() {
final PlotArea area = this.getPlotArea(); final PlotArea area = this.getPlotArea();
@ -327,7 +327,7 @@ public sealed class Location extends BlockLoc implements Comparable<Location> pe
/** /**
* Get the {@link Plot}, if any, that contains this location * Get the {@link Plot}, if any, that contains this location
* *
* @return plot containing the location, or {code null} * @return plot containing the location, or {@code null}
*/ */
public @Nullable Plot getPlot() { public @Nullable Plot getPlot() {
final PlotArea area = this.getPlotArea(); final PlotArea area = this.getPlotArea();

View File

@ -18,7 +18,7 @@
*/ */
package com.plotsquared.core.location; package com.plotsquared.core.location;
import com.plotsquared.core.util.AnnotationHelper; import com.intellectualsites.annotations.DoNotUse;
import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.BlockVector3;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
@ -28,7 +28,7 @@ import org.checkerframework.checker.nullness.qual.NonNull;
* *
* @since 6.9.0 * @since 6.9.0
*/ */
@AnnotationHelper.ApiDescription(info = "Internal use only. Subject to changes at any time.") @DoNotUse
public final class UncheckedWorldLocation extends Location { public final class UncheckedWorldLocation extends Location {
private final String worldName; private final String worldName;
@ -54,7 +54,7 @@ public final class UncheckedWorldLocation extends Location {
* *
* @since 6.9.0 * @since 6.9.0
*/ */
@AnnotationHelper.ApiDescription(info = "Internal use only. Subject to changes at any time.") @DoNotUse
public static @NonNull UncheckedWorldLocation at( public static @NonNull UncheckedWorldLocation at(
final @NonNull String world, final int x, final int y, final int z final @NonNull String world, final int x, final int y, final int z
) { ) {
@ -62,7 +62,7 @@ public final class UncheckedWorldLocation extends Location {
} }
@Override @Override
@AnnotationHelper.ApiDescription(info = "Internal use only. Subject to changes at any time.") @DoNotUse
public @NonNull String getWorldName() { public @NonNull String getWorldName() {
return this.worldName; return this.worldName;
} }

View File

@ -162,6 +162,7 @@ public enum Permission {
PERMISSION_LIST_AREA("plots.list.area"), PERMISSION_LIST_AREA("plots.list.area"),
PERMISSION_ADMIN_COMMAND_LOAD("plots.admin.command.load"), PERMISSION_ADMIN_COMMAND_LOAD("plots.admin.command.load"),
PERMISSION_ADMIN_COMMAND_MERGE("plots.admin.command.merge"), PERMISSION_ADMIN_COMMAND_MERGE("plots.admin.command.merge"),
PERMISSION_ADMIN_COMMAND_MERGE_OTHER_OFFLINE("plots.admin.command.merge.other.offline"),
PERMISSION_ADMIN_COMMAND_SET_OWNER("plots.admin.command.setowner"), PERMISSION_ADMIN_COMMAND_SET_OWNER("plots.admin.command.setowner"),
PERMISSION_COMMENT("plots.comment"), PERMISSION_COMMENT("plots.comment"),
PERMISSION_INBOX("plots.inbox"), PERMISSION_INBOX("plots.inbox"),

View File

@ -246,6 +246,10 @@ public class ConsolePlayer extends PlotPlayer<Actor> {
return PlotSquared.platform().consoleAudience(); return PlotSquared.platform().consoleAudience();
} }
@Override
public void removeEffect(@NonNull String name) {
}
@Override @Override
public boolean canSee(final PlotPlayer<?> other) { public boolean canSee(final PlotPlayer<?> other) {
return true; return true;

View File

@ -42,7 +42,6 @@ import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.PlotCluster; import com.plotsquared.core.plot.PlotCluster;
import com.plotsquared.core.plot.PlotId; import com.plotsquared.core.plot.PlotId;
import com.plotsquared.core.plot.PlotWeather; import com.plotsquared.core.plot.PlotWeather;
import com.plotsquared.core.plot.expiration.ExpireManager;
import com.plotsquared.core.plot.flag.implementations.DoneFlag; import com.plotsquared.core.plot.flag.implementations.DoneFlag;
import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.plot.world.SinglePlotArea; import com.plotsquared.core.plot.world.SinglePlotArea;
@ -61,7 +60,7 @@ import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.Template; import net.kyori.adventure.text.minimessage.Template;
import net.kyori.adventure.title.Title; import net.kyori.adventure.title.Title;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@ -91,7 +90,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
private static final String NON_EXISTENT_CAPTION = "<red>PlotSquared does not recognize the caption: "; private static final String NON_EXISTENT_CAPTION = "<red>PlotSquared does not recognize the caption: ";
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + PlotPlayer.class.getSimpleName());
// Used to track debug mode // Used to track debug mode
private static final Set<PlotPlayer<?>> debugModeEnabled = private static final Set<PlotPlayer<?>> debugModeEnabled =
@ -618,8 +617,8 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
LOGGER.info("Plot {} was deleted + cleared due to {} getting banned", owned.getId(), getName()); LOGGER.info("Plot {} was deleted + cleared due to {} getting banned", owned.getId(), getName());
} }
} }
if (ExpireManager.IMP != null) { if (PlotSquared.platform().expireManager() != null) {
ExpireManager.IMP.storeDate(getUUID(), System.currentTimeMillis()); PlotSquared.platform().expireManager().storeDate(getUUID(), System.currentTimeMillis());
} }
PlotSquared.platform().playerManager().removePlayer(this); PlotSquared.platform().playerManager().removePlayer(this);
PlotSquared.platform().unregister(this); PlotSquared.platform().unregister(this);
@ -1016,6 +1015,14 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
return this.lockRepository; return this.lockRepository;
} }
/**
* Removes any effects present of the given type.
*
* @param name the name of the type to remove
* @since 6.10.0
*/
public abstract void removeEffect(@NonNull String name);
@FunctionalInterface @FunctionalInterface
public interface PlotPlayerConverter<BaseObject> { public interface PlotPlayerConverter<BaseObject> {

View File

@ -40,7 +40,6 @@ import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission; import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.ConsolePlayer; import com.plotsquared.core.player.ConsolePlayer;
import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.expiration.ExpireManager;
import com.plotsquared.core.plot.expiration.PlotAnalysis; import com.plotsquared.core.plot.expiration.PlotAnalysis;
import com.plotsquared.core.plot.flag.FlagContainer; import com.plotsquared.core.plot.flag.FlagContainer;
import com.plotsquared.core.plot.flag.GlobalFlagContainer; import com.plotsquared.core.plot.flag.GlobalFlagContainer;
@ -73,7 +72,7 @@ import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.Template; import net.kyori.adventure.text.minimessage.Template;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@ -118,14 +117,11 @@ public class Plot {
@Deprecated(forRemoval = true, since = "6.6.0") @Deprecated(forRemoval = true, since = "6.6.0")
public static final int MAX_HEIGHT = 256; public static final int MAX_HEIGHT = 256;
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + Plot.class.getSimpleName());
private static final DecimalFormat FLAG_DECIMAL_FORMAT = new DecimalFormat("0"); private static final DecimalFormat FLAG_DECIMAL_FORMAT = new DecimalFormat("0");
private static final MiniMessage MINI_MESSAGE = MiniMessage.builder().build(); private static final MiniMessage MINI_MESSAGE = MiniMessage.builder().build();
private static final Cleaner CLEANER = Cleaner.create(); private static final Cleaner CLEANER = Cleaner.create();
static Set<Plot> connected_cache;
static Set<CuboidRegion> regions_cache;
static { static {
FLAG_DECIMAL_FORMAT.setMaximumFractionDigits(340); FLAG_DECIMAL_FORMAT.setMaximumFractionDigits(340);
} }
@ -208,6 +204,8 @@ public class Plot {
*/ */
private Plot origin; private Plot origin;
private Set<Plot> connectedCache;
/** /**
* Constructor for a new plot. * Constructor for a new plot.
* (Only changes after plot.create() will be properly set in the database) * (Only changes after plot.create() will be properly set in the database)
@ -577,7 +575,14 @@ public class Plot {
return false; return false;
} }
final Set<Plot> connected = getConnectedPlots(); final Set<Plot> connected = getConnectedPlots();
return connected.stream().anyMatch(current -> uuid.equals(current.getOwner())); for (Plot current : connected) {
// can skip ServerPlotFlag check in getOwner()
// as flags are synchronized between plots
if (uuid.equals(current.getOwnerAbs())) {
return true;
}
}
return false;
} }
/** /**
@ -1105,8 +1110,8 @@ public class Plot {
* @return A boolean indicating whether or not the operation succeeded * @return A boolean indicating whether or not the operation succeeded
*/ */
public <V> boolean setFlag(final @NonNull PlotFlag<V, ?> flag) { public <V> boolean setFlag(final @NonNull PlotFlag<V, ?> flag) {
if (flag instanceof KeepFlag && ExpireManager.IMP != null) { if (flag instanceof KeepFlag && PlotSquared.platform().expireManager() != null) {
ExpireManager.IMP.updateExpired(this); PlotSquared.platform().expireManager().updateExpired(this);
} }
for (final Plot plot : this.getConnectedPlots()) { for (final Plot plot : this.getConnectedPlots()) {
plot.getFlagContainer().addFlag(flag); plot.getFlagContainer().addFlag(flag);
@ -1295,6 +1300,7 @@ public class Plot {
DBFunc.delete(current); DBFunc.delete(current);
current.setOwnerAbs(null); current.setOwnerAbs(null);
current.settings = null; current.settings = null;
current.clearCache();
for (final PlotPlayer<?> pp : players) { for (final PlotPlayer<?> pp : players) {
this.plotListener.plotEntry(pp, current); this.plotListener.plotEntry(pp, current);
} }
@ -1836,8 +1842,8 @@ public class Plot {
} }
// Swap cached // Swap cached
final PlotId temp = PlotId.of(this.getId().getX(), this.getId().getY()); final PlotId temp = PlotId.of(this.getId().getX(), this.getId().getY());
this.id = plot.getId().copy(); this.id = plot.getId();
plot.id = temp.copy(); plot.id = temp;
this.area.removePlot(this.getId()); this.area.removePlot(this.getId());
plot.area.removePlot(plot.getId()); plot.area.removePlot(plot.getId());
this.area.addPlotAbs(this); this.area.addPlotAbs(this);
@ -1863,8 +1869,9 @@ public class Plot {
return false; return false;
} }
this.area.removePlot(this.id); this.area.removePlot(this.id);
this.id = plot.getId().copy(); this.id = plot.getId();
this.area.addPlotAbs(this); this.area.addPlotAbs(this);
clearCache();
DBFunc.movePlot(this, plot); DBFunc.movePlot(this, plot);
TaskManager.runTaskLater(whenDone, TaskTime.ticks(1L)); TaskManager.runTaskLater(whenDone, TaskTime.ticks(1L));
return true; return true;
@ -2129,17 +2136,16 @@ public class Plot {
this.origin.origin = base; this.origin.origin = base;
other.origin = base; other.origin = base;
this.origin = base; this.origin = base;
connected_cache = null; this.connectedCache = null;
} }
} else { } else {
if (this.origin != null) { if (this.origin != null) {
this.origin.origin = null; this.origin.origin = null;
this.origin = null; this.origin = null;
} }
connected_cache = null; this.connectedCache = null;
} }
DBFunc.setMerged(this, this.getSettings().getMerged()); DBFunc.setMerged(this, this.getSettings().getMerged());
regions_cache = null;
} }
} }
@ -2174,8 +2180,7 @@ public class Plot {
} }
public void clearCache() { public void clearCache() {
connected_cache = null; this.connectedCache = null;
regions_cache = null;
if (this.origin != null) { if (this.origin != null) {
this.origin.origin = null; this.origin.origin = null;
this.origin = null; this.origin = null;
@ -2302,10 +2307,9 @@ public class Plot {
if (!this.isMerged()) { if (!this.isMerged()) {
return Collections.singleton(this); return Collections.singleton(this);
} }
if (connected_cache != null && connected_cache.contains(this)) { if (this.connectedCache != null && this.connectedCache.contains(this)) {
return connected_cache; return this.connectedCache;
} }
regions_cache = null;
HashSet<Plot> tmpSet = new HashSet<>(); HashSet<Plot> tmpSet = new HashSet<>();
tmpSet.add(this); tmpSet.add(this);
@ -2410,7 +2414,7 @@ public class Plot {
} }
} }
} }
connected_cache = tmpSet; this.connectedCache = tmpSet;
return tmpSet; return tmpSet;
} }
@ -2422,19 +2426,15 @@ public class Plot {
* @return all regions within the plot * @return all regions within the plot
*/ */
public @NonNull Set<CuboidRegion> getRegions() { public @NonNull Set<CuboidRegion> getRegions() {
if (regions_cache != null && connected_cache != null && connected_cache.contains(this)) {
return regions_cache;
}
if (!this.isMerged()) { if (!this.isMerged()) {
Location pos1 = this.getBottomAbs().withY(getArea().getMinBuildHeight()); Location pos1 = this.getBottomAbs().withY(getArea().getMinBuildHeight());
Location pos2 = this.getTopAbs().withY(getArea().getMaxBuildHeight()); Location pos2 = this.getTopAbs().withY(getArea().getMaxBuildHeight());
connected_cache = Sets.newHashSet(this); this.connectedCache = Sets.newHashSet(this);
CuboidRegion rg = new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3()); CuboidRegion rg = new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3());
regions_cache = Collections.singleton(rg); return Collections.singleton(rg);
return regions_cache;
} }
Set<Plot> plots = this.getConnectedPlots(); Set<Plot> plots = this.getConnectedPlots();
Set<CuboidRegion> regions = regions_cache = new HashSet<>(); Set<CuboidRegion> regions = new HashSet<>();
Set<PlotId> visited = new HashSet<>(); Set<PlotId> visited = new HashSet<>();
for (Plot current : plots) { for (Plot current : plots) {
if (visited.contains(current.getId())) { if (visited.contains(current.getId())) {
@ -2831,11 +2831,11 @@ public class Plot {
Component members = PlayerManager.getPlayerList(this.getMembers(), player); Component members = PlayerManager.getPlayerList(this.getMembers(), player);
Component denied = PlayerManager.getPlayerList(this.getDenied(), player); Component denied = PlayerManager.getPlayerList(this.getDenied(), player);
String seen; String seen;
if (Settings.Enabled_Components.PLOT_EXPIRY && ExpireManager.IMP != null) { if (Settings.Enabled_Components.PLOT_EXPIRY && PlotSquared.platform().expireManager() != null) {
if (this.isOnline()) { if (this.isOnline()) {
seen = TranslatableCaption.of("info.now").getComponent(player); seen = TranslatableCaption.of("info.now").getComponent(player);
} else { } else {
int time = (int) (ExpireManager.IMP.getAge(this, false) / 1000); int time = (int) (PlotSquared.platform().expireManager().getAge(this, false) / 1000);
if (time != 0) { if (time != 0) {
seen = TimeUtil.secToTime(time); seen = TimeUtil.secToTime(time);
} else { } else {

View File

@ -36,6 +36,7 @@ import com.plotsquared.core.location.BlockLoc;
import com.plotsquared.core.location.Direction; import com.plotsquared.core.location.Direction;
import com.plotsquared.core.location.Location; import com.plotsquared.core.location.Location;
import com.plotsquared.core.location.PlotLoc; import com.plotsquared.core.location.PlotLoc;
import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.ConsolePlayer; import com.plotsquared.core.player.ConsolePlayer;
import com.plotsquared.core.player.MetaDataAccess; import com.plotsquared.core.player.MetaDataAccess;
import com.plotsquared.core.player.PlayerMetaDataKeys; import com.plotsquared.core.player.PlayerMetaDataKeys;
@ -48,6 +49,7 @@ import com.plotsquared.core.plot.flag.implementations.DoneFlag;
import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.queue.GlobalBlockQueue;
import com.plotsquared.core.queue.QueueCoordinator; import com.plotsquared.core.queue.QueueCoordinator;
import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.MathMan;
import com.plotsquared.core.util.Permissions;
import com.plotsquared.core.util.PlotExpression; import com.plotsquared.core.util.PlotExpression;
import com.plotsquared.core.util.RegionUtil; import com.plotsquared.core.util.RegionUtil;
import com.plotsquared.core.util.StringMan; import com.plotsquared.core.util.StringMan;
@ -60,7 +62,7 @@ import com.sk89q.worldedit.world.gamemode.GameMode;
import com.sk89q.worldedit.world.gamemode.GameModes; import com.sk89q.worldedit.world.gamemode.GameModes;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.Template; import net.kyori.adventure.text.minimessage.Template;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@ -85,7 +87,7 @@ import java.util.function.Consumer;
*/ */
public abstract class PlotArea { public abstract class PlotArea {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + PlotArea.class.getSimpleName());
private static final MiniMessage MINI_MESSAGE = MiniMessage.builder().build(); private static final MiniMessage MINI_MESSAGE = MiniMessage.builder().build();
private static final DecimalFormat FLAG_DECIMAL_FORMAT = new DecimalFormat("0"); private static final DecimalFormat FLAG_DECIMAL_FORMAT = new DecimalFormat("0");
@ -624,6 +626,38 @@ public abstract class PlotArea {
getRegionAbs() == null || this.region.contains(location.getBlockVector3())); getRegionAbs() == null || this.region.contains(location.getBlockVector3()));
} }
/**
* Get if the {@code PlotArea}'s build range (min build height -> max build height) contains the given y value
*
* @param y y height
* @return if build height contains y
*/
public boolean buildRangeContainsY(int y) {
return y >= minBuildHeight && y < maxBuildHeight;
}
/**
* Utility method to check if the player is attempting to place blocks outside the build area, and notify of this if the
* player does not have permissions.
*
* @param player Player to check
* @param y y height to check
* @return true if outside build area with no permissions
* @since 6.9.1
*/
public boolean notifyIfOutsideBuildArea(PlotPlayer<?> player, int y) {
if (!buildRangeContainsY(y) && !Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
player.sendMessage(
TranslatableCaption.of("height.height_limit"),
Template.of("minHeight", String.valueOf(minBuildHeight)),
Template.of("maxHeight", String.valueOf(maxBuildHeight))
);
// Return true if "failed" as the method will always be inverted otherwise
return true;
}
return false;
}
public @NonNull Set<Plot> getPlotsAbs(final UUID uuid) { public @NonNull Set<Plot> getPlotsAbs(final UUID uuid) {
if (uuid == null) { if (uuid == null) {
return Collections.emptySet(); return Collections.emptySet();

View File

@ -110,9 +110,11 @@ public final class PlotId {
* Get a copy of the plot ID * Get a copy of the plot ID
* *
* @return Plot ID copy * @return Plot ID copy
* @deprecated PlotId is immutable, copy is not required.
*/ */
@Deprecated(forRemoval = true, since = "6.10.2")
public @NonNull PlotId copy() { public @NonNull PlotId copy() {
return of(this.getX(), this.getY()); return this;
} }
/** /**

View File

@ -47,7 +47,7 @@ import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.block.BlockTypes;
import net.kyori.adventure.text.minimessage.Template; import net.kyori.adventure.text.minimessage.Template;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@ -68,7 +68,7 @@ import java.util.stream.Collectors;
*/ */
public final class PlotModificationManager { public final class PlotModificationManager {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + PlotModificationManager.class.getSimpleName());
private final Plot plot; private final Plot plot;
private final ProgressSubscriberFactory subscriberFactory; private final ProgressSubscriberFactory subscriberFactory;
@ -263,6 +263,7 @@ public final class PlotModificationManager {
return; return;
} }
Plot current = queue.poll(); Plot current = queue.poll();
current.clearCache();
if (plot.getArea().getTerrain() != PlotAreaTerrainType.NONE) { if (plot.getArea().getTerrain() != PlotAreaTerrainType.NONE) {
try { try {
PlotSquared.platform().regionManager().regenerateRegion( PlotSquared.platform().regionManager().regenerateRegion(
@ -327,6 +328,7 @@ public final class PlotModificationManager {
ArrayList<PlotId> ids = new ArrayList<>(plots.size()); ArrayList<PlotId> ids = new ArrayList<>(plots.size());
for (Plot current : plots) { for (Plot current : plots) {
current.setHome(null); current.setHome(null);
current.clearCache();
ids.add(current.getId()); ids.add(current.getId());
} }
this.plot.clearRatings(); this.plot.clearRatings();
@ -478,8 +480,7 @@ public final class PlotModificationManager {
this.plot.updateWorldBorder(); this.plot.updateWorldBorder();
} }
} }
Plot.connected_cache = null; this.plot.clearCache();
Plot.regions_cache = null;
this.plot.getTrusted().clear(); this.plot.getTrusted().clear();
this.plot.getMembers().clear(); this.plot.getMembers().clear();
this.plot.getDenied().clear(); this.plot.getDenied().clear();
@ -630,6 +631,7 @@ public final class PlotModificationManager {
if (queue.size() > 0) { if (queue.size() > 0) {
queue.enqueue(); queue.enqueue();
} }
visited.forEach(Plot::clearCache);
return toReturn; return toReturn;
} }

View File

@ -18,7 +18,8 @@
*/ */
package com.plotsquared.core.plot; package com.plotsquared.core.plot;
import javax.annotation.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.Objects; import java.util.Objects;
public class PlotTitle { public class PlotTitle {

View File

@ -18,6 +18,8 @@
*/ */
package com.plotsquared.core.plot.expiration; package com.plotsquared.core.plot.expiration;
import com.google.inject.Inject;
import com.plotsquared.core.PlotPlatform;
import com.plotsquared.core.PlotSquared; import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.caption.Caption; import com.plotsquared.core.configuration.caption.Caption;
import com.plotsquared.core.configuration.caption.Templates; import com.plotsquared.core.configuration.caption.Templates;
@ -60,6 +62,10 @@ import java.util.concurrent.ConcurrentLinkedDeque;
public class ExpireManager { public class ExpireManager {
/**
* @deprecated Use {@link PlotPlatform#expireManager()} instead
*/
@Deprecated(forRemoval = true, since = "6.10.2")
public static ExpireManager IMP; public static ExpireManager IMP;
private final ConcurrentHashMap<UUID, Long> dates_cache; private final ConcurrentHashMap<UUID, Long> dates_cache;
private final ConcurrentHashMap<UUID, Long> account_age_cache; private final ConcurrentHashMap<UUID, Long> account_age_cache;
@ -71,6 +77,7 @@ public class ExpireManager {
*/ */
private int running; private int running;
@Inject
public ExpireManager(final @NonNull EventDispatcher eventDispatcher) { public ExpireManager(final @NonNull EventDispatcher eventDispatcher) {
this.tasks = new ArrayDeque<>(); this.tasks = new ArrayDeque<>();
this.dates_cache = new ConcurrentHashMap<>(); this.dates_cache = new ConcurrentHashMap<>();

View File

@ -18,6 +18,7 @@
*/ */
package com.plotsquared.core.plot.expiration; package com.plotsquared.core.plot.expiration;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotArea;
@ -72,8 +73,9 @@ public class ExpiryTask {
min = false; min = false;
diff = plots.size() - settings.REQUIRED_PLOTS; diff = plots.size() - settings.REQUIRED_PLOTS;
} }
ExpireManager expireManager = PlotSquared.platform().expireManager();
List<Long> entireList = List<Long> entireList =
plots.stream().map(plot -> ExpireManager.IMP.getAge(plot, settings.DELETE_IF_OWNER_IS_UNKNOWN)) plots.stream().map(plot -> expireManager.getAge(plot, settings.DELETE_IF_OWNER_IS_UNKNOWN))
.collect(Collectors.toList()); .collect(Collectors.toList());
List<Long> top = new ArrayList<>(diff + 1); List<Long> top = new ArrayList<>(diff + 1);
if (diff > 1000) { if (diff > 1000) {

View File

@ -27,7 +27,7 @@ import com.plotsquared.core.util.MathMan;
import com.plotsquared.core.util.query.PlotQuery; import com.plotsquared.core.util.query.PlotQuery;
import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.RunnableVal;
import com.plotsquared.core.util.task.TaskManager; import com.plotsquared.core.util.task.TaskManager;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import java.lang.reflect.Array; import java.lang.reflect.Array;
@ -40,7 +40,7 @@ import java.util.concurrent.atomic.AtomicInteger;
public class PlotAnalysis { public class PlotAnalysis {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + PlotAnalysis.class.getSimpleName());
public static boolean running = false; public static boolean running = false;
public int changes; public int changes;

View File

@ -20,9 +20,9 @@ package com.plotsquared.core.plot.flag;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.intellectualsites.annotations.NotPublic;
import com.plotsquared.core.configuration.caption.CaptionUtility; import com.plotsquared.core.configuration.caption.CaptionUtility;
import com.plotsquared.core.util.AnnotationHelper; import org.apache.logging.log4j.LogManager;
import com.sk89q.worldedit.internal.util.LogManagerCompat;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@ -32,14 +32,13 @@ import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Objects;
/** /**
* Container type for {@link PlotFlag plot flags}. * Container type for {@link PlotFlag plot flags}.
*/ */
public class FlagContainer { public class FlagContainer {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + FlagContainer.class.getSimpleName());
private final Map<String, String> unknownFlags = new HashMap<>(); private final Map<String, String> unknownFlags = new HashMap<>();
private final Map<Class<?>, PlotFlag<?, ?>> flagMap = new HashMap<>(); private final Map<Class<?>, PlotFlag<?, ?>> flagMap = new HashMap<>();
@ -353,7 +352,7 @@ public class FlagContainer {
* @return a new Runnable that cleans up once the FlagContainer isn't needed anymore. * @return a new Runnable that cleans up once the FlagContainer isn't needed anymore.
* @since 6.0.10 * @since 6.0.10
*/ */
@AnnotationHelper.ApiDescription(info = "This method should not be considered as public or API.") @NotPublic
public Runnable createCleanupHook() { public Runnable createCleanupHook() {
return () -> GlobalFlagContainer.getInstance().unsubscribe(unknownsRef); return () -> GlobalFlagContainer.getInstance().unsubscribe(unknownsRef);
} }

View File

@ -23,6 +23,7 @@ import com.plotsquared.core.plot.flag.implementations.AnalysisFlag;
import com.plotsquared.core.plot.flag.implementations.AnimalAttackFlag; import com.plotsquared.core.plot.flag.implementations.AnimalAttackFlag;
import com.plotsquared.core.plot.flag.implementations.AnimalCapFlag; import com.plotsquared.core.plot.flag.implementations.AnimalCapFlag;
import com.plotsquared.core.plot.flag.implementations.AnimalInteractFlag; import com.plotsquared.core.plot.flag.implementations.AnimalInteractFlag;
import com.plotsquared.core.plot.flag.implementations.BeaconEffectsFlag;
import com.plotsquared.core.plot.flag.implementations.BlockBurnFlag; import com.plotsquared.core.plot.flag.implementations.BlockBurnFlag;
import com.plotsquared.core.plot.flag.implementations.BlockIgnitionFlag; import com.plotsquared.core.plot.flag.implementations.BlockIgnitionFlag;
import com.plotsquared.core.plot.flag.implementations.BlockedCmdsFlag; import com.plotsquared.core.plot.flag.implementations.BlockedCmdsFlag;
@ -137,6 +138,7 @@ public final class GlobalFlagContainer extends FlagContainer {
this.addFlag(AnimalAttackFlag.ANIMAL_ATTACK_FALSE); this.addFlag(AnimalAttackFlag.ANIMAL_ATTACK_FALSE);
this.addFlag(AnimalInteractFlag.ANIMAL_INTERACT_FALSE); this.addFlag(AnimalInteractFlag.ANIMAL_INTERACT_FALSE);
this.addFlag(BlockBurnFlag.BLOCK_BURN_FALSE); this.addFlag(BlockBurnFlag.BLOCK_BURN_FALSE);
this.addFlag(BeaconEffectsFlag.BEACON_EFFECT_TRUE);
this.addFlag(BlockIgnitionFlag.BLOCK_IGNITION_TRUE); this.addFlag(BlockIgnitionFlag.BLOCK_IGNITION_TRUE);
this.addFlag(ChatFlag.CHAT_FLAG_TRUE); this.addFlag(ChatFlag.CHAT_FLAG_TRUE);
this.addFlag(CopperOxideFlag.COPPER_OXIDE_FALSE); this.addFlag(CopperOxideFlag.COPPER_OXIDE_FALSE);

View File

@ -0,0 +1,39 @@
/*
* PlotSquared, a land and world management plugin for Minecraft.
* Copyright (C) IntellectualSites <https://intellectualsites.com>
* Copyright (C) IntellectualSites team and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.plotsquared.core.plot.flag.implementations;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.plot.flag.types.BooleanFlag;
import org.checkerframework.checker.nullness.qual.NonNull;
public class BeaconEffectsFlag extends BooleanFlag<BeaconEffectsFlag> {
public static final BeaconEffectsFlag BEACON_EFFECT_TRUE = new BeaconEffectsFlag(true);
public static final BeaconEffectsFlag BEACON_EFFECT_FALSE = new BeaconEffectsFlag(false);
private BeaconEffectsFlag(boolean value){
super(value, TranslatableCaption.of("flags.flag_description_beacon_effect"));
}
@Override
protected BeaconEffectsFlag flagOf(@NonNull final Boolean value) {
return value ? BEACON_EFFECT_TRUE : BEACON_EFFECT_FALSE;
}
}

View File

@ -24,7 +24,7 @@ import com.plotsquared.core.configuration.Settings;
import com.sk89q.worldedit.world.block.BlockCategory; import com.sk89q.worldedit.world.block.BlockCategory;
import com.sk89q.worldedit.world.block.BlockStateHolder; import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@ -38,7 +38,7 @@ import java.util.Map;
*/ */
public class BlockTypeWrapper { public class BlockTypeWrapper {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BlockTypeWrapper.class.getSimpleName());
private static final Map<BlockType, BlockTypeWrapper> blockTypes = new HashMap<>(); private static final Map<BlockType, BlockTypeWrapper> blockTypes = new HashMap<>();
private static final Map<String, BlockTypeWrapper> blockCategories = new HashMap<>(); private static final Map<String, BlockTypeWrapper> blockCategories = new HashMap<>();

View File

@ -18,8 +18,8 @@
*/ */
package com.plotsquared.core.queue; package com.plotsquared.core.queue;
import com.intellectualsites.annotations.DoNotUse;
import com.plotsquared.core.location.Location; import com.plotsquared.core.location.Location;
import com.plotsquared.core.util.AnnotationHelper;
import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.BlockVector3;
@ -37,7 +37,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
* in {@link BlockArrayCacheScopedQueueCoordinator#setOffsetX(int)} and * in {@link BlockArrayCacheScopedQueueCoordinator#setOffsetX(int)} and
* {@link BlockArrayCacheScopedQueueCoordinator#setOffsetZ(int)} * {@link BlockArrayCacheScopedQueueCoordinator#setOffsetZ(int)}
*/ */
@AnnotationHelper.ApiDescription(info = "Internal use only. Subject to change at any time and created for specific use cases.") @DoNotUse
public class BlockArrayCacheScopedQueueCoordinator extends ScopedQueueCoordinator { public class BlockArrayCacheScopedQueueCoordinator extends ScopedQueueCoordinator {
private final BlockState[][][] blockStates; private final BlockState[][][] blockStates;
@ -116,7 +116,7 @@ public class BlockArrayCacheScopedQueueCoordinator extends ScopedQueueCoordinato
x += offsetX; x += offsetX;
z += offsetZ; z += offsetZ;
if (x >= scopeMinX && x < scopeMaxX && y >= minY && y <= maxY && z >= scopeMinZ && z < scopeMaxZ) { if (x >= scopeMinX && x < scopeMaxX && y >= minY && y <= maxY && z >= scopeMinZ && z < scopeMaxZ) {
blockStates[y - minY][x][z] = id.toImmutableState(); blockStates[y - minY][x - scopeMinX][z - scopeMinZ] = id.toImmutableState();
} }
return false; return false;
} }

View File

@ -20,13 +20,13 @@ package com.plotsquared.core.queue;
import com.plotsquared.core.PlotSquared; import com.plotsquared.core.PlotSquared;
import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
public abstract class QueueProvider { public abstract class QueueProvider {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + PlotSquared.class.getSimpleName());
public static QueueProvider of(final @NonNull Class<? extends QueueCoordinator> primary) { public static QueueProvider of(final @NonNull Class<? extends QueueCoordinator> primary) {
return new QueueProvider() { return new QueueProvider() {

View File

@ -1,55 +0,0 @@
/*
* PlotSquared, a land and world management plugin for Minecraft.
* Copyright (C) IntellectualSites <https://intellectualsites.com>
* Copyright (C) IntellectualSites team and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.plotsquared.core.util;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.MODULE;
import static java.lang.annotation.ElementType.PACKAGE;
import static java.lang.annotation.ElementType.RECORD_COMPONENT;
import static java.lang.annotation.ElementType.TYPE;
/**
* @since 6.2.2
*/
@AnnotationHelper.ApiDescription(info = "An internal class for custom annotations." +
"This is in no form part of the API and is subject to change at any time.")
public final class AnnotationHelper {
private AnnotationHelper() {
}
@Documented
@Retention(RetentionPolicy.CLASS)
@Target(value = {METHOD, PACKAGE, MODULE, RECORD_COMPONENT, TYPE})
public @interface ApiDescription {
/**
* Returns additional information how to use a class for the API
*
* @return the version string
* @since 6.2.2
*/
String info() default "";
}
}

View File

@ -19,6 +19,8 @@
package com.plotsquared.core.util; package com.plotsquared.core.util;
import com.google.common.eventbus.EventBus; import com.google.common.eventbus.EventBus;
import com.intellectualsites.annotations.DoNotUse;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.events.PlayerAutoPlotEvent; import com.plotsquared.core.events.PlayerAutoPlotEvent;
@ -58,7 +60,6 @@ import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.PlotId; import com.plotsquared.core.plot.PlotId;
import com.plotsquared.core.plot.Rating; import com.plotsquared.core.plot.Rating;
import com.plotsquared.core.plot.expiration.ExpireManager;
import com.plotsquared.core.plot.flag.PlotFlag; import com.plotsquared.core.plot.flag.PlotFlag;
import com.plotsquared.core.plot.flag.implementations.DeviceInteractFlag; import com.plotsquared.core.plot.flag.implementations.DeviceInteractFlag;
import com.plotsquared.core.plot.flag.implementations.MiscPlaceFlag; import com.plotsquared.core.plot.flag.implementations.MiscPlaceFlag;
@ -81,8 +82,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@AnnotationHelper.ApiDescription(info = "This is an internal class used by PlotSquared to dispatch events." + @DoNotUse
"This is in no form part of the API and is subject to change at any time.")
public class EventDispatcher { public class EventDispatcher {
private final EventBus eventBus = new EventBus("PlotSquaredEvents"); private final EventBus eventBus = new EventBus("PlotSquaredEvents");
@ -300,8 +300,8 @@ public class EventDispatcher {
if (player == null) { if (player == null) {
return; //possible future warning message to figure out where we are retrieving null return; //possible future warning message to figure out where we are retrieving null
} }
if (ExpireManager.IMP != null) { if (PlotSquared.platform().expireManager() != null) {
ExpireManager.IMP.handleJoin(player); PlotSquared.platform().expireManager().handleJoin(player);
} }
if (this.worldEdit != null) { if (this.worldEdit != null) {
if (player.getAttribute("worldedit")) { if (player.getAttribute("worldedit")) {
@ -332,6 +332,15 @@ public class EventDispatcher {
) { ) {
PlotArea area = location.getPlotArea(); PlotArea area = location.getPlotArea();
assert area != null; assert area != null;
if (!area.buildRangeContainsY(location.getY()) && !Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
player.sendMessage(
TranslatableCaption.of("height.height_limit"),
Template.of("minHeight", String.valueOf(area.getMinBuildHeight())),
Template.of("maxHeight", String.valueOf(area.getMaxBuildHeight()))
);
return false;
}
Plot plot = area.getPlot(location); Plot plot = area.getPlot(location);
if (plot != null) { if (plot != null) {
if (plot.isAdded(player.getUUID())) { if (plot.isAdded(player.getUUID())) {

View File

@ -25,7 +25,7 @@ import com.plotsquared.core.player.ConsolePlayer;
import com.plotsquared.core.plot.BlockBucket; import com.plotsquared.core.plot.BlockBucket;
import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockState;
import net.kyori.adventure.text.minimessage.Template; import net.kyori.adventure.text.minimessage.Template;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
@ -41,7 +41,7 @@ import java.util.Map;
public final class LegacyConverter { public final class LegacyConverter {
public static final String CONFIGURATION_VERSION = "post_flattening"; public static final String CONFIGURATION_VERSION = "post_flattening";
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + LegacyConverter.class.getSimpleName());
private static final HashMap<String, ConfigurationType> TYPE_MAP = new HashMap<>(); private static final HashMap<String, ConfigurationType> TYPE_MAP = new HashMap<>();
static { static {

View File

@ -29,7 +29,6 @@ import com.sk89q.worldedit.extension.input.ParserContext;
import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.function.pattern.BlockPattern; import com.sk89q.worldedit.function.pattern.BlockPattern;
import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.function.pattern.RandomPattern;
import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockState;
@ -44,7 +43,7 @@ public class PatternUtil {
public static BaseBlock apply(@NonNull Pattern pattern, int x, int y, int z) { public static BaseBlock apply(@NonNull Pattern pattern, int x, int y, int z) {
Preconditions.checkNotNull(pattern, "Pattern may not be null"); Preconditions.checkNotNull(pattern, "Pattern may not be null");
if (pattern instanceof BlockPattern || pattern instanceof RandomPattern if (pattern instanceof BlockPattern
|| pattern instanceof BlockState || pattern instanceof BlockType || pattern instanceof BlockState || pattern instanceof BlockType
|| pattern instanceof BaseBlock) { || pattern instanceof BaseBlock) {
return pattern.applyBlock(BlockVector3.ZERO); return pattern.applyBlock(BlockVector3.ZERO);

View File

@ -30,9 +30,18 @@ import org.checkerframework.checker.nullness.qual.NonNull;
* The Permissions class handles checking user permissions.<br> * The Permissions class handles checking user permissions.<br>
* - This will respect * nodes and plots.admin and can be used to check permission ranges (e.g. plots.plot.5)<br> * - This will respect * nodes and plots.admin and can be used to check permission ranges (e.g. plots.plot.5)<br>
* - Checking the PlotPlayer class directly will not take the above into account<br> * - Checking the PlotPlayer class directly will not take the above into account<br>
*
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes
*/ */
@Deprecated(forRemoval = true, since = "6.9.3")
public class Permissions { public class Permissions {
/**
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes
*/
@Deprecated(forRemoval = true, since = "6.9.3")
public static boolean hasPermission(PlotPlayer<?> player, Permission permission, boolean notify) { public static boolean hasPermission(PlotPlayer<?> player, Permission permission, boolean notify) {
return hasPermission(player, permission.toString(), notify); return hasPermission(player, permission.toString(), notify);
} }
@ -43,18 +52,25 @@ public class Permissions {
* @param caller permission holder * @param caller permission holder
* @param permission Permission * @param permission Permission
* @return {@code true} if the owner has the given permission, else {@code false} * @return {@code true} if the owner has the given permission, else {@code false}
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes
*/ */
@Deprecated(forRemoval = true, since = "6.9.3")
public static boolean hasPermission(final @NonNull PermissionHolder caller, final @NonNull Permission permission) { public static boolean hasPermission(final @NonNull PermissionHolder caller, final @NonNull Permission permission) {
return caller.hasPermission(permission.toString()); return caller.hasPermission(permission.toString());
} }
/** /**
* Check if the owner of the profile has a given (global) permission * Check if the owner of the profile has a given (global) permission. There is no guarantee that per-world permissions will
* be checked because unmaintained crap plugins like PEX exist.
* *
* @param caller permission holder * @param caller permission holder
* @param permission Permission * @param permission Permission
* @return {@code true} if the owner has the given permission, else {@code false} * @return {@code true} if the owner has the given permission, else {@code false}
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes
*/ */
@Deprecated(forRemoval = true, since = "6.9.3")
public static boolean hasPermission(final @NonNull PermissionHolder caller, final @NonNull String permission) { public static boolean hasPermission(final @NonNull PermissionHolder caller, final @NonNull String permission) {
return caller.hasPermission(permission); return caller.hasPermission(permission);
} }
@ -68,7 +84,10 @@ public class Permissions {
* @param key Permission "key" * @param key Permission "key"
* @return {@code true} if the owner has the given permission, else {@code false} * @return {@code true} if the owner has the given permission, else {@code false}
* @since 6.0.10 * @since 6.0.10
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes
*/ */
@Deprecated(forRemoval = true, since = "6.9.3")
public static boolean hasKeyedPermission( public static boolean hasKeyedPermission(
final @NonNull PermissionHolder caller, final @NonNull String permission, final @NonNull PermissionHolder caller, final @NonNull String permission,
final @NonNull String key final @NonNull String key
@ -83,7 +102,10 @@ public class Permissions {
* @param permission permission * @param permission permission
* @param notify if to notify the permission holder * @param notify if to notify the permission holder
* @return if permission is had * @return if permission is had
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes
*/ */
@Deprecated(forRemoval = true, since = "6.9.3")
public static boolean hasPermission(PlotPlayer<?> player, String permission, boolean notify) { public static boolean hasPermission(PlotPlayer<?> player, String permission, boolean notify) {
if (!hasPermission(player, permission)) { if (!hasPermission(player, permission)) {
if (notify) { if (notify) {
@ -97,6 +119,11 @@ public class Permissions {
return true; return true;
} }
/**
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes
*/
@Deprecated(forRemoval = true, since = "6.9.3")
public static int hasPermissionRange(PlotPlayer<?> player, Permission Permission, int range) { public static int hasPermissionRange(PlotPlayer<?> player, Permission Permission, int range) {
return hasPermissionRange(player, Permission.toString(), range); return hasPermissionRange(player, Permission.toString(), range);
} }
@ -110,7 +137,10 @@ public class Permissions {
* @param stub The permission stub to check e.g. for `plots.plot.#` the stub is `plots.plot` * @param stub The permission stub to check e.g. for `plots.plot.#` the stub is `plots.plot`
* @param range The range to check * @param range The range to check
* @return The highest permission they have within that range * @return The highest permission they have within that range
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes
*/ */
@Deprecated(forRemoval = true, since = "6.9.3")
public static int hasPermissionRange(PlotPlayer<?> player, String stub, int range) { public static int hasPermissionRange(PlotPlayer<?> player, String stub, int range) {
return player.hasPermissionRange(stub, range); return player.hasPermissionRange(stub, range);
} }

View File

@ -0,0 +1,53 @@
/*
* PlotSquared, a land and world management plugin for Minecraft.
* Copyright (C) IntellectualSites <https://intellectualsites.com>
* Copyright (C) IntellectualSites team and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.plotsquared.core.util;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.flag.PlotFlag;
import java.util.Objects;
/**
* Util class for generic methods relating to plot flags.
*
* @since 6.10.4
*/
public final class PlotFlagUtil {
private PlotFlagUtil() {
//No-op
}
/**
* Check if the value of a {@link PlotFlag} matches the given value. If
* road flags are disabled for the given plot area, returns false.
*
* @param flagClass boolean flag to get value of
* @param value boolean value to check flag value against
* @param <T> The flag value type
* @return true if road flag value matches with road flags enabled
* @since 6.10.4
*/
public static <T> boolean isAreaRoadFlagsAndFlagEquals(
PlotArea area, final Class<? extends PlotFlag<T, ?>> flagClass, T value
) {
return area.isRoadFlags() && Objects.equals(area.getRoadFlag(flagClass), value);
}
}

View File

@ -26,7 +26,7 @@ import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.CompoundTag;
import com.sk89q.jnbt.NBTOutputStream; import com.sk89q.jnbt.NBTOutputStream;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@ -45,7 +45,7 @@ import java.util.zip.GZIPOutputStream;
*/ */
public class PlotUploader { public class PlotUploader {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + PlotUploader.class.getSimpleName());
private static final Path TEMP_DIR = Paths.get(PlotSquared.platform().getDirectory().getPath()); private static final Path TEMP_DIR = Paths.get(PlotSquared.platform().getDirectory().getPath());
private final SchematicHandler schematicHandler; private final SchematicHandler schematicHandler;
private final Arkitektonika arkitektonika; private final Arkitektonika arkitektonika;

View File

@ -40,7 +40,7 @@ import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@ -51,7 +51,7 @@ import java.util.Set;
public abstract class RegionManager { public abstract class RegionManager {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + RegionManager.class.getSimpleName());
public static RegionManager manager = null; public static RegionManager manager = null;
protected final WorldUtil worldUtil; protected final WorldUtil worldUtil;

View File

@ -64,7 +64,7 @@ import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.biome.BiomeType;
import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.block.BlockTypes;
import com.sk89q.worldedit.internal.util.LogManagerCompat; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@ -107,7 +107,7 @@ import java.util.zip.GZIPOutputStream;
public abstract class SchematicHandler { public abstract class SchematicHandler {
private static final Logger LOGGER = LogManagerCompat.getLogger(); private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + SchematicHandler.class.getSimpleName());
private static final Gson GSON = new Gson(); private static final Gson GSON = new Gson();
public static SchematicHandler manager; public static SchematicHandler manager;
private final WorldUtil worldUtil; private final WorldUtil worldUtil;

View File

@ -36,7 +36,8 @@ import java.util.regex.Pattern;
public class StringMan { public class StringMan {
private static final Pattern STRING_SPLIT_PATTERN = Pattern.compile("(?<quoted>\"[\\w ]+\")|(?<single>\\w+)"); // Stolen from https://stackoverflow.com/a/366532/12620913 | Debug: https://regex101.com/r/DudJLb/1
private static final Pattern STRING_SPLIT_PATTERN = Pattern.compile("[^\\s\"]+|\"([^\"]*)\"");
public static String replaceFromMap(String string, Map<String, String> replacements) { public static String replaceFromMap(String string, Map<String, String> replacements) {
StringBuilder sb = new StringBuilder(string); StringBuilder sb = new StringBuilder(string);
@ -355,7 +356,7 @@ public class StringMan {
var matcher = StringMan.STRING_SPLIT_PATTERN.matcher(message); var matcher = StringMan.STRING_SPLIT_PATTERN.matcher(message);
List<String> splitMessages = new ArrayList<>(); List<String> splitMessages = new ArrayList<>();
while (matcher.find()) { while (matcher.find()) {
splitMessages.add(matcher.group(0).replaceAll("\"", "")); splitMessages.add(matcher.group(matcher.groupCount() - 1).replaceAll("\"", ""));
} }
return splitMessages; return splitMessages;
} }

View File

@ -164,7 +164,7 @@ public final class PlaceholderRegistry {
PlayerManager.getPlayerList(plot.getDenied(), player)); PlayerManager.getPlayerList(plot.getDenied(), player));
}); });
this.createPlaceholder("currentplot_creationdate", (player, plot) -> { this.createPlaceholder("currentplot_creationdate", (player, plot) -> {
if (plot.getTimestamp() == 0) { if (plot.getTimestamp() == 0 || !plot.hasOwner()) {
return legacyComponent(TranslatableCaption.of("info.unknown"), player); return legacyComponent(TranslatableCaption.of("info.unknown"), player);
} }
long creationDate = plot.getTimestamp(); long creationDate = plot.getTimestamp();

View File

@ -18,8 +18,8 @@
*/ */
package com.plotsquared.core.util.query; package com.plotsquared.core.util.query;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.expiration.ExpireManager;
import java.util.Collection; import java.util.Collection;
@ -27,7 +27,7 @@ class ExpiredPlotProvider implements PlotProvider {
@Override @Override
public Collection<Plot> getPlots() { public Collection<Plot> getPlots() {
return ExpireManager.IMP.getPendingExpired(); return PlotSquared.platform().expireManager().getPendingExpired();
} }
} }

Some files were not shown because too many files have changed in this diff Show More