Implement build height limits into more events

This commit is contained in:
dordsor21 2022-06-18 17:23:29 +01:00
parent 7279862def
commit ca7e9c9bd8
No known key found for this signature in database
GPG Key ID: 1E53E88969FFCF0B
4 changed files with 112 additions and 38 deletions

View File

@ -281,6 +281,7 @@ public class BlockEventListener implements Listener {
Template.of("minHeight", String.valueOf(area.getMinBuildHeight())), Template.of("minHeight", String.valueOf(area.getMinBuildHeight())),
Template.of("maxHeight", String.valueOf(area.getMaxBuildHeight())) Template.of("maxHeight", String.valueOf(area.getMaxBuildHeight()))
); );
return;
} }
if (!plot.hasOwner()) { if (!plot.hasOwner()) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) { if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_UNOWNED)) {
@ -367,6 +368,7 @@ public class BlockEventListener implements Listener {
Template.of("minHeight", String.valueOf(area.getMinBuildHeight())), Template.of("minHeight", String.valueOf(area.getMinBuildHeight())),
Template.of("maxHeight", String.valueOf(area.getMaxBuildHeight())) Template.of("maxHeight", String.valueOf(area.getMaxBuildHeight()))
); );
return;
} }
if (!plot.hasOwner()) { if (!plot.hasOwner()) {
if (!Permissions if (!Permissions
@ -846,6 +848,11 @@ public class BlockEventListener implements Listener {
return; return;
} }
if (location.getY() >= area.getMaxBuildHeight() || location.getY() < area.getMinBuildHeight()) {
event.setCancelled(true);
return;
}
Plot plot = location.getOwnedPlot(); Plot plot = location.getOwnedPlot();
if (plot == null || !plot.getFlag(CropGrowFlag.class)) { if (plot == null || !plot.getFlag(CropGrowFlag.class)) {
if (plot != null) { if (plot != null) {
@ -887,17 +894,23 @@ public class BlockEventListener implements Listener {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
int minBuildHeight = area.getMinBuildHeight();
int maxBuildHeight = area.getMaxBuildHeight();
for (Block block1 : event.getBlocks()) { for (Block block1 : event.getBlocks()) {
Location bloc = BukkitUtil.adapt(block1.getLocation()); Location bloc = BukkitUtil.adapt(block1.getLocation());
if (!area.contains(bloc.getX(), bloc.getZ()) || !area.contains( Location newLoc = bloc.add(relative.getBlockX(), relative.getBlockY(), relative.getBlockZ());
bloc.getX() + relative.getBlockX(), if (!area.contains(bloc.getX(), bloc.getZ()) || !area.contains(newLoc)) {
bloc.getZ() + relative.getBlockZ()
)) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if (!plot.equals(area.getOwnedPlot(bloc)) || !plot if (!plot.equals(area.getOwnedPlot(bloc)) || !plot.equals(area.getOwnedPlot(newLoc))) {
.equals(area.getOwnedPlot(bloc.add(relative.getBlockX(), relative.getBlockY(), relative.getBlockZ())))) { event.setCancelled(true);
return;
}
if (bloc.getY() < minBuildHeight
|| bloc.getY() >= maxBuildHeight
|| newLoc.getY() < minBuildHeight
|| newLoc.getY() >= maxBuildHeight) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -923,9 +936,8 @@ public class BlockEventListener implements Listener {
} }
for (Block block1 : event.getBlocks()) { for (Block block1 : event.getBlocks()) {
Location bloc = BukkitUtil.adapt(block1.getLocation()); Location bloc = BukkitUtil.adapt(block1.getLocation());
if (bloc.isPlotArea() || bloc Location newLoc = bloc.add(relative.getBlockX(), relative.getBlockY(), relative.getBlockZ());
.add(relative.getBlockX(), relative.getBlockY(), relative.getBlockZ()) if (bloc.isPlotArea() || newLoc.isPlotArea()) {
.isPlotArea()) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -937,17 +949,23 @@ public class BlockEventListener implements Listener {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
int minBuildHeight = area.getMinBuildHeight();
int maxBuildHeight = area.getMaxBuildHeight();
for (Block block1 : event.getBlocks()) { for (Block block1 : event.getBlocks()) {
Location bloc = BukkitUtil.adapt(block1.getLocation()); Location bloc = BukkitUtil.adapt(block1.getLocation());
if (!area.contains(bloc.getX(), bloc.getZ()) || !area.contains( Location newLoc = bloc.add(relative.getBlockX(), relative.getBlockY(), relative.getBlockZ());
bloc.getX() + relative.getBlockX(), if (!area.contains(bloc.getX(), bloc.getZ()) || !area.contains(newLoc)) {
bloc.getZ() + relative.getBlockZ()
)) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if (!plot.equals(area.getOwnedPlot(bloc)) || !plot if (!plot.equals(area.getOwnedPlot(bloc)) || !plot.equals(area.getOwnedPlot(newLoc))) {
.equals(area.getOwnedPlot(bloc.add(relative.getBlockX(), relative.getBlockY(), relative.getBlockZ())))) { event.setCancelled(true);
return;
}
if (bloc.getY() < minBuildHeight
|| bloc.getY() >= maxBuildHeight
|| newLoc.getY() < minBuildHeight
|| newLoc.getY() >= maxBuildHeight) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -971,6 +989,11 @@ public class BlockEventListener implements Listener {
Location location = BukkitUtil.adapt(event.getBlock().getRelative(targetFace).getLocation()); Location location = BukkitUtil.adapt(event.getBlock().getRelative(targetFace).getLocation());
if (location.isPlotRoad()) { if (location.isPlotRoad()) {
event.setCancelled(true); event.setCancelled(true);
return;
}
PlotArea area = location.getPlotArea();
if (area != null && (location.getY() < area.getMinBuildHeight() || location.getY() >= area.getMaxBuildHeight())) {
event.setCancelled(true);
} }
} }
} }
@ -1010,6 +1033,10 @@ public class BlockEventListener implements Listener {
Plot plot = area.getOwnedPlot(location); Plot plot = area.getOwnedPlot(location);
if (!Objects.equals(plot, origin)) { if (!Objects.equals(plot, origin)) {
event.getBlocks().remove(i); event.getBlocks().remove(i);
continue;
}
if (location.getY() < area.getMinBuildHeight() || location.getY() >= area.getMaxBuildHeight()) {
event.getBlocks().remove(i);
} }
} }
} }
@ -1101,6 +1128,17 @@ public class BlockEventListener implements Listener {
Plot plot = area.getOwnedPlot(location1); Plot plot = area.getOwnedPlot(location1);
if (player != null) { if (player != null) {
BukkitPlayer pp = BukkitUtil.adapt(player); BukkitPlayer pp = BukkitUtil.adapt(player);
if ((location1.getY() >= area.getMaxBuildHeight() || location1.getY() < area
.getMinBuildHeight()) && !Permissions
.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
event.setCancelled(true);
pp.sendMessage(
TranslatableCaption.of("height.height_limit"),
Template.of("minHeight", String.valueOf(area.getMinBuildHeight())),
Template.of("maxHeight", String.valueOf(area.getMaxBuildHeight()))
);
return;
}
if (plot == null) { if (plot == null) {
if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_ROAD)) { if (!Permissions.hasPermission(pp, Permission.PERMISSION_ADMIN_BUILD_ROAD)) {
pp.sendMessage( pp.sendMessage(
@ -1208,7 +1246,10 @@ public class BlockEventListener implements Listener {
return true; return true;
} }
Plot plot = area.getOwnedPlot(blockLocation); Plot plot = area.getOwnedPlot(blockLocation);
return !Objects.equals(plot, origin); if (!Objects.equals(plot, origin)) {
return true;
}
return blockLocation.getY() < area.getMinBuildHeight() || blockLocation.getY() >= area.getMaxBuildHeight();
}); });
} }
if (blocks.isEmpty()) { if (blocks.isEmpty()) {

View File

@ -21,11 +21,15 @@ package com.plotsquared.bukkit.listener;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.plotsquared.bukkit.player.BukkitPlayer; import com.plotsquared.bukkit.player.BukkitPlayer;
import com.plotsquared.bukkit.util.BukkitUtil; import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.location.Location; import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag; import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag;
import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag; import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag;
import com.plotsquared.core.util.Permissions;
import net.kyori.adventure.text.minimessage.Template;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Item; import org.bukkit.entity.Item;
@ -59,10 +63,26 @@ public class BlockEventListener117 implements Listener {
return; return;
} }
BukkitPlayer plotPlayer = null;
if (entity instanceof Player player) {
plotPlayer = BukkitUtil.adapt(player);
if ((location.getY() >= area.getMaxBuildHeight() || location.getY() < area
.getMinBuildHeight()) && !Permissions
.hasPermission(plotPlayer, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
event.setCancelled(true);
plotPlayer.sendMessage(
TranslatableCaption.of("height.height_limit"),
Template.of("minHeight", String.valueOf(area.getMinBuildHeight())),
Template.of("maxHeight", String.valueOf(area.getMaxBuildHeight()))
);
return;
}
}
Plot plot = location.getOwnedPlot(); Plot plot = location.getOwnedPlot();
if (plot == null || !plot.getFlag(MiscInteractFlag.class)) { if (plot == null || !plot.getFlag(MiscInteractFlag.class)) {
if (entity instanceof Player player) { if (plotPlayer != null) {
BukkitPlayer plotPlayer = BukkitUtil.adapt(player);
if (plot != null) { if (plot != null) {
if (!plot.isAdded(plotPlayer.getUUID())) { if (!plot.isAdded(plotPlayer.getUUID())) {
plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because misc-interact = false"); plot.debug(plotPlayer.getName() + " couldn't trigger sculk sensors because misc-interact = false");
@ -94,12 +114,12 @@ public class BlockEventListener117 implements Listener {
PlotArea area = location.getPlotArea(); PlotArea area = location.getPlotArea();
if (area == null) { if (area == null) {
for (int i = blocks.size() - 1; i >= 0; i--) { for (int i = blocks.size() - 1; i >= 0; i--) {
location = BukkitUtil.adapt(blocks.get(i).getLocation()); Location blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation());
if (location.isPlotArea()) { blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation());
if (blockLocation.isPlotArea()) {
blocks.remove(i); blocks.remove(i);
} }
} }
return;
} else { } else {
Plot origin = area.getOwnedPlot(location); Plot origin = area.getOwnedPlot(location);
if (origin == null) { if (origin == null) {
@ -107,30 +127,22 @@ public class BlockEventListener117 implements Listener {
return; return;
} }
for (int i = blocks.size() - 1; i >= 0; i--) { for (int i = blocks.size() - 1; i >= 0; i--) {
location = BukkitUtil.adapt(blocks.get(i).getLocation()); Location blockLocation = BukkitUtil.adapt(blocks.get(i).getLocation());
if (!area.contains(location.getX(), location.getZ())) { if (!area.contains(blockLocation.getX(), blockLocation.getZ())) {
blocks.remove(i); blocks.remove(i);
continue; continue;
} }
Plot plot = area.getOwnedPlot(location); Plot plot = area.getOwnedPlot(blockLocation);
if (!Objects.equals(plot, origin)) { if (!Objects.equals(plot, origin)) {
event.getBlocks().remove(i); event.getBlocks().remove(i);
continue;
} }
} if (blockLocation.getY() < area.getMinBuildHeight() || blockLocation.getY() >= area.getMaxBuildHeight()) {
}
Plot origin = area.getPlot(location);
if (origin == null) {
event.setCancelled(true);
return;
}
for (int i = blocks.size() - 1; i >= 0; i--) {
location = BukkitUtil.adapt(blocks.get(i).getLocation());
Plot plot = area.getOwnedPlot(location);
if (!Objects.equals(plot, origin) && (!plot.isMerged() && !origin.isMerged())) {
event.getBlocks().remove(i); event.getBlocks().remove(i);
} }
} }
} }
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockForm(BlockFormEvent event) { public void onBlockForm(BlockFormEvent event) {

View File

@ -145,13 +145,11 @@ import org.bukkit.util.Vector;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.regex.Pattern;
/** /**
* Player Events involving plots. * Player Events involving plots.
@ -1705,6 +1703,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
if (PlotSquared.get().getPlotAreaManager().getPlotAreasSet(world).size() == 0) { if (PlotSquared.get().getPlotAreaManager().getPlotAreasSet(world).size() == 0) {
return; return;
} }
BukkitPlayer pp = (event.getEntity() instanceof Player player) ? BukkitUtil.adapt(player) : null;
int minX = Integer.MAX_VALUE; int minX = Integer.MAX_VALUE;
int maxX = Integer.MIN_VALUE; int maxX = Integer.MIN_VALUE;
int minZ = Integer.MAX_VALUE; int minZ = Integer.MAX_VALUE;
@ -1726,6 +1725,18 @@ public class PlayerEventListener extends PlotListener implements Listener {
if (area == null) { if (area == null) {
continue; continue;
} }
if (pp != null && (location.getY() >= area.getMaxBuildHeight() || location.getY() < area.getMinBuildHeight()) && !Permissions.hasPermission(
pp,
Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT
)) {
event.setCancelled(true);
pp.sendMessage(
TranslatableCaption.of("height.height_limit"),
Template.of("minHeight", String.valueOf(area.getMinBuildHeight())),
Template.of("maxHeight", String.valueOf(area.getMaxBuildHeight()))
);
return;
}
Plot plot = location.getOwnedPlot(); Plot plot = location.getOwnedPlot();
if (plot == null) { if (plot == null) {
if (area.isRoadFlags() && area.getRoadFlag(DenyPortalsFlag.class)) { if (area.isRoadFlags() && area.getRoadFlag(DenyPortalsFlag.class)) {

View File

@ -332,6 +332,16 @@ public class EventDispatcher {
) { ) {
PlotArea area = location.getPlotArea(); PlotArea area = location.getPlotArea();
assert area != null; assert area != null;
if ((location.getY() >= area.getMaxBuildHeight() || location.getY() < area
.getMinBuildHeight()) && !Permissions
.hasPermission(player, Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
player.sendMessage(
TranslatableCaption.of("height.height_limit"),
Template.of("minHeight", String.valueOf(area.getMinBuildHeight())),
Template.of("maxHeight", String.valueOf(area.getMaxBuildHeight()))
);
return false;
}
Plot plot = area.getPlot(location); Plot plot = area.getPlot(location);
if (plot != null) { if (plot != null) {
if (plot.isAdded(player.getUUID())) { if (plot.isAdded(player.getUUID())) {