This commit is contained in:
Telesphoreo 2020-12-15 09:37:54 -06:00
commit f9a49ee256
No known key found for this signature in database
GPG key ID: 50B67E055A6F167C
12 changed files with 92 additions and 88 deletions

16
.github/stale.yml vendored
View file

@ -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

20
.github/workflows/build.yml vendored Normal file
View file

@ -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"

View file

@ -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

View file

@ -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"

View file

@ -187,17 +187,24 @@ public class BlockEventListener implements Listener {
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onPhysicsEvent(BlockPhysicsEvent event) { public void onPhysicsEvent(BlockPhysicsEvent event) {
switch (event.getChangedType()) {
case COMPARATOR: {
Block block = event.getBlock(); Block block = event.getBlock();
Location location = BukkitUtil.getLocation(block.getLocation()); Location location = BukkitUtil.getLocation(block.getLocation());
if (location.isPlotArea()) { PlotArea area = location.getPlotArea();
if (area == null) {
return; return;
} }
Plot plot = location.getOwnedPlotAbs(); Plot plot = area.getOwnedPlotAbs(location);
if (plot == null) { if (plot == null) {
return; 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: {
if (!plot.getFlag(RedstoneFlag.class)) { if (!plot.getFlag(RedstoneFlag.class)) {
event.setCancelled(true); event.setCancelled(true);
plot.debug("Prevented comparator update because redstone = false"); plot.debug("Prevented comparator update because redstone = false");
@ -211,16 +218,6 @@ public class BlockEventListener implements Listener {
case TURTLE_EGG: case TURTLE_EGG:
case TURTLE_HELMET: case TURTLE_HELMET:
case TURTLE_SPAWN_EGG: { 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)) { if (plot.getFlag(DisablePhysicsFlag.class)) {
event.setCancelled(true); event.setCancelled(true);
plot.debug("Prevented block physics because disable-physics = true"); plot.debug("Prevented block physics because disable-physics = true");
@ -229,21 +226,11 @@ public class BlockEventListener implements Listener {
} }
default: default:
if (Settings.Redstone.DETECT_INVALID_EDGE_PISTONS) { if (Settings.Redstone.DETECT_INVALID_EDGE_PISTONS) {
Block block = event.getBlock();
switch (block.getType()) { switch (block.getType()) {
case PISTON: case PISTON:
case STICKY_PISTON: case STICKY_PISTON:
org.bukkit.block.data.Directional piston = org.bukkit.block.data.Directional piston =
(org.bukkit.block.data.Directional) block.getBlockData(); (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()) { switch (piston.getFacing()) {
case EAST: case EAST:
location.setX(location.getX() + 1); location.setX(location.getX() + 1);
@ -261,8 +248,7 @@ public class BlockEventListener implements Listener {
Plot newPlot = area.getOwnedPlotAbs(location); Plot newPlot = area.getOwnedPlotAbs(location);
if (!plot.equals(newPlot)) { if (!plot.equals(newPlot)) {
event.setCancelled(true); event.setCancelled(true);
plot.debug( plot.debug("Prevented piston update because of invalid edge piston detection");
"Prevented piston update because of invalid edge piston detection");
return; return;
} }
} }

View file

@ -201,6 +201,9 @@ public class EntityEventListener implements Listener {
if (plot == null || plot.getFlag(DisablePhysicsFlag.class)) { if (plot == null || plot.getFlag(DisablePhysicsFlag.class)) {
event.setCancelled(true); event.setCancelled(true);
if (plot != null) { if (plot != null) {
if (block.getType().hasGravity()) {
BlockEventListener.sendBlockChange(block.getLocation(), block.getBlockData());
}
plot.debug("Falling block event was cancelled because disable-physics = true"); plot.debug("Falling block event was cancelled because disable-physics = true");
} }
return; return;

View file

@ -85,6 +85,7 @@ import org.bukkit.block.BlockFace;
import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.Waterlogged;
import org.bukkit.command.PluginCommand; import org.bukkit.command.PluginCommand;
import org.bukkit.entity.ArmorStand; import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Boat;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.HumanEntity; import org.bukkit.entity.HumanEntity;
@ -100,6 +101,7 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.block.Action; import org.bukkit.event.block.Action;
import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.entity.EntityPickupItemEvent;
import org.bukkit.event.entity.EntityPlaceEvent;
import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent;
import org.bukkit.event.hanging.HangingPlaceEvent; 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) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBucketEmpty(PlayerBucketEmptyEvent event) { public void onBucketEmpty(PlayerBucketEmptyEvent event) {
BlockFace bf = event.getBlockFace(); BlockFace bf = event.getBlockFace();

View file

@ -62,7 +62,7 @@ public class BukkitWorldManager implements PlatformWorldManager<World> {
} }
protected void setGenerator(@Nullable final String worldName, @Nullable final String generator) { protected void setGenerator(@Nullable final String worldName, @Nullable final String generator) {
if (generator == null) { if (generator == null || worldName != null && worldName.contains(".")) {
return; return;
} }
File file = new File("bukkit.yml").getAbsoluteFile(); File file = new File("bukkit.yml").getAbsoluteFile();

View file

@ -95,7 +95,7 @@ public class Deny extends SubCommand {
} }
plot.addDenied(uuidMapping.getUuid()); plot.addDenied(uuidMapping.getUuid());
PlotSquared.get().getEventDispatcher().callDenied(player, plot, uuidMapping.getUuid(), true); 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); handleKick(PlotSquared.imp().getPlayerManager().getPlayerIfExists(uuidMapping.getUuid()), plot);
} else { } else {
for (PlotPlayer plotPlayer : plot.getPlayersInPlot()) { for (PlotPlayer plotPlayer : plot.getPlayersInPlot()) {

View file

@ -146,15 +146,7 @@ public class Owner extends SetCommand {
} catch (Exception ignored) { } catch (Exception ignored) {
} }
} else { } else {
PlotSquared.get().getImpromptuUUIDPipeline().getSingle(value, (uuid, throwable) -> { PlotSquared.get().getImpromptuUUIDPipeline().getSingle(value, (uuid, throwable) -> uuidConsumer.accept(uuid));
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);
}
});
} }
return true; return true;
} }

View file

@ -537,7 +537,7 @@ public abstract class SchematicHandler {
schematic.put("Palette", new CompoundTag(paletteTag)); schematic.put("Palette", new CompoundTag(paletteTag));
schematic.put("BlockData", new ByteArrayTag(buffer.toByteArray())); schematic.put("BlockData", new ByteArrayTag(buffer.toByteArray()));
schematic schematic
.put("TileEntities", new ListTag(CompoundTag.class, tileEntities)); .put("BlockEntities", new ListTag(CompoundTag.class, tileEntities));
schematic.put("BiomePaletteMax", new IntTag(biomePalette.size())); schematic.put("BiomePaletteMax", new IntTag(biomePalette.size()));
@ -602,8 +602,6 @@ public abstract class SchematicHandler {
values.put(entry.getKey(), values.put(entry.getKey(),
entry.getValue()); entry.getValue());
} }
// Remove 'id' if it exists. We want 'Id'
values.remove("id");
// Positions are kept in NBT, we don't want that. // Positions are kept in NBT, we don't want that.
values.remove("x"); values.remove("x");
@ -612,6 +610,11 @@ public abstract class SchematicHandler {
values.put("Id", values.put("Id",
new StringTag(block.getNbtId())); 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( values.put("Pos", new IntArrayTag(
new int[] {rx, ry, rz})); new int[] {rx, ry, rz}));

View file

@ -29,6 +29,7 @@ is to provide a lag-free and smooth experience.
* [Discord](https://discord.gg/KxkjDVg) * [Discord](https://discord.gg/KxkjDVg)
* [Wiki](https://wiki.intellectualsites.com/plotsquared/home) * [Wiki](https://wiki.intellectualsites.com/plotsquared/home)
* [Issues](https://issues.intellectualsites.com/projects/ps) * [Issues](https://issues.intellectualsites.com/projects/ps)
* [Translations](https://intellectualsites.crowdin.com/plotsquared/)
### Developer Resources ### Developer Resources
* [API Documentation](https://wiki.intellectualsites.com/en/plotsquared/developer/development-portal) * [API Documentation](https://wiki.intellectualsites.com/en/plotsquared/developer/development-portal)