Compare commits

...

31 Commits
7.3.7 ... main

Author SHA1 Message Date
Alexander Brandes c793b4454a Allow consuming artifacts built on a newer JDK
Signed-off-by: Alexander Brandes <mc.cache@web.de>
2024-05-19 16:01:29 +00:00
renovate[bot] 7ab1a3eafb Update fawe to v2.10.0 2024-05-19 16:01:29 +00:00
RedstoneFuture c65c9e7827
fix: PlayerEnterPlotEvent (java doc) description (#4426)
Fixing event description
2024-05-13 20:20:29 +01:00
RedstoneFuture f88ea94bfe
Performance Improvement: high-requency listener (#4402)
* Adding new 'high-frequency-listener' setting

* Moving high-frequency event listener in new class

* Small typo
2024-05-13 20:20:21 +01:00
renovate[bot] c8e8eb919f Update eps1lon/actions-label-merge-conflict action to v3.0.1 2024-05-10 12:55:40 +00:00
Vrganj 83fe761fe4
perf: Avoid expensive Plot#getOwner calls in Plot#getOwners (#4418)
* Avoid expensive Plot#getOwner calls in Plot#getOwners

* Don't check for the owner beforehand, because it's done in the loop regardless
2024-05-09 14:58:06 +02:00
Jordan a7447c9d75
fix: disable not saving single world chunks (#4416)
Disable not saving single world chunks

- addresses #4413
2024-05-09 14:57:58 +02:00
renovate[bot] 5867cc51a7 Update adventure to v4.17.0 2024-05-08 06:20:49 +00:00
renovate[bot] 86e21f3e1a Update dependency com.github.spotbugs:spotbugs-annotations to v4.8.5 2024-05-04 01:58:28 +00:00
renovate[bot] d7d884ad6d Update dependency org.checkerframework:checker-qual to v3.43.0 2024-05-02 02:13:16 +00:00
renovate[bot] 1c45e01a14 Update dependency xyz.jpenilla.run-paper to v2.3.0 2024-05-02 02:12:54 +00:00
Vrganj 6ef1163325
perf: get rid of guice overhead when accessing the player & world manager (#4409)
Return already injected fields to skip slow Injector access
2024-05-01 18:45:15 +02:00
renovate[bot] c57d784df7 Update dependency xyz.jpenilla.run-paper to v2.2.4 2024-04-23 02:10:41 +00:00
Pierre Maurice Schwang c239908aa3
Don't heal dead players (#4407)
fix: don't heal dead players
2024-04-21 13:03:00 +02:00
Alexander Brandes a6412581a6
Back to snapshot for development
Signed-off-by: Alexander Brandes <mc.cache@web.de>
2024-04-16 16:39:38 +02:00
Alexander Brandes f20c5f46e3
Release 7.3.8
Signed-off-by: Alexander Brandes <mc.cache@web.de>
2024-04-16 16:37:46 +02:00
renovate[bot] 4db5954490 Update dependency com.intellectualsites.informative-annotations:informative-annotations to v1.5 2024-04-15 21:31:02 +00:00
renovate[bot] 9f68654614 Update dependency com.intellectualsites.arkitektonika:Arkitektonika-Client to v2.1.3 2024-04-15 20:50:20 +00:00
renovate[bot] 2e4c6199e5 Update dependency com.intellectualsites.paster:Paster to v1.1.6 2024-04-15 20:50:00 +00:00
Alexander Brandes 7edca600fd
Introduce 'skip.signing' property (#4398)
Signed-off-by: Alexander Brandes <mc.cache@web.de>
2024-04-15 19:39:54 +02:00
Alexander Brandes bc1cc074b8
Make builds reproducible (#4395)
Signed-off-by: Alexander Brandes <mc.cache@web.de>
2024-04-14 21:04:01 +02:00
renovate[bot] d383187c6e Update dependency dev.notmyfault.serverlib:ServerLib to v2.3.6 2024-04-14 13:00:22 +00:00
renovate[bot] 125a3f6772 Update dependency dev.notmyfault.serverlib:ServerLib to v2.3.5 2024-04-14 10:20:45 +00:00
Alexander Brandes faca8c2da0
Update wrapper action
Signed-off-by: Alexander Brandes <mc.cache@web.de>
2024-04-14 10:37:08 +02:00
renovate[bot] 0ad5ef4f94 Update gradle/wrapper-validation-action action to v3 2024-04-12 21:33:57 +00:00
Jordan 5e8d8629c2
fix: skip valid location check for world plots (#4388)
- Checking location on teleport to a single plot means the bukkit world is attempted to be accessed before it is loaded
 - we can just skip this check because we know the player will teleport to a reasonable location
2024-04-12 20:55:22 +02:00
Pierre Maurice Schwang 9f4f213a8c
fix plot music volume to span full plot (#4391)
fix: plot music volume to span full plot
2024-04-12 20:55:09 +02:00
renovate[bot] ce14036949 Update dependency com.github.spotbugs:spotbugs-annotations to v4.8.4 2024-04-07 17:22:04 +00:00
renovate[bot] 2dbb6ee025 Update dependency io.github.gradle-nexus.publish-plugin to v2 2024-04-06 01:23:47 +00:00
renovate[bot] 0da1d9f17a Update fawe to v2.9.2 2024-04-04 22:38:19 +00:00
Alexander Brandes f1f41b0523
Back to snapshot for development
Signed-off-by: Alexander Brandes <mc.cache@web.de>
2024-04-04 21:51:55 +02:00
17 changed files with 253 additions and 169 deletions

View File

@ -11,7 +11,7 @@ jobs:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v2
uses: gradle/actions/wrapper-validation@v3
- name: Setup Java
uses: actions/setup-java@v4
with:

View File

@ -11,7 +11,7 @@ jobs:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v2
uses: gradle/actions/wrapper-validation@v3
- name: Setup Java
uses: actions/setup-java@v4
with:

View File

@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Label conflicting PRs
uses: eps1lon/actions-label-merge-conflict@v3.0.0
uses: eps1lon/actions-label-merge-conflict@v3.0.1
with:
dirtyLabel: "unresolved-merge-conflict"
repoToken: "${{ secrets.GITHUB_TOKEN }}"

View File

@ -113,5 +113,6 @@ tasks {
opt.encoding("UTF-8")
opt.keyWords()
opt.addStringOption("-since", isRelease)
opt.noTimestamp()
}
}

View File

@ -24,7 +24,6 @@ import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.Singleton;
import com.google.inject.Stage;
import com.google.inject.TypeLiteral;
import com.plotsquared.bukkit.generator.BukkitPlotGenerator;
import com.plotsquared.bukkit.inject.BackupModule;
import com.plotsquared.bukkit.inject.BukkitModule;
@ -35,6 +34,7 @@ import com.plotsquared.bukkit.listener.BlockEventListener117;
import com.plotsquared.bukkit.listener.ChunkListener;
import com.plotsquared.bukkit.listener.EntityEventListener;
import com.plotsquared.bukkit.listener.EntitySpawnListener;
import com.plotsquared.bukkit.listener.HighFreqBlockEventListener;
import com.plotsquared.bukkit.listener.PaperListener;
import com.plotsquared.bukkit.listener.PlayerEventListener;
import com.plotsquared.bukkit.listener.PlayerEventListener1201;
@ -45,7 +45,6 @@ import com.plotsquared.bukkit.listener.SpigotListener;
import com.plotsquared.bukkit.listener.WorldEvents;
import com.plotsquared.bukkit.placeholder.PAPIPlaceholders;
import com.plotsquared.bukkit.placeholder.PlaceholderFormatter;
import com.plotsquared.bukkit.player.BukkitPlayer;
import com.plotsquared.bukkit.player.BukkitPlayerManager;
import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.bukkit.util.BukkitWorld;
@ -364,6 +363,9 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
getServer().getPluginManager().registerEvents(injector().getInstance(PlayerEventListener1201.class), this);
}
getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener.class), this);
if (Settings.HIGH_FREQUENCY_LISTENER) {
getServer().getPluginManager().registerEvents(injector().getInstance(HighFreqBlockEventListener.class), this);
}
if (serverVersion()[1] >= 17) {
getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener117.class), this);
}
@ -1271,15 +1273,13 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
@Override
public @NonNull PlatformWorldManager<?> worldManager() {
return injector().getInstance(Key.get(new TypeLiteral<PlatformWorldManager<World>>() {
}));
return this.worldManager;
}
@Override
@NonNull
@SuppressWarnings("unchecked")
public PlayerManager<? extends PlotPlayer<Player>, ? extends Player> playerManager() {
return (PlayerManager<BukkitPlayer, Player>) injector().getInstance(PlayerManager.class);
return this.playerManager;
}
@Override

View File

@ -24,7 +24,6 @@ import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.database.DBFunc;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer;
@ -48,7 +47,6 @@ import com.plotsquared.core.plot.flag.implementations.LeafDecayFlag;
import com.plotsquared.core.plot.flag.implementations.LiquidFlowFlag;
import com.plotsquared.core.plot.flag.implementations.MycelGrowFlag;
import com.plotsquared.core.plot.flag.implementations.PlaceFlag;
import com.plotsquared.core.plot.flag.implementations.RedstoneFlag;
import com.plotsquared.core.plot.flag.implementations.SnowFormFlag;
import com.plotsquared.core.plot.flag.implementations.SnowMeltFlag;
import com.plotsquared.core.plot.flag.implementations.SoilDryFlag;
@ -92,11 +90,9 @@ import org.bukkit.event.block.BlockFromToEvent;
import org.bukkit.event.block.BlockGrowEvent;
import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockMultiPlaceEvent;
import org.bukkit.event.block.BlockPhysicsEvent;
import org.bukkit.event.block.BlockPistonExtendEvent;
import org.bukkit.event.block.BlockPistonRetractEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.block.BlockRedstoneEvent;
import org.bukkit.event.block.BlockSpreadEvent;
import org.bukkit.event.block.CauldronLevelChangeEvent;
import org.bukkit.event.block.EntityBlockFormEvent;
@ -112,7 +108,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@ -123,14 +118,6 @@ import static org.bukkit.Tag.WALL_CORALS;
@SuppressWarnings("unused")
public class BlockEventListener implements Listener {
private static final Set<Material> PISTONS = Set.of(
Material.PISTON,
Material.STICKY_PISTON
);
private static final Set<Material> PHYSICS_BLOCKS = Set.of(
Material.TURTLE_EGG,
Material.TURTLE_SPAWN_EGG
);
private static final Set<Material> SNOW = Stream.of(Material.values()) // needed as Tag.SNOW isn't present in 1.16.5
.filter(material -> material.name().contains("SNOW"))
.filter(Material::isBlock)
@ -164,114 +151,6 @@ public class BlockEventListener implements Listener {
}, TaskTime.ticks(3L));
}
@EventHandler
public void onRedstoneEvent(BlockRedstoneEvent event) {
Block block = event.getBlock();
Location location = BukkitUtil.adapt(block.getLocation());
PlotArea area = location.getPlotArea();
if (area == null) {
return;
}
Plot plot = location.getOwnedPlot();
if (plot == null) {
if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, RedstoneFlag.class, false)) {
event.setNewCurrent(0);
}
return;
}
if (!plot.getFlag(RedstoneFlag.class)) {
event.setNewCurrent(0);
plot.debug("Redstone event was cancelled because redstone = false");
return;
}
if (Settings.Redstone.DISABLE_OFFLINE) {
boolean disable = false;
if (!DBFunc.SERVER.equals(plot.getOwner())) {
if (plot.isMerged()) {
disable = true;
for (UUID owner : plot.getOwners()) {
if (PlotSquared.platform().playerManager().getPlayerIfExists(owner) != null) {
disable = false;
break;
}
}
} else {
disable = PlotSquared.platform().playerManager().getPlayerIfExists(plot.getOwnerAbs()) == null;
}
}
if (disable) {
for (UUID trusted : plot.getTrusted()) {
if (PlotSquared.platform().playerManager().getPlayerIfExists(trusted) != null) {
disable = false;
break;
}
}
if (disable) {
event.setNewCurrent(0);
plot.debug("Redstone event was cancelled because no trusted player was in the plot");
return;
}
}
}
if (Settings.Redstone.DISABLE_UNOCCUPIED) {
for (final PlotPlayer<?> player : PlotSquared.platform().playerManager().getPlayers()) {
if (plot.equals(player.getCurrentPlot())) {
return;
}
}
event.setNewCurrent(0);
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onPhysicsEvent(BlockPhysicsEvent event) {
Block block = event.getBlock();
Location location = BukkitUtil.adapt(block.getLocation());
PlotArea area = location.getPlotArea();
if (area == null) {
return;
}
Plot plot = area.getOwnedPlotAbs(location);
if (plot == null) {
return;
}
if (event.getChangedType().hasGravity() && plot.getFlag(DisablePhysicsFlag.class)) {
event.setCancelled(true);
sendBlockChange(event.getBlock().getLocation(), event.getBlock().getBlockData());
plot.debug("Prevented block physics and resent block change because disable-physics = true");
return;
}
if (event.getChangedType() == Material.COMPARATOR) {
if (!plot.getFlag(RedstoneFlag.class)) {
event.setCancelled(true);
plot.debug("Prevented comparator update because redstone = false");
}
return;
}
if (PHYSICS_BLOCKS.contains(event.getChangedType())) {
if (plot.getFlag(DisablePhysicsFlag.class)) {
event.setCancelled(true);
plot.debug("Prevented block physics because disable-physics = true");
}
return;
}
if (Settings.Redstone.DETECT_INVALID_EDGE_PISTONS) {
if (PISTONS.contains(block.getType())) {
org.bukkit.block.data.Directional piston = (org.bukkit.block.data.Directional) block.getBlockData();
final BlockFace facing = piston.getFacing();
location = location.add(facing.getModX(), facing.getModY(), facing.getModZ());
Plot newPlot = area.getOwnedPlotAbs(location);
if (plot.equals(newPlot)) {
return;
}
if (!plot.isMerged() || !plot.getConnectedPlots().contains(newPlot)) {
event.setCancelled(true);
plot.debug("Prevented piston update because of invalid edge piston detection");
}
}
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void blockCreate(BlockPlaceEvent event) {
Location location = BukkitUtil.adapt(event.getBlock().getLocation());

View File

@ -0,0 +1,201 @@
/*
* PlotSquared, a land and world management plugin for Minecraft.
* Copyright (C) IntellectualSites <https://intellectualsites.com>
* Copyright (C) IntellectualSites team and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.plotsquared.bukkit.listener;
import com.google.inject.Inject;
import com.plotsquared.bukkit.player.BukkitPlayer;
import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.database.DBFunc;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.flag.implementations.DisablePhysicsFlag;
import com.plotsquared.core.plot.flag.implementations.RedstoneFlag;
import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.util.PlotFlagUtil;
import com.plotsquared.core.util.task.TaskManager;
import com.plotsquared.core.util.task.TaskTime;
import com.sk89q.worldedit.WorldEdit;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.data.BlockData;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPhysicsEvent;
import org.bukkit.event.block.BlockRedstoneEvent;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.Set;
import java.util.UUID;
@SuppressWarnings("unused")
public class HighFreqBlockEventListener implements Listener {
private static final Set<Material> PISTONS = Set.of(
Material.PISTON,
Material.STICKY_PISTON
);
private static final Set<Material> PHYSICS_BLOCKS = Set.of(
Material.TURTLE_EGG,
Material.TURTLE_SPAWN_EGG
);
private final PlotAreaManager plotAreaManager;
private final WorldEdit worldEdit;
@Inject
public HighFreqBlockEventListener(final @NonNull PlotAreaManager plotAreaManager, final @NonNull WorldEdit worldEdit) {
this.plotAreaManager = plotAreaManager;
this.worldEdit = worldEdit;
}
public static void sendBlockChange(final org.bukkit.Location bloc, final BlockData data) {
TaskManager.runTaskLater(() -> {
String world = bloc.getWorld().getName();
int x = bloc.getBlockX();
int z = bloc.getBlockZ();
int distance = Bukkit.getViewDistance() * 16;
for (final PlotPlayer<?> player : PlotSquared.platform().playerManager().getPlayers()) {
Location location = player.getLocation();
if (location.getWorldName().equals(world)) {
if (16 * Math.abs(location.getX() - x) / 16 > distance || 16 * Math.abs(location.getZ() - z) / 16 > distance) {
continue;
}
((BukkitPlayer) player).player.sendBlockChange(bloc, data);
}
}
}, TaskTime.ticks(3L));
}
@EventHandler
public void onRedstoneEvent(BlockRedstoneEvent event) {
Block block = event.getBlock();
Location location = BukkitUtil.adapt(block.getLocation());
PlotArea area = location.getPlotArea();
if (area == null) {
return;
}
Plot plot = location.getOwnedPlot();
if (plot == null) {
if (PlotFlagUtil.isAreaRoadFlagsAndFlagEquals(area, RedstoneFlag.class, false)) {
event.setNewCurrent(0);
}
return;
}
if (!plot.getFlag(RedstoneFlag.class)) {
event.setNewCurrent(0);
plot.debug("Redstone event was cancelled because redstone = false");
return;
}
if (Settings.Redstone.DISABLE_OFFLINE) {
boolean disable = false;
if (!DBFunc.SERVER.equals(plot.getOwner())) {
if (plot.isMerged()) {
disable = true;
for (UUID owner : plot.getOwners()) {
if (PlotSquared.platform().playerManager().getPlayerIfExists(owner) != null) {
disable = false;
break;
}
}
} else {
disable = PlotSquared.platform().playerManager().getPlayerIfExists(plot.getOwnerAbs()) == null;
}
}
if (disable) {
for (UUID trusted : plot.getTrusted()) {
if (PlotSquared.platform().playerManager().getPlayerIfExists(trusted) != null) {
disable = false;
break;
}
}
if (disable) {
event.setNewCurrent(0);
plot.debug("Redstone event was cancelled because no trusted player was in the plot");
return;
}
}
}
if (Settings.Redstone.DISABLE_UNOCCUPIED) {
for (final PlotPlayer<?> player : PlotSquared.platform().playerManager().getPlayers()) {
if (plot.equals(player.getCurrentPlot())) {
return;
}
}
event.setNewCurrent(0);
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onPhysicsEvent(BlockPhysicsEvent event) {
Block block = event.getBlock();
Location location = BukkitUtil.adapt(block.getLocation());
PlotArea area = location.getPlotArea();
if (area == null) {
return;
}
Plot plot = area.getOwnedPlotAbs(location);
if (plot == null) {
return;
}
if (event.getChangedType().hasGravity() && plot.getFlag(DisablePhysicsFlag.class)) {
event.setCancelled(true);
sendBlockChange(event.getBlock().getLocation(), event.getBlock().getBlockData());
plot.debug("Prevented block physics and resent block change because disable-physics = true");
return;
}
if (event.getChangedType() == Material.COMPARATOR) {
if (!plot.getFlag(RedstoneFlag.class)) {
event.setCancelled(true);
plot.debug("Prevented comparator update because redstone = false");
}
return;
}
if (PHYSICS_BLOCKS.contains(event.getChangedType())) {
if (plot.getFlag(DisablePhysicsFlag.class)) {
event.setCancelled(true);
plot.debug("Prevented block physics because disable-physics = true");
}
return;
}
if (Settings.Redstone.DETECT_INVALID_EDGE_PISTONS) {
if (PISTONS.contains(block.getType())) {
org.bukkit.block.data.Directional piston = (org.bukkit.block.data.Directional) block.getBlockData();
final BlockFace facing = piston.getFacing();
location = location.add(facing.getModX(), facing.getModY(), facing.getModZ());
Plot newPlot = area.getOwnedPlotAbs(location);
if (plot.equals(newPlot)) {
return;
}
if (!plot.isMerged() || !plot.getConnectedPlots().contains(newPlot)) {
event.setCancelled(true);
plot.debug("Prevented piston update because of invalid edge piston detection");
}
}
}
}
}

View File

@ -95,7 +95,8 @@ public class SingleWorldListener implements Listener {
@EventHandler(priority = EventPriority.LOWEST)
public void onChunkLoad(ChunkLoadEvent event) {
handle(event);
// disable this for now, should address https://github.com/IntellectualSites/PlotSquared/issues/4413
// handle(event);
}
}

View File

@ -326,7 +326,7 @@ public class BukkitPlayer extends PlotPlayer<Player> {
return;
}
this.player.playSound(BukkitUtil.adapt(location), Sound.valueOf(BukkitAdapter.adapt(id).name()),
SoundCategory.MUSIC, 1f, 1f
SoundCategory.MUSIC, Float.MAX_VALUE, 1f
);
}

View File

@ -78,5 +78,6 @@ tasks {
opt.encoding("UTF-8")
opt.keyWords()
opt.addStringOption("-since", isRelease)
opt.noTimestamp()
}
}

View File

@ -43,6 +43,11 @@ public class Settings extends Config {
"Leave it off if you don't need it, it can spam your console."})
public static boolean DEBUG = true;
@Comment({"The activity of high-frequency event listener can be deactivated here to improve the server performance. ",
"Affected settings: 'redstone' settings here below. Affected flags: 'disable-physics', 'redstone'. ",
"Only deactivate this setting if you do not need any of the mentioned settings or flags."})
public static boolean HIGH_FREQUENCY_LISTENER = true;
@Create // This value will be generated automatically
public static ConfigBlock<Auto_Clear> AUTO_CLEAR = null;
// A ConfigBlock is a section that can have multiple instances e.g. multiple expiry tasks

View File

@ -24,7 +24,7 @@ import com.plotsquared.core.plot.Plot;
public class PlayerEnterPlotEvent extends PlotPlayerEvent {
/**
* Called when a player leaves a plot.
* PlayerEnterPlotEvent: Called when a player enters a plot
*
* @param player Player that entered the plot
* @param plot Plot that was entered

View File

@ -106,6 +106,10 @@ public class PlotListener {
iterator.remove();
continue;
}
// Don't attempt to heal dead players - they will get stuck in the abyss (#4406)
if (PlotSquared.platform().worldUtil().getHealth(player) <= 0) {
continue;
}
double level = PlotSquared.platform().worldUtil().getHealth(player);
if (level != value.max) {
PlotSquared.platform().worldUtil().setHealth(player, Math.min(level + value.amount, value.max));

View File

@ -643,35 +643,22 @@ public class Plot {
}
/**
* Gets a immutable set of owner UUIDs for a plot (supports multi-owner mega-plots).
* Gets an immutable set of owner UUIDs for a plot (supports multi-owner mega-plots).
* <p>
* This method cannot be used to add or remove owners from a plot.
* </p>
*
* @return Immutable view of plot owners
* @return Immutable set of plot owners
*/
public @NonNull Set<UUID> getOwners() {
if (this.getOwner() == null) {
return ImmutableSet.of();
}
if (isMerged()) {
Set<Plot> plots = getConnectedPlots();
Plot[] array = plots.toArray(new Plot[0]);
ImmutableSet.Builder<UUID> owners = ImmutableSet.builder();
UUID last = this.getOwner();
owners.add(this.getOwner());
for (final Plot current : array) {
if (current.getOwner() == null) {
continue;
}
if (last == null || current.getOwner().getMostSignificantBits() != last.getMostSignificantBits()) {
owners.add(current.getOwner());
last = current.getOwner();
}
ImmutableSet.Builder<UUID> owners = ImmutableSet.builder();
for (Plot plot : getConnectedPlots()) {
UUID owner = plot.getOwner();
if (owner != null) {
owners.add(owner);
}
return owners.build();
}
return ImmutableSet.of(this.getOwner());
return owners.build();
}
/**
@ -2574,7 +2561,7 @@ public class Plot {
*/
public void teleportPlayer(final PlotPlayer<?> player, TeleportCause cause, Consumer<Boolean> resultConsumer) {
Plot plot = this.getBasePlot(false);
if (!WorldUtil.isValidLocation(plot.getBottomAbs())) {
if ((getArea() == null || !(getArea() instanceof SinglePlotArea)) && !WorldUtil.isValidLocation(plot.getBottomAbs())) {
// prevent from teleporting into unsafe regions
player.sendMessage(TranslatableCaption.of("border.denied"));
resultConsumer.accept(false);

View File

@ -37,7 +37,7 @@ import java.util.List;
public class SinglePlotManager extends PlotManager {
private static final int MAX_COORDINATE = 30000000;
private static final int MAX_COORDINATE = 20000000;
public SinglePlotManager(final @NonNull PlotArea plotArea) {
super(plotArea);

View File

@ -22,7 +22,7 @@ plugins {
}
group = "com.intellectualsites.plotsquared"
version = "7.3.7"
version = "7.3.9-SNAPSHOT"
if (!File("$rootDir/.git").exists()) {
logger.lifecycle("""
@ -94,7 +94,7 @@ subprojects {
}
configurations.all {
attributes.attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 17)
attributes.attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 21)
}
spotless {
@ -118,7 +118,7 @@ subprojects {
}
signing {
if (!version.toString().endsWith("-SNAPSHOT")) {
if (!project.hasProperty("skip.signing") && !version.toString().endsWith("-SNAPSHOT")) {
val signingKey: String? by project
val signingPassword: String? by project
useInMemoryPgpKeys(signingKey, signingPassword)
@ -209,6 +209,11 @@ subprojects {
test {
useJUnitPlatform()
}
withType<AbstractArchiveTask>().configureEach {
isPreserveFileTimestamps = false
isReproducibleFileOrder = true
}
}
}

View File

@ -2,18 +2,18 @@
# Platform expectations
paper = "1.20.2-R0.1-SNAPSHOT"
guice = "7.0.0"
spotbugs = "4.8.3"
checkerqual = "3.42.0"
spotbugs = "4.8.5"
checkerqual = "3.43.0"
gson = "2.10"
guava = "31.1-jre"
snakeyaml = "2.0"
adventure = "4.16.0"
adventure = "4.17.0"
adventure-bukkit = "4.3.2"
log4j = "2.19.0"
# Plugins
worldedit = "7.2.20"
fawe = "2.9.1"
fawe = "2.10.0"
placeholderapi = "2.11.5"
luckperms = "5.4"
essentialsx = "2.20.1"
@ -23,21 +23,21 @@ mvdwapi = "3.1.1"
prtree = "2.0.1"
aopalliance = "1.0"
cloud-services = "1.8.4"
arkitektonika = "2.1.2"
arkitektonika = "2.1.3"
squirrelid = "0.3.2"
paster = "1.1.5"
paster = "1.1.6"
bstats = "3.0.2"
paperlib = "1.0.8"
informative-annotations = "1.4"
informative-annotations = "1.5"
vault = "1.7.1"
serverlib = "2.3.4"
serverlib = "2.3.6"
# Gradle plugins
shadow = "8.1.1"
grgit = "4.1.1"
spotless = "6.25.0"
nexus = "1.3.0"
runPaper = "2.2.3"
nexus = "2.0.0"
runPaper = "2.3.0"
[libraries]
# Platform expectations