diff --git a/.github/stale.yml b/.github/stale.yml deleted file mode 100644 index 96a6248b7..000000000 --- a/.github/stale.yml +++ /dev/null @@ -1,16 +0,0 @@ -# Number of days of inactivity before an issue becomes stale -daysUntilStale: 60 -# Number of days of inactivity before a stale issue is closed -daysUntilClose: 7 -# Issues with these labels will never be considered stale -exemptLabels: - - [‼] high priority -# Label to use when marking an issue as stale -staleLabel: Old -# Comment to post when marking an issue as stale. Set to `false` to disable -markComment: > - This issue has been automatically marked as stale because it has not had - recent activity. It will be closed if no further activity occurs. Thank you - for your contributions. -# Comment to post when closing a stale issue. Set to `false` to disable -closeComment: false diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..5344ca758 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,20 @@ +name: "build" + +on: ["pull_request", "push"] + +jobs: + build: + strategy: + matrix: + java: ["1.8", "11"] + os: ["ubuntu-18.04"] + runs-on: "${{ matrix.os }}" + steps: + - name: "Checkout Repository" + uses: "actions/checkout@v2.3.4" + - name: "Setup JDK ${{ matrix.java }}" + uses: "actions/setup-java@v1.4.3" + with: + java-version: "${{ matrix.java }}" + - name: "Clean Build" + run: "./gradlew clean build" \ No newline at end of file diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml deleted file mode 100644 index 1f19a8e80..000000000 --- a/.github/workflows/gradle.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: Java CI - -on: - push: - branches: - - 'v5' - - 'v6' - pull_request: - branches: - - 'v5' - - 'v6' - -jobs: - test: - runs-on: ubuntu-18.04 - - steps: - - name: Checkout - uses: actions/checkout@v2.0.0 - - name: Setup Java JDK 1.8 - uses: actions/setup-java@v1.3.0 - with: - java-version: 1.8 - - name: Gradle Wrapper Validation - uses: gradle/wrapper-validation-action@v1 - - name: Test with Gradle - run: ./gradlew clean build diff --git a/.github/workflows/validate-gradle-wrapper.yml b/.github/workflows/validate-gradle-wrapper.yml new file mode 100644 index 000000000..e82749525 --- /dev/null +++ b/.github/workflows/validate-gradle-wrapper.yml @@ -0,0 +1,12 @@ +name: "validate gradle wrapper" + +on: ["pull_request", "push"] + +jobs: + build: + runs-on: "ubuntu-18.04" + steps: + - name: "Checkout Repository" + uses: "actions/checkout@v2.3.4" + - name: "Validate Gradle Wrapper" + uses: "gradle/wrapper-validation-action@v1.0.3" \ No newline at end of file diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener.java index bd0d61405..e84bf475a 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener.java @@ -187,17 +187,24 @@ public class BlockEventListener implements Listener { @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void onPhysicsEvent(BlockPhysicsEvent event) { + Block block = event.getBlock(); + Location location = BukkitUtil.getLocation(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; + } switch (event.getChangedType()) { case COMPARATOR: { - Block block = event.getBlock(); - Location location = BukkitUtil.getLocation(block.getLocation()); - if (location.isPlotArea()) { - return; - } - Plot plot = location.getOwnedPlotAbs(); - if (plot == null) { - return; - } if (!plot.getFlag(RedstoneFlag.class)) { event.setCancelled(true); plot.debug("Prevented comparator update because redstone = false"); @@ -211,16 +218,6 @@ public class BlockEventListener implements Listener { case TURTLE_EGG: case TURTLE_HELMET: case TURTLE_SPAWN_EGG: { - Block block = event.getBlock(); - Location location = BukkitUtil.getLocation(block.getLocation()); - PlotArea area = location.getPlotArea(); - if (area == null) { - return; - } - Plot plot = area.getOwnedPlotAbs(location); - if (plot == null) { - return; - } if (plot.getFlag(DisablePhysicsFlag.class)) { event.setCancelled(true); plot.debug("Prevented block physics because disable-physics = true"); @@ -229,21 +226,11 @@ public class BlockEventListener implements Listener { } default: if (Settings.Redstone.DETECT_INVALID_EDGE_PISTONS) { - Block block = event.getBlock(); switch (block.getType()) { case PISTON: case STICKY_PISTON: org.bukkit.block.data.Directional piston = (org.bukkit.block.data.Directional) block.getBlockData(); - Location location = BukkitUtil.getLocation(block.getLocation()); - PlotArea area = location.getPlotArea(); - if (area == null) { - return; - } - Plot plot = area.getOwnedPlotAbs(location); - if (plot == null) { - return; - } switch (piston.getFacing()) { case EAST: location.setX(location.getX() + 1); @@ -261,8 +248,7 @@ public class BlockEventListener implements Listener { Plot newPlot = area.getOwnedPlotAbs(location); if (!plot.equals(newPlot)) { event.setCancelled(true); - plot.debug( - "Prevented piston update because of invalid edge piston detection"); + plot.debug("Prevented piston update because of invalid edge piston detection"); return; } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntityEventListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntityEventListener.java index 342d4e6f0..7c43d8de1 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntityEventListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntityEventListener.java @@ -201,6 +201,9 @@ public class EntityEventListener implements Listener { if (plot == null || plot.getFlag(DisablePhysicsFlag.class)) { event.setCancelled(true); if (plot != null) { + if (block.getType().hasGravity()) { + BlockEventListener.sendBlockChange(block.getLocation(), block.getBlockData()); + } plot.debug("Falling block event was cancelled because disable-physics = true"); } return; diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java index c5bcfd8c9..996c5a2d8 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java @@ -85,6 +85,7 @@ import org.bukkit.block.BlockFace; import org.bukkit.block.data.Waterlogged; import org.bukkit.command.PluginCommand; import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Boat; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.HumanEntity; @@ -100,6 +101,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.entity.EntityPickupItemEvent; +import org.bukkit.event.entity.EntityPlaceEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.hanging.HangingPlaceEvent; @@ -1068,6 +1070,34 @@ public class PlayerEventListener extends PlotListener implements Listener { } } + // Boats can sometimes be placed on interactable blocks such as levers, + // see PS-175. Armor stands, minecarts and end crystals (the other entities + // supported by this event) don't have this issue. + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onBoatPlace(EntityPlaceEvent event) { + Player player = event.getPlayer(); + if (player == null) { + return; + } + Entity placed = event.getEntity(); + if (!(placed instanceof Boat)) { + return; + } + BukkitPlayer pp = BukkitUtil.getPlayer(player); + PlotArea area = pp.getPlotAreaAbs(); + if (area == null) { + return; + } + PlayerBlockEventType eventType = PlayerBlockEventType.PLACE_VEHICLE; + Block block = event.getBlock(); + BlockType blockType = BukkitAdapter.asBlockType(block.getType()); + Location location = BukkitUtil.getLocation(block.getLocation()); + if (!PlotSquared.get().getEventDispatcher() + .checkPlayerBlockEvent(pp, eventType, location, blockType, true)) { + event.setCancelled(true); + } + } + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onBucketEmpty(PlayerBucketEmptyEvent event) { BlockFace bf = event.getBlockFace(); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/managers/BukkitWorldManager.java b/Bukkit/src/main/java/com/plotsquared/bukkit/managers/BukkitWorldManager.java index 4646868a1..a1fbb6428 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/managers/BukkitWorldManager.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/managers/BukkitWorldManager.java @@ -62,7 +62,7 @@ public class BukkitWorldManager implements PlatformWorldManager { } protected void setGenerator(@Nullable final String worldName, @Nullable final String generator) { - if (generator == null) { + if (generator == null || worldName != null && worldName.contains(".")) { return; } File file = new File("bukkit.yml").getAbsoluteFile(); diff --git a/Core/src/main/java/com/plotsquared/core/command/Deny.java b/Core/src/main/java/com/plotsquared/core/command/Deny.java index e1b2536f1..858b3bf78 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Deny.java +++ b/Core/src/main/java/com/plotsquared/core/command/Deny.java @@ -95,7 +95,7 @@ public class Deny extends SubCommand { } plot.addDenied(uuidMapping.getUuid()); PlotSquared.get().getEventDispatcher().callDenied(player, plot, uuidMapping.getUuid(), true); - if (!uuidMapping.equals(DBFunc.EVERYONE)) { + if (!uuidMapping.getUuid().equals(DBFunc.EVERYONE)) { handleKick(PlotSquared.imp().getPlayerManager().getPlayerIfExists(uuidMapping.getUuid()), plot); } else { for (PlotPlayer plotPlayer : plot.getPlayersInPlot()) { diff --git a/Core/src/main/java/com/plotsquared/core/command/Owner.java b/Core/src/main/java/com/plotsquared/core/command/Owner.java index f19790dc5..42e2df5e8 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Owner.java +++ b/Core/src/main/java/com/plotsquared/core/command/Owner.java @@ -146,15 +146,7 @@ public class Owner extends SetCommand { } catch (Exception ignored) { } } else { - PlotSquared.get().getImpromptuUUIDPipeline().getSingle(value, (uuid, throwable) -> { - if (throwable instanceof TimeoutException) { - MainUtil.sendMessage(player, Captions.FETCHING_PLAYERS_TIMEOUT); - } else if (throwable != null) { - MainUtil.sendMessage(player, Captions.INVALID_PLAYER, value); - } else { - uuidConsumer.accept(uuid); - } - }); + PlotSquared.get().getImpromptuUUIDPipeline().getSingle(value, (uuid, throwable) -> uuidConsumer.accept(uuid)); } return true; } diff --git a/Core/src/main/java/com/plotsquared/core/util/SchematicHandler.java b/Core/src/main/java/com/plotsquared/core/util/SchematicHandler.java index 92b1b2ef4..987aa3fff 100644 --- a/Core/src/main/java/com/plotsquared/core/util/SchematicHandler.java +++ b/Core/src/main/java/com/plotsquared/core/util/SchematicHandler.java @@ -537,7 +537,7 @@ public abstract class SchematicHandler { schematic.put("Palette", new CompoundTag(paletteTag)); schematic.put("BlockData", new ByteArrayTag(buffer.toByteArray())); schematic - .put("TileEntities", new ListTag(CompoundTag.class, tileEntities)); + .put("BlockEntities", new ListTag(CompoundTag.class, tileEntities)); schematic.put("BiomePaletteMax", new IntTag(biomePalette.size())); @@ -602,8 +602,6 @@ public abstract class SchematicHandler { values.put(entry.getKey(), entry.getValue()); } - // Remove 'id' if it exists. We want 'Id' - values.remove("id"); // Positions are kept in NBT, we don't want that. values.remove("x"); @@ -612,6 +610,11 @@ public abstract class SchematicHandler { values.put("Id", new StringTag(block.getNbtId())); + + // Remove 'id' if it exists. We want 'Id'. + // Do this after we get "getNbtId" cos otherwise "getNbtId" doesn't work. + // Dum. + values.remove("id"); values.put("Pos", new IntArrayTag( new int[] {rx, ry, rz})); diff --git a/README.md b/README.md index a05b3ea21..1d8614201 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ is to provide a lag-free and smooth experience. * [Discord](https://discord.gg/KxkjDVg) * [Wiki](https://wiki.intellectualsites.com/plotsquared/home) * [Issues](https://issues.intellectualsites.com/projects/ps) +* [Translations](https://intellectualsites.crowdin.com/plotsquared/) ### Developer Resources * [API Documentation](https://wiki.intellectualsites.com/en/plotsquared/developer/development-portal)