Compare commits

...

18 Commits

Author SHA1 Message Date
6ad120b86f chore: re-add older minecart entity type names 2024-08-19 20:04:52 +02:00
99858c3275 fix: rename minecart EntityType enum constants 2024-08-10 21:32:45 +02:00
895cf0da66 Update dependency net.kyori:adventure-platform-bukkit to v4.3.4 2024-08-07 08:40:24 +00:00
05811d80ce Update gradle/actions action to v4 2024-08-04 02:17:13 +00:00
4de9967ef4 Update dependency org.checkerframework:checker-qual to v3.46.0 2024-08-01 21:51:46 +00:00
034bd866eb Update dependency gradle to v8.9 2024-07-11 16:49:23 +00:00
98aab56616 fix: use the correct block parser as the "default" (#4456) 2024-07-09 08:49:03 +02:00
8f980c726b chore: update bug report template 2024-07-07 09:25:43 +02:00
7f59c03f06 Update dependency org.checkerframework:checker-qual to v3.45.0 2024-07-01 21:09:39 +00:00
480a5925b6 Update fawe to v2.11.0 2024-06-30 12:51:53 +00:00
cee4493723 Update junit5 monorepo 2024-06-27 15:19:31 +00:00
b8ac1a22c1 Update dependency com.github.spotbugs:spotbugs-annotations to v4.8.6 2024-06-18 03:23:27 +00:00
67e69e3fc1 Fix sending multiple messages of notify-enter and notify-leave flag when joining from foreign worlds (#4433)
* Fixed IntellectualSites/PlotSquared#3424 by combining Teleport and WorldChange

* re-added WorldEdit permission check

* Changed conditions for calling plotEntry
2024-06-16 10:55:02 +02:00
670f5a802e fix: add null check for bukkit world ref (#4443) 2024-06-16 10:53:50 +02:00
c4bd6b6500 Update dependency org.checkerframework:checker-qual to v3.44.0 2024-06-04 01:07:17 +00:00
161e3ffdc7 Update dependency net.kyori:adventure-platform-bukkit to v4.3.3 2024-06-02 08:08:54 +00:00
be8f07c556 fix: use soft/weak references when caching bukkit/P2 worlds (#4439)
- Fixes #4435
2024-06-02 10:05:31 +02:00
215053e364 Ref: height limit check (#4427)
- The notifyIfOutsideBuildArea method checks the limits and already includes sending the height.height_limit message. This does not need to be called again in the code.
2024-06-01 16:43:43 +02:00
15 changed files with 69 additions and 91 deletions

View File

@ -24,13 +24,14 @@ body:
- type: dropdown
attributes:
label: Server Version
description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first.
description: Which server version are you using? If your server version is not listed, it is not supported. Update to a supported version first.
multiple: false
options:
- '1.21'
- '1.20.6'
- '1.20.4'
- '1.20'
- '1.19.4'
- '1.18.2'
validations:
required: true

View File

@ -11,7 +11,7 @@ jobs:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Validate Gradle Wrapper
uses: gradle/actions/wrapper-validation@v3
uses: gradle/actions/wrapper-validation@v4
- 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/actions/wrapper-validation@v3
uses: gradle/actions/wrapper-validation@v4
- name: Setup Java
uses: actions/setup-java@v4
with:

View File

@ -822,12 +822,18 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
// Temporarily classify as vehicle
case "MINECART":
case "MINECART_CHEST":
case "CHEST_MINECART":
case "MINECART_COMMAND":
case "COMMAND_BLOCK_MINECART":
case "MINECART_FURNACE":
case "FURNACE_MINECART":
case "MINECART_HOPPER":
case "HOPPER_MINECART":
case "MINECART_MOB_SPAWNER":
case "SPAWNER_MINECART":
case "ENDER_CRYSTAL":
case "MINECART_TNT":
case "TNT_MINECART":
case "CHEST_BOAT":
case "BOAT":
if (Settings.Enabled_Components.KILL_ROAD_VEHICLES) {

View File

@ -60,7 +60,6 @@ import com.plotsquared.core.util.task.TaskTime;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.world.block.BlockType;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.bukkit.Bukkit;
@ -164,13 +163,6 @@ public class BlockEventListener implements Listener {
if (plot != null) {
if (area.notifyIfOutsideBuildArea(pp, location.getY())) {
event.setCancelled(true);
pp.sendMessage(
TranslatableCaption.of("height.height_limit"),
TagResolver.builder()
.tag("minheight", Tag.inserting(Component.text(area.getMinBuildHeight())))
.tag("maxheight", Tag.inserting(Component.text(area.getMaxBuildHeight())))
.build()
);
return;
}
if (!plot.hasOwner()) {
@ -262,13 +254,6 @@ public class BlockEventListener implements Listener {
}
} else if (area.notifyIfOutsideBuildArea(plotPlayer, location.getY())) {
event.setCancelled(true);
plotPlayer.sendMessage(
TranslatableCaption.of("height.height_limit"),
TagResolver.builder()
.tag("minheight", Tag.inserting(Component.text(area.getMinBuildHeight())))
.tag("maxheight", Tag.inserting(Component.text(area.getMaxBuildHeight())))
.build()
);
return;
}
if (!plot.hasOwner()) {
@ -1224,18 +1209,9 @@ public class BlockEventListener implements Listener {
if (pp.hasPermission(Permission.PERMISSION_ADMIN_BUILD_HEIGHT_LIMIT)) {
continue;
}
if (currentLocation.getY() >= area.getMaxBuildHeight() || currentLocation.getY() < area.getMinBuildHeight()) {
pp.sendMessage(
TranslatableCaption.of("height.height_limit"),
TagResolver.builder()
.tag("minheight", Tag.inserting(Component.text(area.getMinBuildHeight())))
.tag("maxheight", Tag.inserting(Component.text(area.getMaxBuildHeight())))
.build()
);
if (area.notifyIfOutsideBuildArea(pp, currentLocation.getY())) {
event.setCancelled(true);
break;
}
if (area.notifyIfOutsideBuildArea(pp, currentLocation.getY())) {
event.setCancelled(true);
break;
}
}

View File

@ -533,9 +533,9 @@ public class PlayerEventListener implements Listener {
// to is identical to the plot's home location, and untrusted-visit is true
// i.e. untrusted-visit can override deny-teleport
// this is acceptable, because otherwise it wouldn't make sense to have both flags set
if (!result && !(plot.getFlag(UntrustedVisitFlag.class) && plot
.getHomeSynchronous()
.equals(BukkitUtil.adaptComplete(to)))) {
if (result || (plot.getFlag(UntrustedVisitFlag.class) && plot.getHomeSynchronous().equals(BukkitUtil.adaptComplete(to)))) {
plotListener.plotEntry(pp, plot);
} else {
pp.sendMessage(
TranslatableCaption.of("deny.no_enter"),
TagResolver.resolver("plot", Tag.inserting(Component.text(plot.toString())))
@ -548,6 +548,19 @@ public class PlayerEventListener implements Listener {
playerMove(event);
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onWorldChanged(PlayerChangedWorldEvent event) {
Player player = event.getPlayer();
BukkitPlayer pp = BukkitUtil.adapt(player);
if (this.worldEdit != null) {
if (!pp.hasPermission(Permission.PERMISSION_WORLDEDIT_BYPASS)) {
if (pp.getAttribute("worldedit")) {
pp.removeAttribute("worldedit");
}
}
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void vehicleMove(VehicleMoveEvent event)
throws IllegalAccessException {
@ -887,40 +900,6 @@ public class PlayerEventListener implements Listener {
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onWorldChanged(PlayerChangedWorldEvent event) {
Player player = event.getPlayer();
BukkitPlayer pp = BukkitUtil.adapt(player);
// Delete last location
Plot plot;
try (final MetaDataAccess<Plot> lastPlotAccess =
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
plot = lastPlotAccess.remove();
}
try (final MetaDataAccess<Location> lastLocationAccess =
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LOCATION)) {
lastLocationAccess.remove();
}
if (plot != null) {
plotListener.plotExit(pp, plot);
}
if (this.worldEdit != null) {
if (!pp.hasPermission(Permission.PERMISSION_WORLDEDIT_BYPASS)) {
if (pp.getAttribute("worldedit")) {
pp.removeAttribute("worldedit");
}
}
}
Location location = pp.getLocation();
PlotArea area = location.getPlotArea();
if (location.isPlotArea()) {
plot = location.getPlot();
if (plot != null) {
plotListener.plotEntry(pp, plot);
}
}
}
@SuppressWarnings("deprecation")
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onInventoryClick(InventoryClickEvent event) {

View File

@ -23,11 +23,15 @@ import com.plotsquared.core.location.World;
import org.bukkit.Bukkit;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.Map;
public class BukkitWorld implements World<org.bukkit.World> {
private static final Map<String, BukkitWorld> worldMap = Maps.newHashMap();
// Upon world unload we should probably have the P2 BukkitWorld be GCed relatively eagerly, thus freeing the bukkit world.
// We also want to avoid circumstances where a bukkit world has been GCed, but a P2 BukkitWorld has not
private static final Map<String, WeakReference<BukkitWorld>> worldMap = Maps.newHashMap();
private static final boolean HAS_MIN_Y;
static {
@ -41,10 +45,11 @@ public class BukkitWorld implements World<org.bukkit.World> {
HAS_MIN_Y = temp;
}
private final org.bukkit.World world;
// We want to allow GC to remove bukkit worlds, but not too eagerly
private final SoftReference<org.bukkit.World> world;
private BukkitWorld(final org.bukkit.World world) {
this.world = world;
this.world = new SoftReference<>(world);
}
/**
@ -68,12 +73,13 @@ public class BukkitWorld implements World<org.bukkit.World> {
* @return World instance
*/
public static @NonNull BukkitWorld of(final org.bukkit.World world) {
BukkitWorld bukkitWorld = worldMap.get(world.getName());
if (bukkitWorld != null && bukkitWorld.getPlatformWorld().equals(world)) {
WeakReference<BukkitWorld> bukkitWorldRef = worldMap.get(world.getName());
BukkitWorld bukkitWorld;
if (bukkitWorldRef != null && (bukkitWorld = bukkitWorldRef.get()) != null && world.equals(bukkitWorld.world.get())) {
return bukkitWorld;
}
bukkitWorld = new BukkitWorld(world);
worldMap.put(world.getName(), bukkitWorld);
worldMap.put(world.getName(), new WeakReference<>(bukkitWorld));
return bukkitWorld;
}
@ -97,22 +103,26 @@ public class BukkitWorld implements World<org.bukkit.World> {
@Override
public org.bukkit.World getPlatformWorld() {
return this.world;
org.bukkit.World world = this.world.get();
if (world == null) {
throw new IllegalStateException("Bukkit platform world was unloaded from memory");
}
return world;
}
@Override
public @NonNull String getName() {
return this.world.getName();
return this.getPlatformWorld().getName();
}
@Override
public int getMinHeight() {
return getMinWorldHeight(world);
return getMinWorldHeight(getPlatformWorld());
}
@Override
public int getMaxHeight() {
return getMaxWorldHeight(world) - 1;
return getMaxWorldHeight(getPlatformWorld()) - 1;
}
@Override

View File

@ -679,10 +679,8 @@ public abstract class PlotArea implements ComponentLike {
TranslatableCaption.of("height.height_limit"),
TagResolver.builder()
.tag("minheight", Tag.inserting(Component.text(minBuildHeight)))
.tag(
"maxheight",
Tag.inserting(Component.text(maxBuildHeight))
).build()
.tag("maxheight", Tag.inserting(Component.text(maxBuildHeight)))
.build()
);
// Return true if "failed" as the method will always be inverted otherwise
return true;

View File

@ -31,6 +31,8 @@ import com.sk89q.worldedit.world.registry.LegacyMapper;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.List;
/**
* {@link BlockState} related utility methods
*/
@ -43,7 +45,8 @@ public final class BlockUtil {
PARSER_CONTEXT.setRestricted(false);
PARSER_CONTEXT.setPreferringWildcard(false);
PARSER_CONTEXT.setTryLegacy(true);
PARSER = WorldEdit.getInstance().getBlockFactory().getParsers().get(0);
List<InputParser<BaseBlock>> parsers = WorldEdit.getInstance().getBlockFactory().getParsers();
PARSER = parsers.get(parsers.size() - 1); // Default parser is always at the end
}
private BlockUtil() {

View File

@ -79,8 +79,8 @@ subprojects {
dependencies {
// Tests
testImplementation("org.junit.jupiter:junit-jupiter:5.10.2")
testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.10.2")
testImplementation("org.junit.jupiter:junit-jupiter:5.10.3")
testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.10.3")
}
plugins.withId("java") {

View File

@ -2,18 +2,18 @@
# Platform expectations
paper = "1.20.2-R0.1-SNAPSHOT"
guice = "7.0.0"
spotbugs = "4.8.5"
checkerqual = "3.43.0"
spotbugs = "4.8.6"
checkerqual = "3.46.0"
gson = "2.10"
guava = "31.1-jre"
snakeyaml = "2.0"
adventure = "4.17.0"
adventure-bukkit = "4.3.2"
adventure-bukkit = "4.3.4"
log4j = "2.19.0"
# Plugins
worldedit = "7.2.20"
fawe = "2.10.0"
fawe = "2.11.0"
placeholderapi = "2.11.6"
luckperms = "5.4"
essentialsx = "2.20.1"

Binary file not shown.

View File

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

5
gradlew vendored
View File

@ -15,6 +15,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
#
##############################################################################
#
@ -84,7 +86,8 @@ done
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum

2
gradlew.bat vendored
View File

@ -13,6 +13,8 @@
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################