Compare commits

..

48 Commits
6.1.2 ... 6.1.4

Author SHA1 Message Date
4eafd043a3 Release 6.1.4 2021-11-11 22:49:46 +01:00
826cc8c835 build: Update Gradle 2021-11-11 22:43:48 +01:00
d1dbf777a4 Don't check/set if a chunk should be saved if it's a world-plot 2021-11-11 17:57:59 +00:00
823e78377b feat: Better deciding of heights to use for generation and schematics (#3300)
* Better deciding of heights to use for generation and schematics
 - If bedrock is disabled, we should still be filling the space with something
 - Use minBuildHeight instead of hardcoding "1" for schematics (it is still 1 by default) to ensure all-encompassing schematics
 - Schematic generation/handling for roads etc. should be accounting for all of wall, road, and plot heights for deciding point of origin
 - Fixes #3269
 - Starts to address #3175

* Also do for HybridPlotManager clear
2021-11-11 17:33:38 +00:00
87a2e81ec3 Don't write biome data to schematics if it's not present 2021-11-10 19:51:14 +00:00
88775334b7 Schematic paths are configurable (#3303) 2021-11-09 10:32:07 +00:00
e126547e97 chore: Update com.fastasyncworldedit to v1.17-390 (#3324)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2021-11-09 10:00:14 +01:00
c1163cdb2e feat: Split configuration for teleport on claim/auto (#3308)
- Fixes #2953
2021-11-07 22:29:49 +01:00
30d06b7801 build: Reduce consumer dependencies 2021-11-05 11:57:58 +01:00
a5cf7bf2c2 Fix BlockLoc to the requirements for use as a home location
- Add home locations to #fromString
 - Switch to y=Integer#minValue more
 - May help with #3321
2021-11-04 20:47:56 +00:00
3d4d413de8 Minor adjustment to plot home location logic
- Allow "centre" spelling
 - ClassicPlotWorld contains the PLOT_HEIGHT config setting, not HPW
2021-11-02 15:41:16 +00:00
b97e843849 perf: Get rid of Guice overhead when accessing the plot area manager (#3315)
Fixes #3311
Co-authored-by: Jordan <dordsor21@gmail.com>
2021-11-02 13:38:48 +00:00
48c7a3e94e refactor: Use player friendly done message on restricted building (#3309) 2021-11-02 13:32:04 +00:00
7263290bbe fix: Untrusted visit flag not working with untrusted visit permission
Fixes #3317 
Co-authored-by: Alex <mc.cache@web.de>
2021-11-02 13:28:39 +00:00
e99c4e3289 chore: Update dependency org.checkerframework:checker-qual to v3.19.0 (#3320)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2021-11-01 21:51:53 +01:00
87cb26189f Closes #3313 2021-11-01 14:07:44 +01:00
2dae336a5f chore: Update com.fastasyncworldedit to v1.17-380 (#3312)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2021-11-01 14:06:47 +01:00
258ed1469b chore: Update dependency net.kyori:adventure-api to v4.9.3 (#3314)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2021-11-01 14:06:40 +01:00
6f3eabba0e feat: Don't display the default plot title if on a server-plot, unless configured otherwise. (#3305)
- If plot-title flag is set, title will still be displayed.
2021-11-01 11:23:53 +00:00
804228fa6c Allow pitch and yaw to be used in default home location (#3304) 2021-10-29 10:48:35 +01:00
be85708e5a feat: Add border bypass permission (#3302)
* Add border bypass permission
 - Fixes #3297

* Add permission to plots.admin permpack

* Implement messages on leaving/entering border area

* Rename to border.denied and make border msg red

* change too le/ge as tthey are likely to be equal to border when hit.
 - Since we check for being across the border beforehand, it will hopefully not be spammed too much?
 - If it's spammed then either we use meta to set if a player's left the border, or we just remove the come-back-in altogether because it's a little looong
2021-10-28 10:13:36 +02:00
f2368f97df chore: Update com.sk89q.worldedit to v7.2.7 (#3299)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2021-10-25 11:22:31 +02:00
df87bcb743 build: Back to snapshot for development 2021-10-18 20:30:28 +02:00
5653d0f175 Release 6.1.3 2021-10-18 20:22:13 +02:00
b022a97196 fix: Flag list parsing for console players (#3277)
Instead of recreating the logic, we can simply reuse what we created above and string-ify that for parsing.
2021-10-18 20:20:52 +02:00
cb596ee6ea Fix StackOverFlow 2021-10-18 17:27:51 +01:00
4e391136c0 Add and Trust permission now count correctly (#3290) 2021-10-15 11:28:23 +01:00
a6a0e1d12f chore: Update dependency org.checkerframework:checker-qual to v3.18.1 (#3283)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2021-10-10 00:23:32 +02:00
d2776eed5a [ci skip] Move to work level templates 2021-10-08 18:09:58 +02:00
6528c60f4d fix: Fix greeting & farewell captions not being used (#3272)
* fix: Fix greeting & farewell captions not being used

Fixes #3250

* feat: Allow alias in greeting & farewell flag
2021-10-07 08:10:00 +00:00
7ee46be2ac feat: Allow plot alias in title (#3273)
Fixes #3171
2021-10-07 08:07:13 +00:00
13bc231091 chore: Update com.fastasyncworldedit to v1.17-343 (#3282)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2021-10-05 10:26:42 +02:00
55d1a40394 chore: Update plugin shadow to v7.1.0 (#3284)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2021-10-04 20:18:56 +02:00
d70f99b489 fix: Respect tab-complete aliases (Fixes #3266) (#3268)
* Fixes #3250

* ListFlag#merge should not allow duplicates (Fixes #3157) (#3265)

* feat: Respect non-visible players in tab completion (Closes #3263) (#3264)

* Respect non-visible players in tab completion (Closes #3263)

* Deprecate old Tab-Complete methods instead of hard-replacing them

* wtf git

* Mark for removal, useless new-lines

* Pass ConsolePlayer.getConsole() instead of Nullable param

* Respect tab-complete aliases (Fixes #3266)

* Useless import

Co-authored-by: NotMyFault <mc.cache@web.de>
Co-authored-by: dordsor21 <dordsor21@gmail.com>
2021-10-04 17:10:36 +02:00
fde9735da2 chore: Update dependency net.kyori:adventure-api to v4.9.2 (#3278)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2021-10-04 17:05:52 +02:00
20f0aa3656 chore: Update com.fastasyncworldedit to v1.17-341 (#3275)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2021-10-04 17:05:38 +02:00
0b7bf2d26d chore: Update dependency dev.notmyfault.serverlib:ServerLib to v2.3.1 (#3276)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2021-10-04 17:05:24 +02:00
f10e38af63 [ci skip] chore: Improve pr template fields 2021-10-04 15:43:44 +02:00
21727ebfc7 build: Overhaul build & deployment workflow (#3267)
* Fixes #3250

* build: Overhaul build & deployment workflow

- Move to release drafter
- Replace publishing with gradle nexus
- Conventional commits are handy
- Determine build status in gh actions before deploying
2021-10-04 15:28:47 +02:00
e322ee85fd feat: Respect non-visible players in tab completion (Closes #3263) (#3264)
* Respect non-visible players in tab completion (Closes #3263)

* Deprecate old Tab-Complete methods instead of hard-replacing them

* wtf git

* Mark for removal, useless new-lines

* Pass ConsolePlayer.getConsole() instead of Nullable param
2021-10-03 14:32:02 +02:00
541255fe7e ListFlag#merge should not allow duplicates (Fixes #3157) (#3265) 2021-10-03 14:31:57 +02:00
20c2f36f6c Update com.fastasyncworldedit to v1.17-336 (#3258)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2021-09-29 18:09:46 +02:00
744f7a18ae Update dependency org.junit.jupiter:junit-jupiter to v5.8.1 (#3259)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2021-09-29 18:09:35 +02:00
18eece0b71 [ci skip] chore: Renovate
Closes #3260
2021-09-29 18:09:12 +02:00
4f12dcf966 Return base plot when using alias (#3253) 2021-09-25 15:58:31 +02:00
ee832528db [ci skip] Adjust renovate config
Closes #3252
2021-09-21 00:52:25 +02:00
bb5d6c91da Update Fawe version 2021-09-20 16:21:18 +02:00
6d4adecb32 6.1.3 2021-09-18 23:07:10 +01:00
69 changed files with 646 additions and 425 deletions

View File

@ -1008,6 +1008,6 @@ ij_html_uniform_ident = false
indent_size = 2 indent_size = 2
ij_yaml_keep_indents_on_empty_lines = false ij_yaml_keep_indents_on_empty_lines = false
ij_yaml_keep_line_breaks = true ij_yaml_keep_line_breaks = true
ij_yaml_space_before_colon = true ij_yaml_space_before_colon = false
ij_yaml_spaces_within_braces = true ij_yaml_spaces_within_braces = true
ij_yaml_spaces_within_brackets = true ij_yaml_spaces_within_brackets = true

12
.github/FUNDING.yml vendored
View File

@ -1,12 +0,0 @@
# These are supported funding model platforms
github: [NotMyFault, dordsor21, SirYwell]
patreon: IntellectualSites # Replace with a single Patreon username
open_collective: IntellectualSites
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: https://www.paypal.me/AlexanderBrandes # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

View File

@ -1,17 +0,0 @@
## Overview
<!-- Please describe which issue this Pull Request targets
If there is no issue, please create one so we can look into it before approving your PR.
You can do so here: https://github.com/IntellectualSites/PlotSquared/issues
-->
**Fixes {Link to issue}**
## Description
## Checklist
<!-- Make sure you have completed the following steps (put an "X" between of brackets): -->
- [] I included all information required in the sections above
- [] I tested my changes and approved their functionality
- [] I ensured my changes do not break other parts of the code
- [] I read and followed the [contribution guidelines](https://github.com/IntellectualSites/PlotSquared/blob/v6/CONTRIBUTING.md)

1
.github/release-drafter.yml vendored Normal file
View File

@ -0,0 +1 @@
_extends: .github

View File

@ -1,6 +1,6 @@
name: "build" name: "build"
on: ["pull_request", "push"] on: [ "pull_request", "push" ]
jobs: jobs:
build: build:
@ -8,10 +8,34 @@ jobs:
steps: steps:
- name: "Checkout Repository" - name: "Checkout Repository"
uses: "actions/checkout@v2.3.4" uses: "actions/checkout@v2.3.4"
- name: "Setup JDK 16" - name: "Validate Gradle Wrapper"
uses: "actions/setup-java@v2.2.0" uses: "gradle/wrapper-validation-action@v1.0.4"
- name: "Setup Java"
uses: "actions/setup-java@v2.3.1"
with: with:
distribution: "temurin" distribution: "temurin"
java-version: "16" java-version: "17"
- name: "Clean Build" - name: "Clean Build"
run: "./gradlew clean build" run: "./gradlew clean build"
- name: "Determine release status"
if: "${{ runner.os == 'Linux' }}"
run: |
if [ "$(./gradlew properties | awk '/^version:/ { print $2; }' | grep '\-SNAPSHOT')" ]; then
echo "STATUS=snapshot" >> $GITHUB_ENV
else
echo "STATUS=release" >> $GITHUB_ENV
fi
- name: "Publish Release"
if: "${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v6'}}"
run: "./gradlew publishToSonatype closeSonatypeStagingRepository"
env:
ORG_GRADLE_PROJECT_sonatypeUsername: "${{ secrets.SONATYPE_USERNAME }}"
ORG_GRADLE_PROJECT_sonatypePassword: "${{ secrets.SONATYPE_PASSWORD }}"
ORG_GRADLE_PROJECT_signingKey: "${{ secrets.SIGNING_KEY }}"
ORG_GRADLE_PROJECT_signingPassword: "${{ secrets.SIGNING_PASSWORD }}"
- name: "Publish Snapshot"
if: "${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v6' }}"
run: "./gradlew publishToSonatype"
env:
ORG_GRADLE_PROJECT_sonatypeUsername: "${{ secrets.SONATYPE_USERNAME }}"
ORG_GRADLE_PROJECT_sonatypePassword: "${{ secrets.SONATYPE_PASSWORD }}"

14
.github/workflows/release-drafter.yml vendored Normal file
View File

@ -0,0 +1,14 @@
name: "draft release"
on:
push:
branches:
- v6
jobs:
update_release_draft:
runs-on: "ubuntu-latest"
steps:
- uses: "release-drafter/release-drafter@v5.15.0"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -1,12 +0,0 @@
name: "validate gradle wrapper"
on: ["pull_request", "push"]
jobs:
build:
runs-on: "ubuntu-20.04"
steps:
- name: "Checkout Repository"
uses: "actions/checkout@v2.3.4"
- name: "Validate Gradle Wrapper"
uses: "gradle/wrapper-validation-action@v1.0.4"

View File

@ -24,7 +24,7 @@ dependencies {
implementation(libs.bstats) implementation(libs.bstats)
// Paper // Paper
compileOnlyApi(libs.paper) compileOnly(libs.paper)
implementation(libs.paperlib) implementation(libs.paperlib)
// Plugins // Plugins
@ -32,8 +32,8 @@ dependencies {
exclude(group = "org.bukkit") exclude(group = "org.bukkit")
exclude(group = "org.spigotmc") exclude(group = "org.spigotmc")
} }
compileOnlyApi(libs.fastasyncworldeditBukkit) compileOnly(libs.fastasyncworldeditBukkit) { isTransitive = false }
testImplementation(libs.fastasyncworldeditBukkit) testImplementation(libs.fastasyncworldeditBukkit) { isTransitive = false }
compileOnly(libs.vault) { compileOnly(libs.vault) {
exclude(group = "org.bukkit") exclude(group = "org.bukkit")
} }

View File

@ -27,6 +27,7 @@ package com.plotsquared.bukkit;
import com.plotsquared.bukkit.util.BukkitUtil; import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.core.command.MainCommand; import com.plotsquared.core.command.MainCommand;
import com.plotsquared.core.configuration.Settings;
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 org.bukkit.command.Command; import org.bukkit.command.Command;
@ -42,6 +43,7 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Locale;
public class BukkitCommand implements CommandExecutor, TabCompleter { public class BukkitCommand implements CommandExecutor, TabCompleter {
@ -63,7 +65,7 @@ public class BukkitCommand implements CommandExecutor, TabCompleter {
@Override @Override
public List<String> onTabComplete( public List<String> onTabComplete(
CommandSender commandSender, Command command, String s, CommandSender commandSender, Command command, String label,
String[] args String[] args
) { ) {
if (!(commandSender instanceof Player)) { if (!(commandSender instanceof Player)) {
@ -73,8 +75,11 @@ public class BukkitCommand implements CommandExecutor, TabCompleter {
if (args.length == 0) { if (args.length == 0) {
return Collections.singletonList("plots"); return Collections.singletonList("plots");
} }
if (!Settings.Enabled_Components.TAB_COMPLETED_ALIASES.contains(label.toLowerCase(Locale.ENGLISH))) {
return List.of();
}
Collection<com.plotsquared.core.command.Command> objects = Collection<com.plotsquared.core.command.Command> objects =
MainCommand.getInstance().tab(player, args, s.endsWith(" ")); MainCommand.getInstance().tab(player, args, label.endsWith(" "));
if (objects == null) { if (objects == null) {
return null; return null;
} }

View File

@ -1180,6 +1180,11 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
return this.injector; return this.injector;
} }
@Override
public @NonNull PlotAreaManager plotAreaManager() {
return this.plotAreaManager;
}
@NonNull @NonNull
@Override @Override
public Locale getLocale() { public Locale getLocale() {

View File

@ -318,8 +318,7 @@ public class BlockEventListener implements Listener {
} else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { } else 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("permission.no_permission_event"), TranslatableCaption.of("done.building_restricted")
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER))
); );
event.setCancelled(true); event.setCancelled(true);
return; return;
@ -401,8 +400,7 @@ public class BlockEventListener implements Listener {
} else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { } else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER)) { if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
plotPlayer.sendMessage( plotPlayer.sendMessage(
TranslatableCaption.of("permission.no_permission_event"), TranslatableCaption.of("done.building_restricted")
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_DESTROY_OTHER))
); );
event.setCancelled(true); event.setCancelled(true);
return; return;

View File

@ -32,6 +32,7 @@ import com.plotsquared.core.location.Location;
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.world.PlotAreaManager; import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.plot.world.SinglePlotArea;
import com.plotsquared.core.util.ReflectionUtils.RefClass; import com.plotsquared.core.util.ReflectionUtils.RefClass;
import com.plotsquared.core.util.ReflectionUtils.RefField; import com.plotsquared.core.util.ReflectionUtils.RefField;
import com.plotsquared.core.util.ReflectionUtils.RefMethod; import com.plotsquared.core.util.ReflectionUtils.RefMethod;
@ -295,7 +296,7 @@ public class ChunkListener implements Listener {
Chunk chunk = event.getChunk(); Chunk chunk = event.getChunk();
if (Settings.Chunk_Processor.AUTO_TRIM) { if (Settings.Chunk_Processor.AUTO_TRIM) {
String world = chunk.getWorld().getName(); String world = chunk.getWorld().getName();
if (this.plotAreaManager.hasPlotArea(world)) { if ((!Settings.Enabled_Components.WORLDS || !SinglePlotArea.isSinglePlotWorld(world)) && this.plotAreaManager.hasPlotArea(world)) {
if (unloadChunk(world, chunk, true)) { if (unloadChunk(world, chunk, true)) {
return; return;
} }
@ -365,8 +366,7 @@ public class ChunkListener implements Listener {
} }
private void cleanChunk(final Chunk chunk) { private void cleanChunk(final Chunk chunk) {
TaskManager.index.incrementAndGet(); final int currentIndex = TaskManager.index.incrementAndGet();
final int currentIndex = TaskManager.index.get();
PlotSquaredTask task = TaskManager.runTaskRepeat(() -> { PlotSquaredTask task = TaskManager.runTaskRepeat(() -> {
if (!chunk.isLoaded()) { if (!chunk.isLoaded()) {
Objects.requireNonNull(TaskManager.removeTask(currentIndex)).cancel(); Objects.requireNonNull(TaskManager.removeTask(currentIndex)).cancel();

View File

@ -564,19 +564,31 @@ public class PlayerEventListener extends PlotListener implements Listener {
return; return;
} }
int border = area.getBorder(); int border = area.getBorder();
int x1;
if (x2 > border && this.tmpTeleport) { if (x2 > border && this.tmpTeleport) {
to.setX(border - 1); if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
this.tmpTeleport = false; to.setX(border - 1);
player.teleport(event.getTo()); this.tmpTeleport = false;
this.tmpTeleport = true; player.teleport(event.getTo());
pp.sendMessage(TranslatableCaption.of("border.border")); this.tmpTeleport = true;
} pp.sendMessage(TranslatableCaption.of("border.denied"));
if (x2 < -border && this.tmpTeleport) { } else {
to.setX(-border + 1); pp.sendMessage(TranslatableCaption.of("border.bypass.exited"));
this.tmpTeleport = false; }
player.teleport(event.getTo()); } else if (x2 < -border && this.tmpTeleport) {
this.tmpTeleport = true; if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
pp.sendMessage(TranslatableCaption.of("border.border")); to.setX(-border + 1);
this.tmpTeleport = false;
player.teleport(event.getTo());
this.tmpTeleport = true;
pp.sendMessage(TranslatableCaption.of("border.denied"));
} else {
pp.sendMessage(TranslatableCaption.of("border.bypass.exited"));
}
} else if (((x1 = MathMan.roundInt(from.getX())) >= border && x2 <= border) || (x1 <= -border && x2 >= -border)) {
if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
pp.sendMessage(TranslatableCaption.of("border.bypass.entered"));
}
} }
} }
int z2; int z2;
@ -643,18 +655,31 @@ public class PlayerEventListener extends PlotListener implements Listener {
return; return;
} }
int border = area.getBorder(); int border = area.getBorder();
int z1;
if (z2 > border && this.tmpTeleport) { if (z2 > border && this.tmpTeleport) {
to.setZ(border - 1); if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
this.tmpTeleport = false; to.setZ(border - 1);
player.teleport(event.getTo()); this.tmpTeleport = false;
this.tmpTeleport = true; player.teleport(event.getTo());
pp.sendMessage(TranslatableCaption.of("border.border")); this.tmpTeleport = true;
pp.sendMessage(TranslatableCaption.of("border.denied"));
} else {
pp.sendMessage(TranslatableCaption.of("border.bypass.exited"));
}
} else if (z2 < -border && this.tmpTeleport) { } else if (z2 < -border && this.tmpTeleport) {
to.setZ(-border + 1); if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
this.tmpTeleport = false; to.setZ(-border + 1);
player.teleport(event.getTo()); this.tmpTeleport = false;
this.tmpTeleport = true; player.teleport(event.getTo());
pp.sendMessage(TranslatableCaption.of("border.border")); this.tmpTeleport = true;
pp.sendMessage(TranslatableCaption.of("border.denied"));
} else {
pp.sendMessage(TranslatableCaption.of("border.bypass.exited"));
}
} else if (((z1 = MathMan.roundInt(from.getZ())) >= border && z2 <= border) || (z1 <= -border && z2 >= -border)) {
if (Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
pp.sendMessage(TranslatableCaption.of("border.bypass.entered"));
}
} }
} }
} }
@ -960,8 +985,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
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("permission.no_permission_event"), TranslatableCaption.of("done.building_restricted")
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER))
); );
e.setCancelled(true); e.setCancelled(true);
return; return;
@ -1233,8 +1257,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
} else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { } else 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("permission.no_permission_event"), TranslatableCaption.of("done.building_restricted")
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER))
); );
event.setCancelled(true); event.setCancelled(true);
} }
@ -1307,8 +1330,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
} else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { } else if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER)) { if (!Permissions.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
plotPlayer.sendMessage( plotPlayer.sendMessage(
TranslatableCaption.of("permission.no_permission_event"), TranslatableCaption.of("done.building_restricted")
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER))
); );
event.setCancelled(true); event.setCancelled(true);
} }

View File

@ -27,6 +27,7 @@ package com.plotsquared.bukkit.listener;
import com.plotsquared.core.PlotSquared; import com.plotsquared.core.PlotSquared;
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.SinglePlotAreaManager; import com.plotsquared.core.plot.world.SinglePlotAreaManager;
import com.plotsquared.core.util.ReflectionUtils; import com.plotsquared.core.util.ReflectionUtils;
import org.bukkit.Chunk; import org.bukkit.Chunk;
@ -86,7 +87,7 @@ public class SingleWorldListener implements Listener {
if (!(man instanceof SinglePlotAreaManager)) { if (!(man instanceof SinglePlotAreaManager)) {
return; return;
} }
if (!isPlotId(name)) { if (!SinglePlotArea.isSinglePlotWorld(name)) {
return; return;
} }
@ -103,31 +104,4 @@ public class SingleWorldListener implements Listener {
handle(event); handle(event);
} }
private boolean isPlotId(String worldName) {
int len = worldName.length();
int separator = 0;
for (int i = 0; i < len; i++) {
switch (worldName.charAt(i)) {
case '_':
separator++;
break;
case '-':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
break;
default:
return false;
}
}
return separator == 1;
}
} }

View File

@ -178,8 +178,7 @@ public class BukkitEntityUtil {
if (!Permissions if (!Permissions
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER)) { .hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_OTHER)) {
plotPlayer.sendMessage( plotPlayer.sendMessage(
TranslatableCaption.of("permission.no_permission_event"), TranslatableCaption.of("done.building_restricted")
Template.of("node", String.valueOf(Permission.PERMISSION_ADMIN_BUILD_OTHER))
); );
return false; return false;
} }

View File

@ -248,9 +248,12 @@ permissions:
plots.admin.components.other: true plots.admin.components.other: true
plots.admin.vehicle.break.unowned: true plots.admin.vehicle.break.unowned: true
plots.admin.pve.unowned: true plots.admin.pve.unowned: true
plots.admin.border.bypass: true
plots.teleport.delay.bypass: plots.teleport.delay.bypass:
default: op default: op
plots.admin.border.bypass:
default: op
plots.worldedit.bypass: plots.worldedit.bypass:
default: op default: op
plots.gamemode.bypass: plots.gamemode.bypass:

View File

@ -1,8 +0,0 @@
# Contributing
If you feel like you can improve the plugin any way, then you are more than welcome to contribute to PlotSquared. It would be highly appreciated if you made sure to test your code before committing it, as it will save us a lot of time and effort.
### Code Style
If you are planning to commit any changes to the project, it would be highly appreciated if you were to follow the project
code style conventions. To make this easier we have provided settings that can be picked up by your IDE.
IntelliJ: Install the `EditorConfig` plugin. Now IntelliJ is able to pick up the provided `.editorconfig` file automatically.

View File

@ -25,14 +25,14 @@ dependencies {
compileOnlyApi(libs.findbugs) compileOnlyApi(libs.findbugs)
// Plugins // Plugins
compileOnlyApi(libs.worldeditCore) { compileOnly(libs.worldeditCore) {
exclude(group = "bukkit-classloader-check") exclude(group = "bukkit-classloader-check")
exclude(group = "mockito-core") exclude(group = "mockito-core")
exclude(group = "dummypermscompat") exclude(group = "dummypermscompat")
} }
testImplementation(libs.worldeditCore) testImplementation(libs.worldeditCore)
compileOnlyApi(libs.fastasyncworldeditCore) compileOnly(libs.fastasyncworldeditCore) { isTransitive = false }
testImplementation(libs.fastasyncworldeditCore) testImplementation(libs.fastasyncworldeditCore) { isTransitive = false }
// Logging // Logging
compileOnlyApi(libs.log4j) compileOnlyApi(libs.log4j)

View File

@ -38,6 +38,7 @@ 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.world.PlotAreaManager;
import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.queue.GlobalBlockQueue;
import com.plotsquared.core.util.ChunkManager; import com.plotsquared.core.util.ChunkManager;
import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.EconHandler;
@ -268,6 +269,13 @@ public interface PlotPlatform<P> extends LocaleHolder {
return injector().getInstance(ChunkManager.class); return injector().getInstance(ChunkManager.class);
} }
/**
* Get the {@link PlotAreaManager} implementation.
*
* @return the PlotAreaManager
*/
@NonNull PlotAreaManager plotAreaManager();
/** /**
* Get the platform specific console {@link Audience} * Get the platform specific console {@link Audience}
* *

View File

@ -283,7 +283,7 @@ public class PlotSquared {
* @return Plot area manager * @return Plot area manager
*/ */
public @NonNull PlotAreaManager getPlotAreaManager() { public @NonNull PlotAreaManager getPlotAreaManager() {
return this.platform.injector().getInstance(PlotAreaManager.class); return this.platform.plotAreaManager();
} }
public void startExpiryTasks() { public void startExpiryTasks() {

View File

@ -193,19 +193,28 @@ public class PlayerBackupProfile implements BackupProfile {
future.completeExceptionally(new IllegalArgumentException( future.completeExceptionally(new IllegalArgumentException(
"The backup is non-existent or not in the correct format")); "The backup is non-existent or not in the correct format"));
} else { } else {
this.schematicHandler.paste(schematic, plot, 0, 1, 0, false, player, new RunnableVal<Boolean>() { this.schematicHandler.paste(
@Override schematic,
public void run(Boolean value) { plot,
if (value) { 0,
future.complete(null); plot.getArea().getMinBuildHeight(),
} else { 0,
future.completeExceptionally(new RuntimeException(MINI_MESSAGE.stripTokens( false,
TranslatableCaption player,
.of("schematics.schematic_paste_failed") new RunnableVal<>() {
.getComponent(ConsolePlayer.getConsole())))); @Override
public void run(Boolean value) {
if (value) {
future.complete(null);
} else {
future.completeExceptionally(new RuntimeException(MINI_MESSAGE.stripTokens(
TranslatableCaption
.of("schematics.schematic_paste_failed")
.getComponent(ConsolePlayer.getConsole()))));
}
}
} }
} );
});
} }
}); });
} }

View File

@ -132,7 +132,7 @@ public class Add extends Command {
checkTrue(!uuids.isEmpty(), null); checkTrue(!uuids.isEmpty(), null);
int localAddSize = plot.getMembers().size(); int localAddSize = plot.getMembers().size();
int maxAddSize = Permissions.hasPermissionRange(player, Permission.PERMISSION_ADD, Settings.Limit.MAX_PLOTS); int maxAddSize = Permissions.hasPermissionRange(player, Permission.PERMISSION_ADD, Settings.Limit.MAX_PLOTS);
if (localAddSize > maxAddSize) { if (localAddSize >= maxAddSize) {
player.sendMessage( player.sendMessage(
TranslatableCaption.of("members.plot_max_members_added"), TranslatableCaption.of("members.plot_max_members_added"),
Template.of("amount", String.valueOf(localAddSize)) Template.of("amount", String.valueOf(localAddSize))
@ -166,7 +166,7 @@ public class Add extends Command {
@Override @Override
public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) { public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -29,6 +29,7 @@ import com.google.inject.Inject;
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.ConfigurationUtil; import com.plotsquared.core.configuration.ConfigurationUtil;
import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.CaptionHolder; import com.plotsquared.core.configuration.caption.CaptionHolder;
import com.plotsquared.core.configuration.caption.Templates; import com.plotsquared.core.configuration.caption.Templates;
import com.plotsquared.core.configuration.caption.TranslatableCaption; import com.plotsquared.core.configuration.caption.TranslatableCaption;
@ -222,7 +223,7 @@ public class Area extends SubCommand {
hybridPlotWorld.setAllowSigns(false); hybridPlotWorld.setAllowSigns(false);
final File parentFile = FileUtils.getFile( final File parentFile = FileUtils.getFile(
PlotSquared.platform().getDirectory(), PlotSquared.platform().getDirectory(),
"schematics" + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + hybridPlotWorld.getWorldName() + File.separator Settings.Paths.SCHEMATICS + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + hybridPlotWorld.getWorldName() + File.separator
+ hybridPlotWorld.getId() + hybridPlotWorld.getId()
); );
if (!parentFile.exists() && !parentFile.mkdirs()) { if (!parentFile.exists() && !parentFile.mkdirs()) {
@ -856,11 +857,11 @@ public class Area extends SubCommand {
) { ) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_AREA) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_AREA) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -183,10 +183,12 @@ public class Claim extends SubCommand {
); );
} }
} }
int border = area.getBorder(); if (!Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
if (border != Integer.MAX_VALUE && plot.getDistanceFromOrigin() > border && !force) { int border = area.getBorder();
player.sendMessage(TranslatableCaption.of("border.border")); if (border != Integer.MAX_VALUE && plot.getDistanceFromOrigin() > border && !force) {
return false; player.sendMessage(TranslatableCaption.of("border.denied"));
return false;
}
} }
plot.setOwnerAbs(player.getUUID()); plot.setOwnerAbs(player.getUUID());
final String finalSchematic = schematic; final String finalSchematic = schematic;

View File

@ -916,11 +916,11 @@ public class Cluster extends SubCommand {
) { ) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_CLUSTER) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -94,7 +94,7 @@ public class Deny extends SubCommand {
int maxDenySize = Permissions.hasPermissionRange(player, Permission.PERMISSION_DENY, Settings.Limit.MAX_PLOTS); int maxDenySize = Permissions.hasPermissionRange(player, Permission.PERMISSION_DENY, Settings.Limit.MAX_PLOTS);
int size = plot.getDenied().size(); int size = plot.getDenied().size();
if (size > (maxDenySize - 1)) { if (size >= maxDenySize) {
player.sendMessage( player.sendMessage(
TranslatableCaption.of("members.plot_max_members_denied"), TranslatableCaption.of("members.plot_max_members_denied"),
Template.of("amount", String.valueOf(size)) Template.of("amount", String.valueOf(size))
@ -157,7 +157,7 @@ public class Deny extends SubCommand {
@Override @Override
public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) { public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
private void handleKick(PlotPlayer<?> player, Plot plot) { private void handleKick(PlotPlayer<?> player, Plot plot) {

View File

@ -70,11 +70,11 @@ public class Dislike extends SubCommand {
.map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) { .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_RATE) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_RATE) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -173,11 +173,11 @@ public class Download extends SubCommand {
) { ) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_DOWNLOAD) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_DOWNLOAD) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
private void upload(PlotPlayer<?> player, Plot plot) { private void upload(PlotPlayer<?> player, Plot plot) {

View File

@ -176,11 +176,11 @@ public class Grant extends Command {
) { ) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_GRANT_SINGLE) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_GRANT_SINGLE) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -307,11 +307,11 @@ public class Inbox extends SubCommand {
.map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.CHAT) { .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.CHAT) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_INBOX) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_INBOX) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -161,7 +161,7 @@ public class Info extends SubCommand {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_INFO_FORCE) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_AREA_INFO_FORCE) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;

View File

@ -220,11 +220,11 @@ public class Like extends SubCommand {
.map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) { .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_RATE) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_RATE) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -532,7 +532,7 @@ public class ListCmd extends SubCommand {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_PLAYER) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_LIST_PLAYER) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;

View File

@ -149,7 +149,7 @@ public class Load extends SubCommand {
0, 0,
false, false,
player, player,
new RunnableVal<Boolean>() { new RunnableVal<>() {
@Override @Override
public void run(Boolean value) { public void run(Boolean value) {
plot.removeRunning(); plot.removeRunning();

View File

@ -274,7 +274,7 @@ public class MainCommand extends Command {
} }
tp = true; tp = true;
} else { } else {
player.sendMessage(TranslatableCaption.of("border.border")); player.sendMessage(TranslatableCaption.of("border.denied"));
} }
// Trim command // Trim command
args = Arrays.copyOfRange(args, 1, args.length); args = Arrays.copyOfRange(args, 1, args.length);

View File

@ -209,7 +209,7 @@ public class Owner extends SetCommand {
@Override @Override
public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) { public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -292,11 +292,11 @@ public class Rate extends SubCommand {
.map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) { .map(completion -> new Command(null, true, completion, "", RequiredType.PLAYER, CommandCategory.INFO) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_RATE) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_RATE) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
private static class MutableInt { private static class MutableInt {

View File

@ -142,7 +142,7 @@ public class Remove extends SubCommand {
if (plot == null) { if (plot == null) {
return Collections.emptyList(); return Collections.emptyList();
} }
return TabCompletions.completeAddedPlayers(plot, String.join(",", args).trim(), return TabCompletions.completeAddedPlayers(player, plot, String.join(",", args).trim(),
Collections.singletonList(player.getName()) Collections.singletonList(player.getName())
); );
} }

View File

@ -166,7 +166,7 @@ public class SchematicCmd extends SubCommand {
0, 0,
false, false,
player, player,
new RunnableVal<Boolean>() { new RunnableVal<>() {
@Override @Override
public void run(Boolean value) { public void run(Boolean value) {
SchematicCmd.this.running = false; SchematicCmd.this.running = false;
@ -317,11 +317,11 @@ public class SchematicCmd extends SubCommand {
) { ) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_SCHEMATIC) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_SCHEMATIC) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -288,7 +288,7 @@ public class Set extends SubCommand {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_SET) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_SET) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} else if (args.length > 1) { } else if (args.length > 1) {

View File

@ -305,11 +305,11 @@ public class Template extends SubCommand {
) { ) {
}).collect(Collectors.toCollection(LinkedList::new)); }).collect(Collectors.toCollection(LinkedList::new));
if (Permissions.hasPermission(player, Permission.PERMISSION_TEMPLATE) && args[0].length() > 0) { if (Permissions.hasPermission(player, Permission.PERMISSION_TEMPLATE) && args[0].length() > 0) {
commands.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); commands.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
} }
return commands; return commands;
} }
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -138,7 +138,7 @@ public class Trust extends Command {
checkTrue(!uuids.isEmpty(), null); checkTrue(!uuids.isEmpty(), null);
int localTrustSize = currentPlot.getTrusted().size(); int localTrustSize = currentPlot.getTrusted().size();
int maxTrustSize = Permissions.hasPermissionRange(player, Permission.PERMISSION_TRUST, Settings.Limit.MAX_PLOTS); int maxTrustSize = Permissions.hasPermissionRange(player, Permission.PERMISSION_TRUST, Settings.Limit.MAX_PLOTS);
if (localTrustSize > maxTrustSize) { if (localTrustSize >= maxTrustSize) {
player.sendMessage( player.sendMessage(
TranslatableCaption.of("members.plot_max_members_trusted"), TranslatableCaption.of("members.plot_max_members_trusted"),
Template.of("amount", String.valueOf(localTrustSize)) Template.of("amount", String.valueOf(localTrustSize))
@ -168,7 +168,7 @@ public class Trust extends Command {
@Override @Override
public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) { public Collection<Command> tab(final PlotPlayer<?> player, final String[] args, final boolean space) {
return TabCompletions.completePlayers(String.join(",", args).trim(), Collections.emptyList()); return TabCompletions.completePlayers(player, String.join(",", args).trim(), Collections.emptyList());
} }
} }

View File

@ -140,21 +140,16 @@ public class Visit extends Command {
return; return;
} }
} else { } else {
if (!Permissions.hasPermission(player, Permission.PERMISSION_VISIT_OTHER)) { // allow visit, if UntrustedVisit flag is set, or if the player has either the plot.visit.other or
// plot.admin.visit.untrusted permission
if (!plot.getFlag(UntrustedVisitFlag.class) && !Permissions.hasPermission(player, Permission.PERMISSION_VISIT_OTHER)
&& !Permissions.hasPermission(player, Permission.PERMISSION_ADMIN_VISIT_UNTRUSTED)) {
player.sendMessage( player.sendMessage(
TranslatableCaption.of("permission.no_permission"), TranslatableCaption.of("permission.no_permission"),
Templates.of("node", "plots.visit.other") Templates.of("node", "plots.visit.other")
); );
return; return;
} }
if (!plot.getFlag(UntrustedVisitFlag.class) && !Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN_VISIT_UNTRUSTED)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
Templates.of("node", "plots.admin.visit.untrusted")
);
return;
}
if (plot.isDenied(player.getUUID())) { if (plot.isDenied(player.getUUID())) {
if (!Permissions.hasPermission(player, Permission.PERMISSION_VISIT_DENIED)) { if (!Permissions.hasPermission(player, Permission.PERMISSION_VISIT_DENIED)) {
player.sendMessage( player.sendMessage(
@ -334,7 +329,7 @@ public class Visit extends Command {
public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) { public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
final List<Command> completions = new ArrayList<>(); final List<Command> completions = new ArrayList<>();
switch (args.length - 1) { switch (args.length - 1) {
case 0 -> completions.addAll(TabCompletions.completePlayers(args[0], Collections.emptyList())); case 0 -> completions.addAll(TabCompletions.completePlayers(player, args[0], Collections.emptyList()));
case 1 -> { case 1 -> {
completions.addAll( completions.addAll(
TabCompletions.completeAreas(args[1])); TabCompletions.completeAreas(args[1]));

View File

@ -556,8 +556,10 @@ public class Settings extends Config {
public static boolean ON_DEATH = false; public static boolean ON_DEATH = false;
@Comment("Teleport to your plot on login") @Comment("Teleport to your plot on login")
public static boolean ON_LOGIN = false; public static boolean ON_LOGIN = false;
@Comment("Teleport to your plot on claim") @Comment("Teleport to your plot on claim (/plot claim)")
public static boolean ON_CLAIM = true; public static boolean ON_CLAIM = true;
@Comment("Teleport to your plot on auto (/plot auto)")
public static boolean ON_AUTO = true;
@Comment({"Add a delay to all teleport commands (in seconds)", @Comment({"Add a delay to all teleport commands (in seconds)",
"Assign `plots.teleport.delay.bypass` to bypass the cooldown"}) "Assign `plots.teleport.delay.bypass` to bypass the cooldown"})
public static int DELAY = 0; public static int DELAY = 0;
@ -708,6 +710,9 @@ public class Settings extends Config {
"If you would like to still show the owner of the plot, append the contents of \"titles.title_entered_plot_sub\" onto the " + "If you would like to still show the owner of the plot, append the contents of \"titles.title_entered_plot_sub\" onto the " +
"former lang key."}) "former lang key."})
public static boolean TITLES_AS_ACTIONBAR = false; public static boolean TITLES_AS_ACTIONBAR = false;
@Comment({"If the default title should be displayed on plots with server-plot flag set.",
"Titles will still be sent if the plot-title flag is set."})
public static boolean DISPLAY_DEFAULT_ON_SERVER_PLOT = false;
} }

View File

@ -2099,6 +2099,7 @@ public class SQLManager implements AbstractDB {
case "default": case "default":
case "0,0,0": case "0,0,0":
case "center": case "center":
case "centre":
break; break;
default: default:
try { try {
@ -2946,6 +2947,7 @@ public class SQLManager implements AbstractDB {
case "default": case "default":
case "0,0,0": case "0,0,0":
case "center": case "center":
case "centre":
break; break;
default: default:
try { try {

View File

@ -506,16 +506,32 @@ public class ClassicPlotManager extends SquarePlotManager {
Location.at( Location.at(
classicPlotWorld.getWorldName(), classicPlotWorld.getWorldName(),
sx, sx,
Math.min(classicPlotWorld.WALL_HEIGHT, classicPlotWorld.ROAD_HEIGHT) + 1, Math.min(
classicPlotWorld.PLOT_HEIGHT,
Math.min(classicPlotWorld.WALL_HEIGHT, classicPlotWorld.ROAD_HEIGHT)
) + 1,
sz + 1 sz + 1
), ),
Location.at(classicPlotWorld.getWorldName(), ex, maxY, ez - 1), BlockTypes.AIR.getDefaultState() Location.at(classicPlotWorld.getWorldName(), ex, maxY, ez - 1), BlockTypes.AIR.getDefaultState()
); );
queue.setCuboid( if (classicPlotWorld.PLOT_BEDROCK) {
Location.at(classicPlotWorld.getWorldName(), sx, 0, sz + 1), queue.setCuboid(
Location.at(classicPlotWorld.getWorldName(), ex, 0, ez - 1), Location.at(classicPlotWorld.getWorldName(), sx, 0, sz + 1),
BlockUtil.get((short) 7, (byte) 0) Location.at(classicPlotWorld.getWorldName(), ex, 0, ez - 1),
); BlockTypes.BEDROCK.getDefaultState()
);
queue.setCuboid(
Location.at(classicPlotWorld.getWorldName(), sx, 1, sz + 1),
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.WALL_HEIGHT, ez - 1),
classicPlotWorld.WALL_FILLING.toPattern()
);
} else {
queue.setCuboid(
Location.at(classicPlotWorld.getWorldName(), sx, 0, sz + 1),
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.WALL_HEIGHT, ez - 1),
classicPlotWorld.WALL_FILLING.toPattern()
);
}
queue.setCuboid( queue.setCuboid(
Location.at(classicPlotWorld.getWorldName(), sx, 1, sz + 1), Location.at(classicPlotWorld.getWorldName(), sx, 1, sz + 1),
Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.WALL_HEIGHT, ez - 1), Location.at(classicPlotWorld.getWorldName(), sx, classicPlotWorld.WALL_HEIGHT, ez - 1),
@ -568,7 +584,10 @@ public class ClassicPlotManager extends SquarePlotManager {
Location.at( Location.at(
classicPlotWorld.getWorldName(), classicPlotWorld.getWorldName(),
sx + 1, sx + 1,
Math.min(classicPlotWorld.WALL_HEIGHT, classicPlotWorld.ROAD_HEIGHT) + 1, Math.min(
classicPlotWorld.PLOT_HEIGHT,
Math.min(classicPlotWorld.WALL_HEIGHT, classicPlotWorld.ROAD_HEIGHT)
) + 1,
sz sz
), ),
Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.getPlotManager().getWorldHeight(), ez), Location.at(classicPlotWorld.getWorldName(), ex - 1, classicPlotWorld.getPlotManager().getWorldHeight(), ez),
@ -663,7 +682,10 @@ public class ClassicPlotManager extends SquarePlotManager {
Location.at( Location.at(
classicPlotWorld.getWorldName(), classicPlotWorld.getWorldName(),
sx, sx,
Math.min(classicPlotWorld.PLOT_HEIGHT, classicPlotWorld.ROAD_HEIGHT) + 1, Math.min(
classicPlotWorld.PLOT_HEIGHT,
Math.min(classicPlotWorld.WALL_HEIGHT, classicPlotWorld.ROAD_HEIGHT)
) + 1,
sz sz
), ),
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getPlotManager().getWorldHeight(), ez), Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getPlotManager().getWorldHeight(), ez),
@ -703,7 +725,10 @@ public class ClassicPlotManager extends SquarePlotManager {
Location.at( Location.at(
classicPlotWorld.getWorldName(), classicPlotWorld.getWorldName(),
sx, sx,
Math.min(classicPlotWorld.PLOT_HEIGHT, classicPlotWorld.ROAD_HEIGHT) + 1, Math.min(
classicPlotWorld.PLOT_HEIGHT,
Math.min(classicPlotWorld.WALL_HEIGHT, classicPlotWorld.ROAD_HEIGHT)
) + 1,
sz sz
), ),
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getPlotManager().getWorldHeight(), ez), Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getPlotManager().getWorldHeight(), ez),
@ -742,7 +767,10 @@ public class ClassicPlotManager extends SquarePlotManager {
Location.at( Location.at(
classicPlotWorld.getWorldName(), classicPlotWorld.getWorldName(),
sx, sx,
Math.min(classicPlotWorld.PLOT_HEIGHT, classicPlotWorld.ROAD_HEIGHT) + 1, Math.min(
classicPlotWorld.PLOT_HEIGHT,
Math.min(classicPlotWorld.WALL_HEIGHT, classicPlotWorld.ROAD_HEIGHT)
) + 1,
sz sz
), ),
Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getPlotManager().getWorldHeight(), ez), Location.at(classicPlotWorld.getWorldName(), ex, classicPlotWorld.getPlotManager().getWorldHeight(), ez),

View File

@ -63,7 +63,7 @@ public class HybridGen extends IndependentPlotGenerator {
&& Settings.Schematics.PASTE_ON_TOP)) { && Settings.Schematics.PASTE_ON_TOP)) {
minY = world.SCHEM_Y; minY = world.SCHEM_Y;
} else { } else {
minY = 1; minY = world.getMinBuildHeight();
} }
BaseBlock[] blocks = world.G_SCH.get(MathMan.pair(relativeX, relativeZ)); BaseBlock[] blocks = world.G_SCH.get(MathMan.pair(relativeX, relativeZ));
if (blocks != null) { if (blocks != null) {
@ -156,11 +156,12 @@ public class HybridGen extends IndependentPlotGenerator {
} }
} }
// generation // generation
int startY = hybridPlotWorld.PLOT_BEDROCK ? 1 : 0;
for (short x = 0; x < 16; x++) { for (short x = 0; x < 16; x++) {
if (insideRoadX[x]) { if (insideRoadX[x]) {
for (short z = 0; z < 16; z++) { for (short z = 0; z < 16; z++) {
// Road // Road
for (int y = 1; y <= hybridPlotWorld.ROAD_HEIGHT; y++) { for (int y = startY; y <= hybridPlotWorld.ROAD_HEIGHT; y++) {
result.setBlock(x, y, z, hybridPlotWorld.ROAD_BLOCK.toPattern()); result.setBlock(x, y, z, hybridPlotWorld.ROAD_BLOCK.toPattern());
} }
if (hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) { if (hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) {
@ -171,7 +172,7 @@ public class HybridGen extends IndependentPlotGenerator {
for (short z = 0; z < 16; z++) { for (short z = 0; z < 16; z++) {
if (insideRoadZ[z]) { if (insideRoadZ[z]) {
// road // road
for (int y = 1; y <= hybridPlotWorld.ROAD_HEIGHT; y++) { for (int y = startY; y <= hybridPlotWorld.ROAD_HEIGHT; y++) {
result.setBlock(x, y, z, hybridPlotWorld.ROAD_BLOCK.toPattern()); result.setBlock(x, y, z, hybridPlotWorld.ROAD_BLOCK.toPattern());
} }
if (hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) { if (hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) {
@ -181,7 +182,7 @@ public class HybridGen extends IndependentPlotGenerator {
} }
} else { } else {
// wall // wall
for (int y = 1; y <= hybridPlotWorld.WALL_HEIGHT; y++) { for (int y = startY; y <= hybridPlotWorld.WALL_HEIGHT; y++) {
result.setBlock(x, y, z, hybridPlotWorld.WALL_FILLING.toPattern()); result.setBlock(x, y, z, hybridPlotWorld.WALL_FILLING.toPattern());
} }
if (!hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) { if (!hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) {
@ -201,7 +202,7 @@ public class HybridGen extends IndependentPlotGenerator {
for (short z = 0; z < 16; z++) { for (short z = 0; z < 16; z++) {
if (insideRoadZ[z]) { if (insideRoadZ[z]) {
// road // road
for (int y = 1; y <= hybridPlotWorld.ROAD_HEIGHT; y++) { for (int y = startY; y <= hybridPlotWorld.ROAD_HEIGHT; y++) {
result.setBlock(x, y, z, hybridPlotWorld.ROAD_BLOCK.toPattern()); result.setBlock(x, y, z, hybridPlotWorld.ROAD_BLOCK.toPattern());
} }
if (hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) { if (hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) {
@ -211,7 +212,7 @@ public class HybridGen extends IndependentPlotGenerator {
} }
} else if (insideWallZ[z]) { } else if (insideWallZ[z]) {
// wall // wall
for (int y = 1; y <= hybridPlotWorld.WALL_HEIGHT; y++) { for (int y = startY; y <= hybridPlotWorld.WALL_HEIGHT; y++) {
result.setBlock(x, y, z, hybridPlotWorld.WALL_FILLING.toPattern()); result.setBlock(x, y, z, hybridPlotWorld.WALL_FILLING.toPattern());
} }
if (!hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) { if (!hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) {
@ -227,7 +228,7 @@ public class HybridGen extends IndependentPlotGenerator {
} }
} else { } else {
// plot // plot
for (int y = 1; y < hybridPlotWorld.PLOT_HEIGHT; y++) { for (int y = startY; y < hybridPlotWorld.PLOT_HEIGHT; y++) {
result.setBlock(x, y, z, hybridPlotWorld.MAIN_BLOCK.toPattern()); result.setBlock(x, y, z, hybridPlotWorld.MAIN_BLOCK.toPattern());
} }
result.setBlock(x, hybridPlotWorld.PLOT_HEIGHT, z, result.setBlock(x, hybridPlotWorld.PLOT_HEIGHT, z,

View File

@ -82,10 +82,12 @@ public class HybridPlotManager extends ClassicPlotManager {
Settings.Paths.TEMPLATES + "/tmp-data.yml", Settings.Paths.TEMPLATES + "/tmp-data.yml",
Template.getBytes(hybridPlotWorld) Template.getBytes(hybridPlotWorld)
)); ));
String dir = "schematics" + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + hybridPlotWorld.getWorldName() + File.separator; String dir =
Settings.Paths.SCHEMATICS + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + hybridPlotWorld.getWorldName() + File.separator;
try { try {
File sideRoad = FileUtils.getFile(PlotSquared.platform().getDirectory(), dir + "sideroad.schem"); File sideRoad = FileUtils.getFile(PlotSquared.platform().getDirectory(), dir + "sideroad.schem");
String newDir = "schematics" + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + "__TEMP_DIR__" + File.separator; String newDir =
Settings.Paths.SCHEMATICS + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + "__TEMP_DIR__" + File.separator;
if (sideRoad.exists()) { if (sideRoad.exists()) {
files.add(new FileBytes(newDir + "sideroad.schem", Files.readAllBytes(sideRoad.toPath()))); files.add(new FileBytes(newDir + "sideroad.schem", Files.readAllBytes(sideRoad.toPath())));
} }
@ -152,7 +154,7 @@ public class HybridPlotManager extends ClassicPlotManager {
if ((isRoad && Settings.Schematics.PASTE_ROAD_ON_TOP) || (!isRoad && Settings.Schematics.PASTE_ON_TOP)) { if ((isRoad && Settings.Schematics.PASTE_ROAD_ON_TOP) || (!isRoad && Settings.Schematics.PASTE_ON_TOP)) {
minY = hybridPlotWorld.SCHEM_Y; minY = hybridPlotWorld.SCHEM_Y;
} else { } else {
minY = 1; minY = hybridPlotWorld.getMinBuildHeight();
} }
BaseBlock airBlock = BlockTypes.AIR.getDefaultState().toBaseBlock(); BaseBlock airBlock = BlockTypes.AIR.getDefaultState().toBaseBlock();
for (int x = pos1.getX(); x <= pos2.getX(); x++) { for (int x = pos1.getX(); x <= pos2.getX(); x++) {
@ -249,12 +251,11 @@ public class HybridPlotManager extends ClassicPlotManager {
final Pattern plotfloor = hybridPlotWorld.TOP_BLOCK.toPattern(); final Pattern plotfloor = hybridPlotWorld.TOP_BLOCK.toPattern();
final Pattern filling = hybridPlotWorld.MAIN_BLOCK.toPattern(); final Pattern filling = hybridPlotWorld.MAIN_BLOCK.toPattern();
final BlockState bedrock; final Pattern bedrock;
final BlockState air = BlockTypes.AIR.getDefaultState();
if (hybridPlotWorld.PLOT_BEDROCK) { if (hybridPlotWorld.PLOT_BEDROCK) {
bedrock = BlockTypes.BEDROCK.getDefaultState(); bedrock = BlockTypes.BEDROCK.getDefaultState();
} else { } else {
bedrock = air; bedrock = hybridPlotWorld.MAIN_BLOCK.toPattern();
} }
final BiomeType biome = hybridPlotWorld.getPlotBiome(); final BiomeType biome = hybridPlotWorld.getPlotBiome();
@ -274,7 +275,7 @@ public class HybridPlotManager extends ClassicPlotManager {
// Each component has a different layer // Each component has a different layer
queue.setCuboid(pos1.withY(1), pos2.withY(hybridPlotWorld.PLOT_HEIGHT - 1), filling); queue.setCuboid(pos1.withY(1), pos2.withY(hybridPlotWorld.PLOT_HEIGHT - 1), filling);
queue.setCuboid(pos1.withY(hybridPlotWorld.PLOT_HEIGHT), pos2.withY(hybridPlotWorld.PLOT_HEIGHT), plotfloor); queue.setCuboid(pos1.withY(hybridPlotWorld.PLOT_HEIGHT), pos2.withY(hybridPlotWorld.PLOT_HEIGHT), plotfloor);
queue.setCuboid(pos1.withY(hybridPlotWorld.PLOT_HEIGHT + 1), pos2.withY(getWorldHeight()), air); queue.setCuboid(pos1.withY(hybridPlotWorld.PLOT_HEIGHT + 1), pos2.withY(getWorldHeight()), BlockTypes.AIR.getDefaultState());
queue.setBiomeCuboid(pos1, pos2, biome); queue.setBiomeCuboid(pos1, pos2, biome);
} else { } else {
queue.setRegenRegion(new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3())); queue.setRegenRegion(new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3()));

View File

@ -253,22 +253,32 @@ public class HybridPlotWorld extends ClassicPlotWorld {
int shift = this.ROAD_WIDTH / 2; int shift = this.ROAD_WIDTH / 2;
int oddshift = (this.ROAD_WIDTH & 1) == 0 ? 0 : 1; int oddshift = (this.ROAD_WIDTH & 1) == 0 ? 0 : 1;
SCHEM_Y = Math.min(PLOT_HEIGHT, ROAD_HEIGHT); SCHEM_Y = Math.min(PLOT_HEIGHT, Math.min(WALL_HEIGHT, ROAD_HEIGHT));
int plotY = PLOT_HEIGHT - SCHEM_Y; int plotY = PLOT_HEIGHT - SCHEM_Y;
int roadY = ROAD_HEIGHT - SCHEM_Y; int roadY = Math.min(ROAD_HEIGHT, WALL_HEIGHT) - SCHEM_Y;
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() == 256) { if (schematic3 != null) {
SCHEM_Y = 0; if (schematic3.getClipboard().getDimensions().getY() == 256) {
plotY = 0; SCHEM_Y = plotY = 0;
roadY = ROAD_HEIGHT; } else if (!Settings.Schematics.PASTE_ON_TOP) {
SCHEM_Y = plotY = getMinBuildHeight();
}
} }
if (schematic1 != null && schematic1.getClipboard().getDimensions().getY() == 256) { if (schematic1 != null) {
SCHEM_Y = 0; if (schematic1.getClipboard().getDimensions().getY() == 256) {
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != 256) { SCHEM_Y = roadY = 0;
plotY = PLOT_HEIGHT; if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != 256
&& !Settings.Schematics.PASTE_ON_TOP) {
plotY = PLOT_HEIGHT;
}
} else if (!Settings.Schematics.PASTE_ROAD_ON_TOP) {
SCHEM_Y = roadY = getMinBuildHeight();
if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != 256
&& !Settings.Schematics.PASTE_ON_TOP) {
plotY = PLOT_HEIGHT;
}
} }
roadY = 0;
} }
if (schematic3 != null) { if (schematic3 != null) {
@ -324,7 +334,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
LOGGER.info("- plot schematic: {}", schematic3File.getPath()); LOGGER.info("- plot schematic: {}", schematic3File.getPath());
} }
} }
if (schematic1 == null || schematic2 == null || this.ROAD_WIDTH == 0) { if ((schematic1 == null&& schematic2 == null) || this.ROAD_WIDTH == 0) {
if (Settings.DEBUG) { if (Settings.DEBUG) {
LOGGER.info("- schematic: false"); LOGGER.info("- schematic: false");
} }

View File

@ -504,9 +504,10 @@ public class HybridUtils {
Location top = plot.getTopAbs(); Location top = plot.getTopAbs();
final HybridPlotWorld plotworld = (HybridPlotWorld) plot.getArea(); final HybridPlotWorld plotworld = (HybridPlotWorld) plot.getArea();
PlotManager plotManager = plotworld.getPlotManager(); PlotManager plotManager = plotworld.getPlotManager();
int schemY = Math.min(plotworld.PLOT_HEIGHT, Math.min(plotworld.WALL_HEIGHT, plotworld.ROAD_HEIGHT));
int sx = bot.getX() - plotworld.ROAD_WIDTH + 1; int sx = bot.getX() - plotworld.ROAD_WIDTH + 1;
int sz = bot.getZ() + 1; int sz = bot.getZ() + 1;
int sy = Settings.Schematics.PASTE_ROAD_ON_TOP ? plotworld.ROAD_HEIGHT : 1; int sy = Settings.Schematics.PASTE_ROAD_ON_TOP ? schemY : plot.getArea().getMinBuildHeight();
int ex = bot.getX(); int ex = bot.getX();
int ez = top.getZ(); int ez = top.getZ();
int ey = get_ey(plotManager, queue, sx, ex, sz, ez, sy); int ey = get_ey(plotManager, queue, sx, ex, sz, ez, sy);
@ -517,7 +518,7 @@ public class HybridUtils {
final Set<CuboidRegion> sideRoad = Collections.singleton(RegionUtil.createRegion(sx, ex, sy, ey, sz, ez)); final Set<CuboidRegion> sideRoad = Collections.singleton(RegionUtil.createRegion(sx, ex, sy, ey, sz, ez));
final Set<CuboidRegion> intersection = Collections.singleton(RegionUtil.createRegion(sx, ex, sy, ty, bz, tz)); final Set<CuboidRegion> intersection = Collections.singleton(RegionUtil.createRegion(sx, ex, sy, ty, bz, tz));
final String dir = "schematics" + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + plot final String dir = Settings.Paths.SCHEMATICS + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + plot
.getArea() .getArea()
.toString() + File.separator; .toString() + File.separator;

View File

@ -58,6 +58,7 @@ import com.plotsquared.core.plot.flag.implementations.MusicFlag;
import com.plotsquared.core.plot.flag.implementations.NotifyEnterFlag; import com.plotsquared.core.plot.flag.implementations.NotifyEnterFlag;
import com.plotsquared.core.plot.flag.implementations.NotifyLeaveFlag; import com.plotsquared.core.plot.flag.implementations.NotifyLeaveFlag;
import com.plotsquared.core.plot.flag.implementations.PlotTitleFlag; import com.plotsquared.core.plot.flag.implementations.PlotTitleFlag;
import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag;
import com.plotsquared.core.plot.flag.implementations.TimeFlag; import com.plotsquared.core.plot.flag.implementations.TimeFlag;
import com.plotsquared.core.plot.flag.implementations.TitlesFlag; import com.plotsquared.core.plot.flag.implementations.TitlesFlag;
import com.plotsquared.core.plot.flag.implementations.WeatherFlag; import com.plotsquared.core.plot.flag.implementations.WeatherFlag;
@ -173,9 +174,21 @@ public class PlotListener {
String greeting = plot.getFlag(GreetingFlag.class); String greeting = plot.getFlag(GreetingFlag.class);
if (!greeting.isEmpty()) { if (!greeting.isEmpty()) {
if (!Settings.Chat.NOTIFICATION_AS_ACTIONBAR) { if (!Settings.Chat.NOTIFICATION_AS_ACTIONBAR) {
plot.format(StaticCaption.of(greeting), player, false).thenAcceptAsync(player::sendMessage); player.sendMessage(
TranslatableCaption.of("flags.greeting_flag_format"),
Template.of("world", plot.getWorldName()),
Template.of("plot_id", plot.getId().toString()),
Template.of("alias", plot.getAlias()),
Template.of("greeting", greeting)
);
} else { } else {
plot.format(StaticCaption.of(greeting), player, false).thenAcceptAsync(player::sendActionBar); player.sendActionBar(
TranslatableCaption.of("flags.greeting_flag_format"),
Template.of("world", plot.getWorldName()),
Template.of("plot_id", plot.getId().toString()),
Template.of("alias", plot.getAlias()),
Template.of("greeting", greeting)
);
} }
} }
@ -305,50 +318,52 @@ public class PlotListener {
subtitle = ""; subtitle = "";
fromFlag = false; fromFlag = false;
} }
// It's not actually possible for these to be null, but IntelliJ is dumb if (fromFlag || !plot.getFlag(ServerPlotFlag.class) || Settings.Titles.DISPLAY_DEFAULT_ON_SERVER_PLOT) {
TaskManager.runTaskLaterAsync(() -> { TaskManager.runTaskLaterAsync(() -> {
Plot lastPlot; Plot lastPlot;
try (final MetaDataAccess<Plot> lastPlotAccess = try (final MetaDataAccess<Plot> lastPlotAccess =
player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) { player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
lastPlot = lastPlotAccess.get().orElse(null); lastPlot = lastPlotAccess.get().orElse(null);
}
if ((lastPlot != null) && plot.getId().equals(lastPlot.getId()) && plot.hasOwner()) {
final UUID plotOwner = plot.getOwnerAbs();
String owner = PlayerManager.getName(plotOwner, false);
Caption header = fromFlag ? StaticCaption.of(title) : TranslatableCaption.of("titles" +
".title_entered_plot");
Caption subHeader = fromFlag ? StaticCaption.of(subtitle) : TranslatableCaption.of("titles" +
".title_entered_plot_sub");
Template plotTemplate = Template.of("plot", lastPlot.getId().toString());
Template worldTemplate = Template.of("world", player.getLocation().getWorldName());
Template ownerTemplate = Template.of("owner", owner);
final Consumer<String> userConsumer = user -> {
if (Settings.Titles.TITLES_AS_ACTIONBAR) {
player.sendActionBar(header, plotTemplate, worldTemplate, ownerTemplate);
} else {
player.sendTitle(header, subHeader, plotTemplate, worldTemplate, ownerTemplate);
}
};
UUID uuid = plot.getOwner();
if (uuid == null) {
userConsumer.accept("Unknown");
} else if (uuid.equals(DBFunc.SERVER)) {
userConsumer.accept(MINI_MESSAGE.stripTokens(TranslatableCaption
.of("info.server")
.getComponent(player)));
} else {
PlotSquared.get().getImpromptuUUIDPipeline().getSingle(plot.getOwner(), (user, throwable) -> {
if (throwable != null) {
userConsumer.accept("Unknown");
} else {
userConsumer.accept(user);
}
});
} }
} if ((lastPlot != null) && plot.getId().equals(lastPlot.getId()) && plot.hasOwner()) {
}, TaskTime.seconds(1L)); final UUID plotOwner = plot.getOwnerAbs();
String owner = PlayerManager.getName(plotOwner, false);
Caption header = fromFlag ? StaticCaption.of(title) : TranslatableCaption.of("titles" +
".title_entered_plot");
Caption subHeader = fromFlag ? StaticCaption.of(subtitle) : TranslatableCaption.of("titles" +
".title_entered_plot_sub");
Template plotTemplate = Template.of("plot", lastPlot.getId().toString());
Template worldTemplate = Template.of("world", player.getLocation().getWorldName());
Template ownerTemplate = Template.of("owner", owner);
Template aliasTemplate = Template.of("alias", plot.getAlias());
final Consumer<String> userConsumer = user -> {
if (Settings.Titles.TITLES_AS_ACTIONBAR) {
player.sendActionBar(header, aliasTemplate, plotTemplate, worldTemplate, ownerTemplate);
} else {
player.sendTitle(header, subHeader, aliasTemplate, plotTemplate, worldTemplate, ownerTemplate);
}
};
UUID uuid = plot.getOwner();
if (uuid == null) {
userConsumer.accept("Unknown");
} else if (uuid.equals(DBFunc.SERVER)) {
userConsumer.accept(MINI_MESSAGE.stripTokens(TranslatableCaption
.of("info.server")
.getComponent(player)));
} else {
PlotSquared.get().getImpromptuUUIDPipeline().getSingle(plot.getOwner(), (user, throwable) -> {
if (throwable != null) {
userConsumer.accept("Unknown");
} else {
userConsumer.accept(user);
}
});
}
}
}, TaskTime.seconds(1L));
}
} }
TimedFlag.Timed<Integer> feed = plot.getFlag(FeedFlag.class); TimedFlag.Timed<Integer> feed = plot.getFlag(FeedFlag.class);
@ -404,9 +419,21 @@ public class PlotListener {
String farewell = plot.getFlag(FarewellFlag.class); String farewell = plot.getFlag(FarewellFlag.class);
if (!farewell.isEmpty()) { if (!farewell.isEmpty()) {
if (!Settings.Chat.NOTIFICATION_AS_ACTIONBAR) { if (!Settings.Chat.NOTIFICATION_AS_ACTIONBAR) {
plot.format(StaticCaption.of(farewell), player, false).thenAcceptAsync(player::sendMessage); player.sendMessage(
TranslatableCaption.of("flags.farewell_flag_format"),
Template.of("world", plot.getWorldName()),
Template.of("plot_id", plot.getId().toString()),
Template.of("alias", plot.getAlias()),
Template.of("farewell", farewell)
);
} else { } else {
plot.format(StaticCaption.of(farewell), player, false).thenAcceptAsync(player::sendActionBar); player.sendActionBar(
TranslatableCaption.of("flags.farewell_flag_format"),
Template.of("world", plot.getWorldName()),
Template.of("plot_id", plot.getId().toString()),
Template.of("alias", plot.getAlias()),
Template.of("farewell", farewell)
);
} }
} }

View File

@ -25,8 +25,14 @@
*/ */
package com.plotsquared.core.location; package com.plotsquared.core.location;
import com.plotsquared.core.util.StringMan;
public class BlockLoc { public class BlockLoc {
public static final BlockLoc ZERO = new BlockLoc(0, 0, 0);
public static final BlockLoc MINY = new BlockLoc(0, Integer.MIN_VALUE, 0);
private static final BlockLoc MIDDLE = new BlockLoc(Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE);
private final int x; private final int x;
private final int y; private final int y;
private final int z; private final int z;
@ -34,6 +40,10 @@ public class BlockLoc {
private final float yaw; private final float yaw;
private final float pitch; private final float pitch;
public BlockLoc(int x, int y, int z) {
this(x, y, z, 0f, 0f);
}
public BlockLoc(int x, int y, int z, float yaw, float pitch) { public BlockLoc(int x, int y, int z, float yaw, float pitch) {
this.x = x; this.x = x;
this.y = y; this.y = y;
@ -43,26 +53,31 @@ public class BlockLoc {
this.pitch = pitch; this.pitch = pitch;
} }
public BlockLoc(int x, int y, int z) {
this(x, y, z, 0f, 0f);
}
public static BlockLoc fromString(String string) { public static BlockLoc fromString(String string) {
String[] parts = string.split(","); if (string == null || "side".equalsIgnoreCase(string)) {
return null;
float yaw; } else if (StringMan.isEqualIgnoreCaseToAny(string, "center", "middle", "centre")) {
float pitch; return MIDDLE;
if (parts.length == 5) {
yaw = Float.parseFloat(parts[3]);
pitch = Float.parseFloat(parts[4]);
} else { } else {
return new BlockLoc(0, 0, 0); String[] parts = string.split(",");
}
int x = Integer.parseInt(parts[0]);
int y = Integer.parseInt(parts[1]);
int z = Integer.parseInt(parts[2]);
return new BlockLoc(x, y, z, yaw, pitch); float yaw;
float pitch;
if (parts.length == 5) {
yaw = Float.parseFloat(parts[3]);
pitch = Float.parseFloat(parts[4]);
} else if (parts.length == 3) {
yaw = 0;
pitch = 0;
} else {
return ZERO;
}
int x = Integer.parseInt(parts[0]);
int y = Integer.parseInt(parts[1]);
int z = Integer.parseInt(parts[2]);
return new BlockLoc(x, y, z, yaw, pitch);
}
} }
@Override @Override
@ -88,12 +103,12 @@ public class BlockLoc {
} }
BlockLoc other = (BlockLoc) obj; BlockLoc other = (BlockLoc) obj;
return this.getX() == other.getX() && this.getY() == other.getY() && this.getZ() == other return this.getX() == other.getX() && this.getY() == other.getY() && this.getZ() == other
.getZ(); .getZ() && this.getYaw() == other.getYaw() && this.getPitch() == other.getPitch();
} }
@Override @Override
public String toString() { public String toString() {
if (this.getX() == 0 && this.getY() == 0 && this.getZ() == 0) { if (this.getX() == 0 && this.getY() == 0 && this.getZ() == 0 && this.getYaw() == 0 && this.getPitch() == 0) {
return ""; return "";
} }
return this.getX() + "," + this.getY() + ',' + this.getZ() + ',' + this.getYaw() + ',' return this.getX() + "," + this.getY() + ',' + this.getZ() + ',' + this.getYaw() + ','

View File

@ -56,7 +56,7 @@ public final class PlotLoc {
public static @Nullable PlotLoc fromString(final String input) { public static @Nullable PlotLoc fromString(final String input) {
if (input == null || "side".equalsIgnoreCase(input)) { if (input == null || "side".equalsIgnoreCase(input)) {
return null; return null;
} else if (StringMan.isEqualIgnoreCaseToAny(input, "center", "middle")) { } else if (StringMan.isEqualIgnoreCaseToAny(input, "center", "middle", "centre")) {
return new PlotLoc(Integer.MAX_VALUE, Integer.MAX_VALUE); return new PlotLoc(Integer.MAX_VALUE, Integer.MAX_VALUE);
} else { } else {
try { try {

View File

@ -204,7 +204,8 @@ public enum Permission {
PERMISSION_ADMIN_DEBUG_OTHER("plots.admin.debug.other"), PERMISSION_ADMIN_DEBUG_OTHER("plots.admin.debug.other"),
PERMISSION_RATE("plots.rate"), PERMISSION_RATE("plots.rate"),
PERMISSION_ADMIN_FLIGHT("plots.admin.flight"), PERMISSION_ADMIN_FLIGHT("plots.admin.flight"),
PERMISSION_ADMIN_COMPONENTS_OTHER("plots.admin.component.other"); PERMISSION_ADMIN_COMPONENTS_OTHER("plots.admin.component.other"),
PERMISSION_ADMIN_BYPASS_BORDER("plots.admin.border.bypass");
//</editor-fold> //</editor-fold>
private final String text; private final String text;

View File

@ -39,12 +39,12 @@ import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.database.DBFunc;
import com.plotsquared.core.events.Result; import com.plotsquared.core.events.Result;
import com.plotsquared.core.events.TeleportCause; import com.plotsquared.core.events.TeleportCause;
import com.plotsquared.core.generator.ClassicPlotWorld;
import com.plotsquared.core.generator.HybridPlotWorld; import com.plotsquared.core.generator.HybridPlotWorld;
import com.plotsquared.core.listener.PlotListener; import com.plotsquared.core.listener.PlotListener;
import com.plotsquared.core.location.BlockLoc; 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.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;
@ -368,7 +368,7 @@ public class Plot {
for (Plot p : plots) { for (Plot p : plots) {
String name = p.getAlias(); String name = p.getAlias();
if (!name.isEmpty() && name.equalsIgnoreCase(arg)) { if (!name.isEmpty() && name.equalsIgnoreCase(arg)) {
return p; return p.getBasePlot(false);
} }
} }
if (message && player != null) { if (message && player != null) {
@ -1329,7 +1329,7 @@ public class Plot {
return Location.at( return Location.at(
"", "",
0, 0,
this.getArea() instanceof HybridPlotWorld ? ((HybridPlotWorld) this.getArea()).PLOT_HEIGHT + 1 : 4, this.getArea() instanceof ClassicPlotWorld ? ((ClassicPlotWorld) this.getArea()).PLOT_HEIGHT + 1 : 4,
0 0
); );
} }
@ -1404,7 +1404,7 @@ public class Plot {
return Location.at( return Location.at(
"", "",
0, 0,
this.getArea() instanceof HybridPlotWorld ? ((HybridPlotWorld) this.getArea()).PLOT_HEIGHT + 1 : 4, this.getArea() instanceof ClassicPlotWorld ? ((ClassicPlotWorld) this.getArea()).PLOT_HEIGHT + 1 : 4,
0 0
); );
} }
@ -1443,7 +1443,7 @@ public class Plot {
result.accept(Location.at( result.accept(Location.at(
"", "",
0, 0,
this.getArea() instanceof HybridPlotWorld ? ((HybridPlotWorld) this.getArea()).PLOT_HEIGHT + 1 : 4, this.getArea() instanceof ClassicPlotWorld ? ((ClassicPlotWorld) this.getArea()).PLOT_HEIGHT + 1 : 4,
0 0
)); ));
return; return;
@ -1477,7 +1477,7 @@ public class Plot {
*/ */
public void setHome(BlockLoc location) { public void setHome(BlockLoc location) {
Plot plot = this.getBasePlot(false); Plot plot = this.getBasePlot(false);
if (location != null && new BlockLoc(0, 0, 0).equals(location)) { if (BlockLoc.ZERO.equals(location) || BlockLoc.MINY.equals(location)) {
return; return;
} }
plot.getSettings().setPosition(location); plot.getSettings().setPosition(location);
@ -1506,7 +1506,7 @@ public class Plot {
@Deprecated @Deprecated
public Location getDefaultHomeSynchronous(final boolean member) { public Location getDefaultHomeSynchronous(final boolean member) {
Plot plot = this.getBasePlot(false); Plot plot = this.getBasePlot(false);
PlotLoc loc = member ? area.getDefaultHome() : area.getNonmemberHome(); BlockLoc loc = member ? area.defaultHome() : area.nonmemberHome();
if (loc != null) { if (loc != null) {
int x; int x;
int z; int z;
@ -1525,10 +1525,10 @@ public class Plot {
x = bot.getX() + loc.getX(); x = bot.getX() + loc.getX();
z = bot.getZ() + loc.getZ(); z = bot.getZ() + loc.getZ();
} }
int y = loc.getY() < 1 int y = loc.getY() == Integer.MIN_VALUE
? (isLoaded() ? this.worldUtil.getHighestBlockSynchronous(plot.getWorldName(), x, z) + 1 : 63) ? (isLoaded() ? this.worldUtil.getHighestBlockSynchronous(plot.getWorldName(), x, z) + 1 : 63)
: loc.getY(); : loc.getY();
return Location.at(plot.getWorldName(), x, y, z); return Location.at(plot.getWorldName(), x, y, z, loc.getYaw(), loc.getPitch());
} }
// Side // Side
return plot.getSideSynchronous(); return plot.getSideSynchronous();
@ -1540,12 +1540,12 @@ public class Plot {
result.accept(Location.at( result.accept(Location.at(
"", "",
0, 0,
this.getArea() instanceof HybridPlotWorld ? ((HybridPlotWorld) this.getArea()).PLOT_HEIGHT + 1 : 4, this.getArea() instanceof ClassicPlotWorld ? ((ClassicPlotWorld) this.getArea()).PLOT_HEIGHT + 1 : 4,
0 0
)); ));
return; return;
} }
PlotLoc loc = member ? area.getDefaultHome() : area.getNonmemberHome(); BlockLoc loc = member ? area.defaultHome() : area.nonmemberHome();
if (loc != null) { if (loc != null) {
int x; int x;
int z; int z;
@ -1564,7 +1564,7 @@ public class Plot {
x = bot.getX() + loc.getX(); x = bot.getX() + loc.getX();
z = bot.getZ() + loc.getZ(); z = bot.getZ() + loc.getZ();
} }
if (loc.getY() < 1) { if (loc.getY() == Integer.MIN_VALUE) {
if (isLoaded()) { if (isLoaded()) {
this.worldUtil.getHighestBlock( this.worldUtil.getHighestBlock(
plot.getWorldName(), plot.getWorldName(),
@ -1573,10 +1573,11 @@ public class Plot {
y -> result.accept(Location.at(plot.getWorldName(), x, y + 1, z)) y -> result.accept(Location.at(plot.getWorldName(), x, y + 1, z))
); );
} else { } else {
result.accept(Location.at(plot.getWorldName(), x, 63, z)); int y = this.getArea() instanceof ClassicPlotWorld ? ((ClassicPlotWorld) this.getArea()).PLOT_HEIGHT + 1 : 63;
result.accept(Location.at(plot.getWorldName(), x, y, z, loc.getYaw(), loc.getPitch()));
} }
} else { } else {
result.accept(Location.at(plot.getWorldName(), x, loc.getY(), z)); result.accept(Location.at(plot.getWorldName(), x, loc.getY(), z, loc.getYaw(), loc.getPitch()));
} }
return; return;
} }
@ -1707,9 +1708,14 @@ public class Plot {
} }
this.getPlotModificationManager().setSign(player.getName()); this.getPlotModificationManager().setSign(player.getName());
player.sendMessage(TranslatableCaption.of("working.claimed"), Template.of("plot", this.getId().toString())); player.sendMessage(TranslatableCaption.of("working.claimed"), Template.of("plot", this.getId().toString()));
if (teleport && Settings.Teleport.ON_CLAIM) { if (teleport) {
teleportPlayer(player, auto ? TeleportCause.COMMAND_AUTO : TeleportCause.COMMAND_CLAIM, result -> { if (!auto && Settings.Teleport.ON_CLAIM) {
}); teleportPlayer(player, TeleportCause.COMMAND_CLAIM, result -> {
});
} else if (auto && Settings.Teleport.ON_AUTO) {
teleportPlayer(player, TeleportCause.COMMAND_AUTO, result -> {
});
}
} }
PlotArea plotworld = getArea(); PlotArea plotworld = getArea();
if (plotworld.isSchematicOnClaim()) { if (plotworld.isSchematicOnClaim()) {
@ -1727,16 +1733,25 @@ public class Plot {
e.printStackTrace(); e.printStackTrace();
return true; return true;
} }
schematicHandler.paste(sch, this, 0, 1, 0, Settings.Schematics.PASTE_ON_TOP, player, new RunnableVal<>() { schematicHandler.paste(
@Override sch,
public void run(Boolean value) { this,
if (value) { 0,
player.sendMessage(TranslatableCaption.of("schematics.schematic_paste_success")); getArea().getMinBuildHeight(),
} else { 0,
player.sendMessage(TranslatableCaption.of("schematics.schematic_paste_failed")); Settings.Schematics.PASTE_ON_TOP,
player,
new RunnableVal<>() {
@Override
public void run(Boolean value) {
if (value) {
player.sendMessage(TranslatableCaption.of("schematics.schematic_paste_success"));
} else {
player.sendMessage(TranslatableCaption.of("schematics.schematic_paste_failed"));
}
}
} }
} );
});
} }
plotworld.getPlotManager().claimPlot(this, null); plotworld.getPlotManager().claimPlot(this, null);
return true; return true;
@ -2148,8 +2163,9 @@ public class Plot {
} }
/** /**
* Gets the set home location or 0,0,0 if no location is set<br> * Gets the set home location or 0,Integer#MIN_VALUE,0 if no location is set<br>
* - Does not take the default home location into account * - Does not take the default home location into account
* - PlotSquared will internally find the correct place to teleport to if y = Integer#MIN_VALUE when teleporting to the plot.
* *
* @return home location * @return home location
*/ */

View File

@ -41,6 +41,7 @@ import com.plotsquared.core.configuration.file.YamlConfiguration;
import com.plotsquared.core.generator.GridPlotWorld; import com.plotsquared.core.generator.GridPlotWorld;
import com.plotsquared.core.generator.IndependentPlotGenerator; import com.plotsquared.core.generator.IndependentPlotGenerator;
import com.plotsquared.core.inject.annotations.WorldConfig; import com.plotsquared.core.inject.annotations.WorldConfig;
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;
@ -123,6 +124,7 @@ public abstract class PlotArea {
new FlagContainer(GlobalFlagContainer.getInstance()); new FlagContainer(GlobalFlagContainer.getInstance());
private final YamlConfiguration worldConfiguration; private final YamlConfiguration worldConfiguration;
private final GlobalBlockQueue globalBlockQueue; private final GlobalBlockQueue globalBlockQueue;
private final boolean roadFlags = false;
private boolean autoMerge = false; private boolean autoMerge = false;
private boolean allowSigns = true; private boolean allowSigns = true;
private boolean miscSpawnUnowned = false; private boolean miscSpawnUnowned = false;
@ -140,14 +142,13 @@ public abstract class PlotArea {
private PlotAreaType type = PlotAreaType.NORMAL; private PlotAreaType type = PlotAreaType.NORMAL;
private PlotAreaTerrainType terrain = PlotAreaTerrainType.NONE; private PlotAreaTerrainType terrain = PlotAreaTerrainType.NONE;
private boolean homeAllowNonmember = false; private boolean homeAllowNonmember = false;
private PlotLoc nonmemberHome; private BlockLoc nonmemberHome;
private PlotLoc defaultHome; private BlockLoc defaultHome;
private int maxBuildHeight = 256; private int maxBuildHeight = 256;
private int minBuildHeight = 1; private int minBuildHeight = 1;
private GameMode gameMode = GameModes.CREATIVE; private GameMode gameMode = GameModes.CREATIVE;
private Map<String, PlotExpression> prices = new HashMap<>(); private Map<String, PlotExpression> prices = new HashMap<>();
private List<String> schematics = new ArrayList<>(); private List<String> schematics = new ArrayList<>();
private final boolean roadFlags = false;
private boolean worldBorder = false; private boolean worldBorder = false;
private boolean useEconomy = false; private boolean useEconomy = false;
private int hash; private int hash;
@ -370,24 +371,24 @@ public abstract class PlotArea {
String homeNonMembers = config.getString("home.nonmembers"); String homeNonMembers = config.getString("home.nonmembers");
String homeDefault = config.getString("home.default"); String homeDefault = config.getString("home.default");
this.defaultHome = PlotLoc.fromString(homeDefault); this.defaultHome = BlockLoc.fromString(homeDefault);
this.homeAllowNonmember = homeNonMembers.equalsIgnoreCase(homeDefault); this.homeAllowNonmember = homeNonMembers.equalsIgnoreCase(homeDefault);
if (this.homeAllowNonmember) { if (this.homeAllowNonmember) {
this.nonmemberHome = defaultHome; this.nonmemberHome = defaultHome;
} else { } else {
this.nonmemberHome = PlotLoc.fromString(homeNonMembers); this.nonmemberHome = BlockLoc.fromString(homeNonMembers);
} }
if ("side".equalsIgnoreCase(homeDefault)) { if ("side".equalsIgnoreCase(homeDefault)) {
this.defaultHome = null; this.defaultHome = null;
} else if (StringMan.isEqualIgnoreCaseToAny(homeDefault, "center", "middle")) { } else if (StringMan.isEqualIgnoreCaseToAny(homeDefault, "center", "middle", "centre")) {
this.defaultHome = new PlotLoc(Integer.MAX_VALUE, Integer.MAX_VALUE); this.defaultHome = new BlockLoc(Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE);
} else { } else {
try { try {
/*String[] split = homeDefault.split(","); /*String[] split = homeDefault.split(",");
this.DEFAULT_HOME = this.DEFAULT_HOME =
new PlotLoc(Integer.parseInt(split[0]), Integer.parseInt(split[1]));*/ new PlotLoc(Integer.parseInt(split[0]), Integer.parseInt(split[1]));*/
this.defaultHome = PlotLoc.fromString(homeDefault); this.defaultHome = BlockLoc.fromString(homeDefault);
} catch (NumberFormatException ignored) { } catch (NumberFormatException ignored) {
this.defaultHome = null; this.defaultHome = null;
} }
@ -408,13 +409,9 @@ public abstract class PlotArea {
} }
} }
this.getFlagContainer().addAll(parseFlags(flags)); this.getFlagContainer().addAll(parseFlags(flags));
Component flagsComponent = null;
Collection<PlotFlag<?, ?>> flagCollection = this.getFlagContainer().getFlagMap().values();
flagsComponent = getFlagsComponent(flagsComponent, flagCollection);
ConsolePlayer.getConsole().sendMessage( ConsolePlayer.getConsole().sendMessage(
TranslatableCaption.of("flags.area_flags"), TranslatableCaption.of("flags.area_flags"),
Template.of("flags", flagsComponent) Template.of("flags", flags.toString())
); );
this.spawnEggs = config.getBoolean("event.spawn.egg"); this.spawnEggs = config.getBoolean("event.spawn.egg");
@ -433,13 +430,9 @@ public abstract class PlotArea {
} }
} }
this.getRoadFlagContainer().addAll(parseFlags(roadflags)); this.getRoadFlagContainer().addAll(parseFlags(roadflags));
Component roadFlagsComponent = null;
Collection<PlotFlag<?, ?>> roadFlagCollection = this.getRoadFlagContainer().getFlagMap().values();
roadFlagsComponent = getFlagsComponent(roadFlagsComponent, roadFlagCollection);
ConsolePlayer.getConsole().sendMessage( ConsolePlayer.getConsole().sendMessage(
TranslatableCaption.of("flags.road_flags"), TranslatableCaption.of("flags.road_flags"),
Template.of("flags", roadFlagsComponent) Template.of("flags", roadflags.toString())
); );
loadConfiguration(config); loadConfiguration(config);
@ -1359,15 +1352,38 @@ public abstract class PlotArea {
return this.homeAllowNonmember; return this.homeAllowNonmember;
} }
public PlotLoc getNonmemberHome() { /**
* Get the location for non-members to be teleported to.
*/
public BlockLoc nonmemberHome() {
return this.nonmemberHome; return this.nonmemberHome;
} }
public PlotLoc getDefaultHome() { /**
* Get the default location for players to be teleported to. May be overriden by {@link #nonmemberHome} if the player is
* not a member of the plot.
*/
public BlockLoc defaultHome() {
return this.defaultHome; return this.defaultHome;
} }
protected void setDefaultHome(PlotLoc defaultHome) { /**
* @deprecated Use {@link #nonmemberHome}
*/
@Deprecated(forRemoval = true)
public PlotLoc getNonmemberHome() {
return new PlotLoc(this.defaultHome.getX(), this.defaultHome.getY(), this.defaultHome.getZ());
}
/**
* @deprecated Use {@link #defaultHome}
*/
@Deprecated(forRemoval = true)
public PlotLoc getDefaultHome() {
return new PlotLoc(this.defaultHome.getX(), this.defaultHome.getY(), this.defaultHome.getZ());
}
protected void setDefaultHome(BlockLoc defaultHome) {
this.defaultHome = defaultHome; this.defaultHome = defaultHome;
} }

View File

@ -107,7 +107,7 @@ public class PlotSettings {
public BlockLoc getPosition() { public BlockLoc getPosition() {
if (this.position == null) { if (this.position == null) {
return new BlockLoc(0, 0, 0); return BlockLoc.MINY;
} }
return this.position; return this.position;
} }

View File

@ -43,8 +43,18 @@ public abstract class ListFlag<V, F extends PlotFlag<List<V>, F>> extends PlotFl
@Override @Override
public F merge(@NonNull List<V> newValue) { public F merge(@NonNull List<V> newValue) {
final List<V> mergedList = new ArrayList<>(); final List<V> mergedList = new ArrayList<>();
mergedList.addAll(getValue()); // If a server already used PS before this fix, we remove all present duplicates on an eventual merge
mergedList.addAll(newValue); for (final V v : getValue()) {
if (!mergedList.contains(v)) {
mergedList.add(v);
}
}
// Only add new values if not already present from #getValue()
for (final V v : newValue) {
if (!mergedList.contains(v)) {
mergedList.add(v);
}
}
return this.flagOf(mergedList); return this.flagOf(mergedList);
} }

View File

@ -35,8 +35,8 @@ import com.plotsquared.core.generator.GridPlotWorld;
import com.plotsquared.core.generator.SingleWorldGenerator; import com.plotsquared.core.generator.SingleWorldGenerator;
import com.plotsquared.core.inject.annotations.WorldConfig; import com.plotsquared.core.inject.annotations.WorldConfig;
import com.plotsquared.core.listener.PlotListener; import com.plotsquared.core.listener.PlotListener;
import com.plotsquared.core.location.BlockLoc;
import com.plotsquared.core.location.Location; import com.plotsquared.core.location.Location;
import com.plotsquared.core.location.PlotLoc;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotAreaType; import com.plotsquared.core.plot.PlotAreaType;
import com.plotsquared.core.plot.PlotId; import com.plotsquared.core.plot.PlotId;
@ -74,7 +74,39 @@ public class SinglePlotArea extends GridPlotWorld {
this.eventDispatcher = eventDispatcher; this.eventDispatcher = eventDispatcher;
this.plotListener = plotListener; this.plotListener = plotListener;
this.setAllowSigns(false); this.setAllowSigns(false);
this.setDefaultHome(new PlotLoc(Integer.MAX_VALUE, Integer.MAX_VALUE)); this.setDefaultHome(new BlockLoc(Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE));
}
/**
* Returns true if the given string matches the naming system used to identify single plot worlds
* e.g. -1_5 represents plot id *;-1;5. "*" being the plot area name given to single plot world
* {@link com.plotsquared.core.plot.PlotArea}.
*/
public static boolean isSinglePlotWorld(String worldName) {
int len = worldName.length();
int separator = 0;
for (int i = 0; i < len; i++) {
switch (worldName.charAt(i)) {
case '_':
separator++;
break;
case '-':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
break;
default:
return false;
}
}
return separator == 1;
} }
@NonNull @NonNull

View File

@ -89,7 +89,7 @@ public class LocationOffsetDelegateQueueCoordinator extends DelegateQueueCoordin
public boolean setBiome(int x, int z, @NonNull BiomeType biome) { public boolean setBiome(int x, int z, @NonNull BiomeType biome) {
boolean result = true; boolean result = true;
for (int y = 0; y < 256; y++) { for (int y = 0; y < 256; y++) {
result &= this.setBiome(x, z, biome); result &= this.setBiome(x, y, z, biome);
} }
return result; return result;
} }

View File

@ -581,6 +581,10 @@ public abstract class SchematicHandler {
schematic.put("BlockData", new ByteArrayTag(buffer.toByteArray())); schematic.put("BlockData", new ByteArrayTag(buffer.toByteArray()));
schematic.put("BlockEntities", new ListTag(CompoundTag.class, tileEntities)); schematic.put("BlockEntities", new ListTag(CompoundTag.class, tileEntities));
if (biomeBuffer.size() == 0 || biomePalette.size() == 0) {
return;
}
schematic.put("BiomePaletteMax", new IntTag(biomePalette.size())); schematic.put("BiomePaletteMax", new IntTag(biomePalette.size()));
Map<String, Tag> biomePaletteTag = new HashMap<>(); Map<String, Tag> biomePaletteTag = new HashMap<>();

View File

@ -32,11 +32,13 @@ import com.plotsquared.core.command.Command;
import com.plotsquared.core.command.CommandCategory; import com.plotsquared.core.command.CommandCategory;
import com.plotsquared.core.command.RequiredType; import com.plotsquared.core.command.RequiredType;
import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.player.ConsolePlayer;
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.uuid.UUIDMapping; import com.plotsquared.core.uuid.UUIDMapping;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -80,12 +82,31 @@ public final class TabCompletions {
* @param input Command input * @param input Command input
* @param existing Players that should not be included in completions * @param existing Players that should not be included in completions
* @return List of completions * @return List of completions
* @deprecated In favor {@link #completePlayers(PlotPlayer, String, List)}
*/ */
@Deprecated(forRemoval = true)
public static @NonNull List<Command> completePlayers( public static @NonNull List<Command> completePlayers(
final @NonNull String input, final @NonNull String input,
final @NonNull List<String> existing final @NonNull List<String> existing
) { ) {
return completePlayers("players", input, existing, uuid -> true); return completePlayers(ConsolePlayer.getConsole(), input, existing);
}
/**
* Get a list of tab completions corresponding to player names. This uses the UUID pipeline
* cache, so it will complete will all names known to PlotSquared
*
* @param input Command input
* @param issuer The player who issued the tab completion
* @param existing Players that should not be included in completions
* @return List of completions
*/
public static @NonNull List<Command> completePlayers(
final @NonNull PlotPlayer<?> issuer,
final @NonNull String input,
final @NonNull List<String> existing
) {
return completePlayers("players", issuer, input, existing, uuid -> true);
} }
/** /**
@ -95,12 +116,32 @@ public final class TabCompletions {
* @param input Command input * @param input Command input
* @param existing Players that should not be included in completions * @param existing Players that should not be included in completions
* @return List of completions * @return List of completions
*
* @deprecated In favor {@link #completeAddedPlayers(PlotPlayer, Plot, String, List)}
*/ */
@Deprecated(forRemoval = true)
public static @NonNull List<Command> completeAddedPlayers( public static @NonNull List<Command> completeAddedPlayers(
final @NonNull Plot plot, final @NonNull Plot plot,
final @NonNull String input, final @NonNull List<String> existing final @NonNull String input, final @NonNull List<String> existing
) { ) {
return completePlayers("added" + plot, input, existing, return completeAddedPlayers(ConsolePlayer.getConsole(), plot, input, existing);
}
/**
* Get a list of tab completions corresponding to player names added to the given plot.
*
* @param issuer The player who issued the tab completion
* @param plot Plot to complete added players for
* @param input Command input
* @param existing Players that should not be included in completions
* @return List of completions
*/
public static @NonNull List<Command> completeAddedPlayers(
final @NonNull PlotPlayer<?> issuer,
final @NonNull Plot plot,
final @NonNull String input, final @NonNull List<String> existing
) {
return completePlayers("added" + plot, issuer, input, existing,
uuid -> plot.getMembers().contains(uuid) uuid -> plot.getMembers().contains(uuid)
|| plot.getTrusted().contains(uuid) || plot.getTrusted().contains(uuid)
|| plot.getDenied().contains(uuid) || plot.getDenied().contains(uuid)
@ -222,9 +263,28 @@ public final class TabCompletions {
* @param existing Players that should not be included in completions * @param existing Players that should not be included in completions
* @param uuidFilter Filter applied before caching values * @param uuidFilter Filter applied before caching values
* @return List of completions * @return List of completions
* @deprecated In favor {@link #completePlayers(String, PlotPlayer, String, List, Predicate)}
*/
@Deprecated(forRemoval = true)
private static List<Command> completePlayers(
final @NonNull String cacheIdentifier,
final @NonNull String input, final @NonNull List<String> existing,
final @NonNull Predicate<UUID> uuidFilter
) {
return completePlayers(cacheIdentifier, ConsolePlayer.getConsole(), input, existing, uuidFilter);
}
/**
* @param cacheIdentifier Cache key
* @param issuer The player who issued the tab completion
* @param input Command input
* @param existing Players that should not be included in completions
* @param uuidFilter Filter applied before caching values
* @return List of completions
*/ */
private static List<Command> completePlayers( private static List<Command> completePlayers(
final @NonNull String cacheIdentifier, final @NonNull String cacheIdentifier,
final @NonNull PlotPlayer<?> issuer,
final @NonNull String input, final @NonNull List<String> existing, final @NonNull String input, final @NonNull List<String> existing,
final @NonNull Predicate<UUID> uuidFilter final @NonNull Predicate<UUID> uuidFilter
) { ) {
@ -246,9 +306,13 @@ public final class TabCompletions {
final Collection<? extends PlotPlayer<?>> onlinePlayers = PlotSquared.platform().playerManager().getPlayers(); final Collection<? extends PlotPlayer<?>> onlinePlayers = PlotSquared.platform().playerManager().getPlayers();
players = new ArrayList<>(onlinePlayers.size()); players = new ArrayList<>(onlinePlayers.size());
for (final PlotPlayer<?> player : onlinePlayers) { for (final PlotPlayer<?> player : onlinePlayers) {
if (uuidFilter.test(player.getUUID())) { if (!uuidFilter.test(player.getUUID())) {
players.add(player.getName()); continue;
} }
if (issuer != null && !issuer.canSee(player)) {
continue;
}
players.add(player.getName());
} }
} }
return filterCached(players, input, existing); return filterCached(players, input, existing);

View File

@ -53,7 +53,9 @@
"cluster.cluster_regenerated": "<prefix><dark_aqua>Successfully started cluster regeneration.</dark_aqua>", "cluster.cluster_regenerated": "<prefix><dark_aqua>Successfully started cluster regeneration.</dark_aqua>",
"cluster.cluster_teleporting": "<prefix><dark_aqua>Teleporting...</dark_aqua>", "cluster.cluster_teleporting": "<prefix><dark_aqua>Teleporting...</dark_aqua>",
"cluster.cluster_info": "<prefix><gold>Current cluster: </gold><gray><id></gray>\n<gold>Name: </gold><gray><name></gray>\n<gold>Owner: </gold><gray><owner></gray>\n<gold>Size: </gold><gray><size></gray>\n<gold>Rights: </gold><gray><rights></gray>", "cluster.cluster_info": "<prefix><gold>Current cluster: </gold><gray><id></gray>\n<gold>Name: </gold><gray><name></gray>\n<gold>Owner: </gold><gray><owner></gray>\n<gold>Size: </gold><gray><size></gray>\n<gold>Rights: </gold><gray><rights></gray>",
"border.border": "<prefix><gray>You are outside the current map border.</gray>", "border.denied": "<prefix><red>You are outside the current map border.</red>",
"border.bypass.exited": "<prefix><red>You have bypassed the current map border area.</red>",
"border.bypass.entered": "<prefix><gray>You have re-entered the current map border area.</gray>",
"worldedit.worldedit_bypass": "<prefix><gray><italic>To bypass your restrictions use </gray><dark_aqua><command></dark_aqua></italic>", "worldedit.worldedit_bypass": "<prefix><gray><italic>To bypass your restrictions use </gray><dark_aqua><command></dark_aqua></italic>",
"worldedit.worldedit_bypassed": "<prefix><gray>Currently bypassing WorldEdit restriction.</gray>", "worldedit.worldedit_bypassed": "<prefix><gray>Currently bypassing WorldEdit restriction.</gray>",
"gamemode.gamemode_was_bypassed": "<prefix><gold>You bypassed the gamemode (</gold><gray><gamemode></gray><gold>) <gold>set for </gold><gray><plot>.</gray>", "gamemode.gamemode_was_bypassed": "<prefix><gold>You bypassed the gamemode (</gold><gray><gamemode></gray><gold>) <gold>set for </gold><gray><plot>.</gray>",
@ -92,6 +94,7 @@
"done.done_insufficient_complexity": "<prefix><red>This plot is too simple. Please add more detail before using this command.</red>", "done.done_insufficient_complexity": "<prefix><red>This plot is too simple. Please add more detail before using this command.</red>",
"done.done_success": "<prefix><gold>Successfully marked this plot as done.</gold>", "done.done_success": "<prefix><gold>Successfully marked this plot as done.</gold>",
"done.done_removed": "<prefix><gray>You may now continue building in this plot.</gray>", "done.done_removed": "<prefix><gray>You may now continue building in this plot.</gray>",
"done.building_restricted": "<prefix><gray>You can't build on plots marked as done.</gray>",
"ratings.ratings_purged": "<prefix><gray>Purged ratings for this plot.</gray>", "ratings.ratings_purged": "<prefix><gray>Purged ratings for this plot.</gray>",
"ratings.rating_not_valid": "<prefix><red>You need to specify a number between 1 and 10.</red>", "ratings.rating_not_valid": "<prefix><red>You need to specify a number between 1 and 10.</red>",
"ratings.rating_already_exists": "<prefix><gray>You have already rated plot <plot>.</gray>", "ratings.rating_already_exists": "<prefix><gray>You have already rated plot <plot>.</gray>",
@ -183,8 +186,6 @@
"error.task_in_process": "<prefix><gold>Task is already running.</gold>", "error.task_in_process": "<prefix><gold>Task is already running.</gold>",
"titles.title_entered_plot": "<gold>Plot: <world>;<plot></gold>", "titles.title_entered_plot": "<gold>Plot: <world>;<plot></gold>",
"titles.title_entered_plot_sub": "<dark_aqua>Owned by <owner></dark_aqua>", "titles.title_entered_plot_sub": "<dark_aqua>Owned by <owner></dark_aqua>",
"titles.prefix_greeting": "<gold><id></gold><gray>></gray>",
"titles.prefix_farewell": "<gold><id></gold><gray>></gray>",
"core.prefix": "<dark_gray>[</dark_gray><gold>P2</gold><dark_gray>] </dark_gray>", "core.prefix": "<dark_gray>[</dark_gray><gold>P2</gold><dark_gray>] </dark_gray>",
"core.enabled": "<prefix><gold><value> is now enabled.</gold>", "core.enabled": "<prefix><gold><value> is now enabled.</gold>",
"placeholder.hooked": "<prefix><gold>PlotSquared hooked into MVdWPlaceholderAPI</gold>", "placeholder.hooked": "<prefix><gold>PlotSquared hooked into MVdWPlaceholderAPI</gold>",
@ -617,6 +618,8 @@
"flags.flag_error_title": "Flag value must be in the format </red><grey>\"A title\" \"The subtitle\"</grey><red>.", "flags.flag_error_title": "Flag value must be in the format </red><grey>\"A title\" \"The subtitle\"</grey><red>.",
"flags.area_flags": "<prefix><gray>Area flags: </gray><dark_aqua><flags></dark_aqua>", "flags.area_flags": "<prefix><gray>Area flags: </gray><dark_aqua><flags></dark_aqua>",
"flags.road_flags": "<prefix><gray>Road flags: </gray><dark_aqua><flags></dark_aqua>", "flags.road_flags": "<prefix><gray>Road flags: </gray><dark_aqua><flags></dark_aqua>",
"flags.greeting_flag_format": "<prefix><gold>[<world>;<plot_id>]:</gold> <greeting>",
"flags.farewell_flag_format": "<prefix><gold>[<world>;<plot_id>]:</gold> <farewell>",
"commands.description.add": "<gray>Allow a user to build in a plot while the plot owner is online.</gray>", "commands.description.add": "<gray>Allow a user to build in a plot while the plot owner is online.</gray>",
"commands.description.alias": "<gray>Set the plot alias.</gray>", "commands.description.alias": "<gray>Set the plot alias.</gray>",
"commands.description.area": "<gray>Create a new plot area.</gray>", "commands.description.area": "<gray>Create a new plot area.</gray>",

View File

@ -30,21 +30,13 @@ is to provide a lag-free and smooth experience.
* [Wiki](https://github.com/IntellectualSites/PlotSquared-Documentation/wiki) * [Wiki](https://github.com/IntellectualSites/PlotSquared-Documentation/wiki)
* [Issues](https://github.com/IntellectualSites/PlotSquared/issues) * [Issues](https://github.com/IntellectualSites/PlotSquared/issues)
* [Translations](https://intellectualsites.crowdin.com/plotsquared/) * [Translations](https://intellectualsites.crowdin.com/plotsquared/)
* [Contributing](https://github.com/IntellectualSites/.github/blob/main/CONTRIBUTING.md)
### Developer Resources ### Developer Resources
* [API Documentation](https://github.com/IntellectualSites/PlotSquared-Documentation/wiki/API-Documentation) * [API Documentation](https://github.com/IntellectualSites/PlotSquared-Documentation/wiki/API-Documentation)
* [Event API](https://github.com/IntellectualSites/PlotSquared-Documentation/wiki/Events) * [Event API](https://github.com/IntellectualSites/PlotSquared-Documentation/wiki/Events)
* [Flag API](https://github.com/IntellectualSites/PlotSquared-Documentation/wiki/API-Flag) * [Flag API](https://github.com/IntellectualSites/PlotSquared-Documentation/wiki/API-Flag)
# Building
Gradle is the **recommended** way to build the project. Use `./gradlew build` in the main project directory to build the project. Gradle is required if you intend to build or develop the Sponge module.
# Contributing
See [here](https://github.com/IntellectualSites/PlotSquared/blob/v6/CONTRIBUTING.md)
## Suggestions
Suggestions are welcome! We have a separate issue tracker for suggestions, that can be found in [this](https://github.com/IntellectualSites/PlotSquaredSuggestions) repository.
# Official Addons # Official Addons
* [Plot2Dynmap](http://www.spigotmc.org/resources/plot2dynmap.1292/) * [Plot2Dynmap](http://www.spigotmc.org/resources/plot2dynmap.1292/)
* [HoloPlots](https://www.spigotmc.org/resources/holoplots.4880/) * [HoloPlots](https://www.spigotmc.org/resources/holoplots.4880/)

View File

@ -1,3 +0,0 @@
If you discover a security vulnerability in PlotSquared, please submit it through the [Security Vulnerability Form](https://forms.gle/btgdRn9yhGtzEiGW8).
Thanks for helping make PlotSquared safe for everyone.

View File

@ -1,6 +1,7 @@
import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin
import org.cadixdev.gradle.licenser.LicenseExtension import org.cadixdev.gradle.licenser.LicenseExtension
import org.cadixdev.gradle.licenser.Licenser import org.cadixdev.gradle.licenser.Licenser
import java.net.URI
plugins { plugins {
java java
@ -11,22 +12,13 @@ plugins {
alias(libs.plugins.shadow) alias(libs.plugins.shadow)
alias(libs.plugins.licenser) alias(libs.plugins.licenser)
alias(libs.plugins.grgit) alias(libs.plugins.grgit)
alias(libs.plugins.nexus)
eclipse eclipse
idea idea
} }
var ver by extra("6.1.2") version = "6.1.4"
var versuffix by extra("-SNAPSHOT")
val versionsuffix: String? by project
if (versionsuffix != null) {
versuffix = "-$versionsuffix"
}
version = if (!project.hasProperty("release")) {
ver + versuffix
} else {
ver
}
allprojects { allprojects {
group = "com.plotsquared" group = "com.plotsquared"
@ -76,7 +68,7 @@ allprojects {
dependencies { dependencies {
// Tests // Tests
testImplementation("junit:junit:4.13.2") testImplementation("junit:junit:4.13.2")
testImplementation("org.junit.jupiter:junit-jupiter:5.8.0") testImplementation("org.junit.jupiter:junit-jupiter:5.8.1")
} }
plugins.withId("java") { plugins.withId("java") {
@ -103,6 +95,9 @@ allprojects {
signing { signing {
if (!version.toString().endsWith("-SNAPSHOT")) { if (!version.toString().endsWith("-SNAPSHOT")) {
val signingKey: String? by project
val signingPassword: String? by project
useInMemoryPgpKeys(signingKey, signingPassword)
signing.isRequired signing.isRequired
sign(publishing.publications) sign(publishing.publications)
} }
@ -111,8 +106,6 @@ allprojects {
publishing { publishing {
publications { publications {
create<MavenPublication>("maven") { create<MavenPublication>("maven") {
// This includes not only the original jar (i.e. not shadowJar),
// but also sources & javadocs due to the above java block.
from(components["java"]) from(components["java"])
pom { pom {
@ -133,18 +126,23 @@ allprojects {
developer { developer {
id.set("Sauilitired") id.set("Sauilitired")
name.set("Alexander Söderberg") name.set("Alexander Söderberg")
organization.set("IntellectualSites")
} }
developer { developer {
id.set("NotMyFault") id.set("NotMyFault")
name.set("NotMyFault") name.set("NotMyFault")
organization.set("IntellectualSites")
email.set("contact@notmyfault.dev")
} }
developer { developer {
id.set("SirYwell") id.set("SirYwell")
name.set("Hannes Greule") name.set("Hannes Greule")
organization.set("IntellectualSites")
} }
developer { developer {
id.set("dordsor21") id.set("dordsor21")
name.set("dordsor21") name.set("dordsor21")
organization.set("IntellectualSites")
} }
} }
@ -161,34 +159,6 @@ allprojects {
} }
} }
} }
repositories {
mavenLocal() // Install to own local repository
// Accept String? to not err if they're not present.
// Check that they both exist before adding the repo, such that
// `credentials` doesn't err if one is null.
// It's not pretty, but this way it can compile.
val nexusUsername: String? by project
val nexusPassword: String? by project
if (nexusUsername != null && nexusPassword != null) {
maven {
val releasesRepositoryUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
val snapshotRepositoryUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
url = uri(
if (version.toString().endsWith("-SNAPSHOT")) snapshotRepositoryUrl
else releasesRepositoryUrl
)
credentials {
username = nexusUsername
password = nexusPassword
}
}
} else {
logger.warn("No nexus repository is added; nexusUsername or nexusPassword is null.")
}
}
} }
tasks { tasks {
@ -217,10 +187,6 @@ allprojects {
) )
} }
jar {
this.archiveClassifier.set("jar")
}
shadowJar { shadowJar {
this.archiveClassifier.set(null as String?) this.archiveClassifier.set(null as String?)
this.archiveFileName.set("${project.name}-${project.version}.${this.archiveExtension.getOrElse("jar")}") this.archiveFileName.set("${project.name}-${project.version}.${this.archiveExtension.getOrElse("jar")}")
@ -237,6 +203,15 @@ allprojects {
} }
nexusPublishing {
repositories {
sonatype {
nexusUrl.set(URI.create("https://s01.oss.sonatype.org/service/local/"))
snapshotRepositoryUrl.set(URI.create("https://s01.oss.sonatype.org/content/repositories/snapshots/"))
}
}
}
tasks { tasks {
val aggregatedJavadocs = create<Javadoc>("aggregatedJavadocs") { val aggregatedJavadocs = create<Javadoc>("aggregatedJavadocs") {
title = "${project.name} ${project.version} API" title = "${project.name} ${project.version} API"

View File

@ -6,19 +6,19 @@ log4j-api = "2.14.1" # Version set by Minecraft
# Platform expectations # Platform expectations
paper = "1.17.1-R0.1-SNAPSHOT" paper = "1.17.1-R0.1-SNAPSHOT"
checker-qual = "3.18.0" checker-qual = "3.19.0"
guice = "5.0.1" guice = "5.0.1"
findbugs = "3.0.1" findbugs = "3.0.1"
snakeyaml = "1.28" # Version set by Bukkit snakeyaml = "1.28" # Version set by Bukkit
# Adventure & MiniMessage # Adventure & MiniMessage
adventure-api = "4.9.1" adventure-api = "4.9.3"
adventure-text-minimessage = "4.1.0-SNAPSHOT" adventure-text-minimessage = "4.1.0-SNAPSHOT"
adventure-platform-bukkit = "4.0.0" adventure-platform-bukkit = "4.0.0"
# Plugins # Plugins
worldedit = "7.2.6" worldedit = "7.2.7"
fawe = "1.17-201" fawe = "1.17-390"
vault = "1.7.1" vault = "1.7.1"
placeholderapi = "2.10.10" placeholderapi = "2.10.10"
luckperms = "5.3" luckperms = "5.3"
@ -35,13 +35,14 @@ paster = "1.1.1"
bstats = "2.2.1" bstats = "2.2.1"
paperlib = "1.0.6" paperlib = "1.0.6"
squirrelid = "0.3.0" squirrelid = "0.3.0"
serverlib = "2.3.0" serverlib = "2.3.1"
http4j = "1.3" http4j = "1.3"
# Gradle plugins # Gradle plugins
shadow = "7.0.0" shadow = "7.1.0"
grgit = "4.1.0" grgit = "4.1.0"
licenser = "0.6.1" licenser = "0.6.1"
nexus = "1.1.0"
[libraries] [libraries]
# Platform expectations # Platform expectations
@ -67,8 +68,8 @@ adventurePlatformBukkit = { group = "net.kyori", name = "adventure-platform-bukk
# Plugins # Plugins
worldeditCore = { group = "com.sk89q.worldedit", name = "worldedit-core", version.ref = "worldedit" } worldeditCore = { group = "com.sk89q.worldedit", name = "worldedit-core", version.ref = "worldedit" }
worldeditBukkit = { group = "com.sk89q.worldedit", name = "worldedit-bukkit", version.ref = "worldedit" } worldeditBukkit = { group = "com.sk89q.worldedit", name = "worldedit-bukkit", version.ref = "worldedit" }
fastasyncworldeditBukkit = { group = "com.fastasyncworldedit", name = "FAWE-Bukkit", version.ref = "fawe" } fastasyncworldeditBukkit = { group = "com.fastasyncworldedit", name = "FastAsyncWorldEdit-Bukkit", version.ref = "fawe" }
fastasyncworldeditCore = { group = "com.fastasyncworldedit", name = "FAWE-Core", version.ref = "fawe" } fastasyncworldeditCore = { group = "com.fastasyncworldedit", name = "FastAsyncWorldEdit-Core", version.ref = "fawe" }
vault = { group = "com.github.MilkBowl", name = "VaultAPI", version.ref = "vault" } vault = { group = "com.github.MilkBowl", name = "VaultAPI", version.ref = "vault" }
placeholderapi = { group = "me.clip", name = "placeholderapi", version.ref = "placeholderapi" } placeholderapi = { group = "me.clip", name = "placeholderapi", version.ref = "placeholderapi" }
luckperms = { group = "net.luckperms", name = "api", version.ref = "luckperms" } luckperms = { group = "net.luckperms", name = "api", version.ref = "luckperms" }
@ -92,3 +93,4 @@ paster = { group = "com.intellectualsites.paster", name = "Paster", version.ref
shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadow" } shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadow" }
grgit = { id = "org.ajoberstar.grgit", version.ref = "grgit" } grgit = { id = "org.ajoberstar.grgit", version.ref = "grgit" }
licenser = { id = "org.cadixdev.licenser", version.ref = "licenser" } licenser = { id = "org.cadixdev.licenser", version.ref = "licenser" }
nexus = { id = "io.github.gradle-nexus.publish-plugin", version.ref = "nexus" }

View File

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

View File

@ -5,7 +5,15 @@
], ],
"ignoreDeps": [ "ignoreDeps": [
"guava", "guava",
"com.google.guava:guava",
"com.google.code.gson:gson",
"gson", "gson",
"snakeyaml" "snakeyaml"
] ],
"timezone": "Europe/Berlin",
"schedule": [
"on monday after 9am"
],
"labels": ["Renovate"],
"commitMessagePrefix": "chore: "
} }