Compare commits

..

1 Commits

Author SHA1 Message Date
576ee735a5 chore: Don't aggregate javadocs anymore 2022-06-02 18:06:55 +02:00
17 changed files with 291 additions and 315 deletions

View File

@ -27,12 +27,14 @@ body:
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 version you using? If your server version is not listed, it is not supported. Update to a supported version first.
multiple: false multiple: false
options: options:
- '1.19'
- '1.18.2' - '1.18.2'
- '1.18.1' - '1.18.1'
- '1.18' - '1.18'
- '1.17.1' - '1.17.1'
- '1.16.5' - '1.16.5'
- '1.15.2'
- '1.14.4'
- '1.13.2'
validations: validations:
required: true required: true

View File

@ -21,20 +21,20 @@ dependencies {
api(projects.plotSquaredCore) api(projects.plotSquaredCore)
// Metrics // Metrics
implementation("org.bstats:bstats-bukkit") implementation(libs.bstats)
// Paper // Paper
compileOnly(libs.paper) compileOnly(libs.paper)
implementation("io.papermc:paperlib") implementation(libs.paperlib)
// Plugins // Plugins
compileOnly(libs.worldeditBukkit) { compileOnly(libs.worldeditBukkit) {
exclude(group = "org.bukkit") exclude(group = "org.bukkit")
exclude(group = "org.spigotmc") exclude(group = "org.spigotmc")
} }
compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") { isTransitive = false } compileOnly(libs.fastasyncworldeditBukkit) { isTransitive = false }
testImplementation("com.fastasyncworldedit:FastAsyncWorldEdit-Bukkit") { isTransitive = false } testImplementation(libs.fastasyncworldeditBukkit) { isTransitive = false }
compileOnly("com.github.MilkBowl:VaultAPI") { compileOnly(libs.vault) {
exclude(group = "org.bukkit") exclude(group = "org.bukkit")
} }
compileOnly(libs.placeholderapi) compileOnly(libs.placeholderapi)
@ -44,15 +44,15 @@ dependencies {
// Other libraries // Other libraries
implementation(libs.squirrelid) { isTransitive = false } implementation(libs.squirrelid) { isTransitive = false }
implementation("dev.notmyfault.serverlib:ServerLib") implementation(libs.serverlib)
// Our libraries // Our libraries
implementation(libs.arkitektonika) implementation(libs.arkitektonika)
implementation(libs.http4j) implementation(libs.http4j)
implementation("com.intellectualsites.paster:Paster") implementation(libs.paster)
// Adventure // Adventure
implementation("net.kyori:adventure-platform-bukkit") implementation(libs.adventurePlatformBukkit)
} }
tasks.processResources { tasks.processResources {
@ -97,7 +97,7 @@ tasks.named<ShadowJar>("shadowJar") {
tasks { tasks {
withType<Javadoc> { withType<Javadoc> {
val opt = options as StandardJavadocDocletOptions val opt = options as StandardJavadocDocletOptions
opt.links("https://jd.papermc.io/paper/1.18/") opt.links("https://papermc.io/javadocs/paper/1.18/")
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString()) opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString())
opt.links("https://javadoc.io/doc/com.plotsquared/PlotSquared-Core/latest/") opt.links("https://javadoc.io/doc/com.plotsquared/PlotSquared-Core/latest/")
opt.links("https://jd.adventure.kyori.net/api/" + libs.adventure.get().versionConstraint.toString()) opt.links("https://jd.adventure.kyori.net/api/" + libs.adventure.get().versionConstraint.toString())

View File

@ -112,7 +112,30 @@ public class BukkitPlotGenerator extends ChunkGenerator
@Override @Override
public @NonNull List<BlockPopulator> getDefaultPopulators(@NonNull World world) { public @NonNull List<BlockPopulator> getDefaultPopulators(@NonNull World world) {
try { try {
checkLoaded(world); if (!this.loaded) {
String name = world.getName();
PlotSquared.get().loadWorld(name, this);
final Set<PlotArea> areas = this.plotAreaManager.getPlotAreasSet(name);
if (!areas.isEmpty()) {
PlotArea area = areas.iterator().next();
if (!area.isMobSpawning()) {
if (!area.isSpawnEggs()) {
world.setSpawnFlags(false, false);
}
world.setAmbientSpawnLimit(0);
world.setAnimalSpawnLimit(0);
world.setMonsterSpawnLimit(0);
world.setWaterAnimalSpawnLimit(0);
} else {
world.setSpawnFlags(true, true);
world.setAmbientSpawnLimit(-1);
world.setAnimalSpawnLimit(-1);
world.setMonsterSpawnLimit(-1);
world.setWaterAnimalSpawnLimit(-1);
}
}
this.loaded = true;
}
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -131,39 +154,6 @@ public class BukkitPlotGenerator extends ChunkGenerator
return toAdd; return toAdd;
} }
private synchronized void checkLoaded(@NonNull World world) {
// Do not attempt to load configurations until WorldEdit has a platform ready.
if (!PlotSquared.get().isWeInitialised()) {
return;
}
if (!this.loaded) {
String name = world.getName();
PlotSquared.get().loadWorld(name, this);
final Set<PlotArea> areas = this.plotAreaManager.getPlotAreasSet(name);
if (!areas.isEmpty()) {
PlotArea area = areas.iterator().next();
if (!area.isMobSpawning()) {
if (!area.isSpawnEggs()) {
world.setSpawnFlags(false, false);
}
setSpawnLimits(world, 0);
} else {
world.setSpawnFlags(true, true);
setSpawnLimits(world, -1);
}
}
this.loaded = true;
}
}
@SuppressWarnings("deprecation")
private void setSpawnLimits(@NonNull World world, int limit) {
world.setAmbientSpawnLimit(limit);
world.setAnimalSpawnLimit(limit);
world.setMonsterSpawnLimit(limit);
world.setWaterAnimalSpawnLimit(limit);
}
@Override @Override
public @NonNull ChunkData generateChunkData( public @NonNull ChunkData generateChunkData(
@NonNull World world, @NonNull Random random, int x, int z, @NonNull World world, @NonNull Random random, int x, int z,
@ -211,7 +201,9 @@ public class BukkitPlotGenerator extends ChunkGenerator
private void generate(BlockVector2 loc, World world, ScopedQueueCoordinator result) { private void generate(BlockVector2 loc, World world, ScopedQueueCoordinator result) {
// Load if improperly loaded // Load if improperly loaded
if (!this.loaded) { if (!this.loaded) {
checkLoaded(world); String name = world.getName();
PlotSquared.get().loadWorld(name, this);
this.loaded = true;
} }
// Process the chunk // Process the chunk
if (ChunkManager.preProcessChunk(loc, result)) { if (ChunkManager.preProcessChunk(loc, result)) {

View File

@ -72,7 +72,6 @@ import net.kyori.adventure.text.minimessage.Template;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState; import org.bukkit.block.BlockState;
@ -114,20 +113,11 @@ import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set;
import java.util.UUID; import java.util.UUID;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class BlockEventListener implements Listener { 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 final PlotAreaManager plotAreaManager; private final PlotAreaManager plotAreaManager;
private final WorldEdit worldEdit; private final WorldEdit worldEdit;
@ -233,31 +223,48 @@ public class BlockEventListener implements Listener {
plot.debug("Prevented block physics and resent block change because disable-physics = true"); plot.debug("Prevented block physics and resent block change because disable-physics = true");
return; return;
} }
if (event.getChangedType() == Material.COMPARATOR) { switch (event.getChangedType()) {
if (!plot.getFlag(RedstoneFlag.class)) { case COMPARATOR: {
event.setCancelled(true); if (!plot.getFlag(RedstoneFlag.class)) {
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)) {
event.setCancelled(true); event.setCancelled(true);
plot.debug("Prevented piston update because of invalid edge piston detection"); plot.debug("Prevented comparator update because redstone = false");
} }
return;
} }
case ANVIL:
case DRAGON_EGG:
case GRAVEL:
case SAND:
case TURTLE_EGG:
case TURTLE_HELMET:
case TURTLE_SPAWN_EGG: {
if (plot.getFlag(DisablePhysicsFlag.class)) {
event.setCancelled(true);
plot.debug("Prevented block physics because disable-physics = true");
}
return;
}
default:
if (Settings.Redstone.DETECT_INVALID_EDGE_PISTONS) {
switch (block.getType()) {
case PISTON, STICKY_PISTON -> {
org.bukkit.block.data.Directional piston = (org.bukkit.block.data.Directional) block.getBlockData();
switch (piston.getFacing()) {
case EAST -> location = location.add(1, 0, 0);
case SOUTH -> location = location.add(-1, 0, 0);
case WEST -> location = location.add(0, 0, 1);
case NORTH -> location = location.add(0, 0, -1);
}
Plot newPlot = area.getOwnedPlotAbs(location);
if (!plot.equals(newPlot)) {
event.setCancelled(true);
plot.debug("Prevented piston update because of invalid edge piston detection");
return;
}
}
}
}
break;
} }
} }
@ -544,22 +551,21 @@ public class BlockEventListener implements Listener {
if (plot == null) { if (plot == null) {
return; return;
} }
if (location.getY() >= area.getMaxBuildHeight() || location.getY() < area.getMinBuildHeight()) { switch (event.getNewState().getType()) {
event.setCancelled(true); case SNOW:
return; case SNOW_BLOCK:
} if (!plot.getFlag(SnowFormFlag.class)) {
if (Tag.SNOW.isTagged(event.getNewState().getType())) { plot.debug("Snow could not form because snow-form = false");
if (!plot.getFlag(SnowFormFlag.class)) { event.setCancelled(true);
plot.debug("Snow could not form because snow-form = false"); }
event.setCancelled(true); return;
} case ICE:
return; case FROSTED_ICE:
} case PACKED_ICE:
if (Tag.ICE.isTagged(event.getNewState().getType())) { if (!plot.getFlag(IceFormFlag.class)) {
if (!plot.getFlag(IceFormFlag.class)) { plot.debug("Ice could not form because ice-form = false");
plot.debug("Ice could not form because ice-form = false"); event.setCancelled(true);
event.setCancelled(true); }
}
} }
} }
@ -580,12 +586,18 @@ public class BlockEventListener implements Listener {
return; return;
} }
Class<? extends BooleanFlag<?>> flag; Class<? extends BooleanFlag<?>> flag;
if (Tag.SNOW.isTagged(event.getNewState().getType())) { switch (event.getNewState().getType()) {
flag = SnowFormFlag.class; case SNOW:
} else if (Tag.ICE.isTagged(event.getNewState().getType())) { case SNOW_BLOCK:
flag = IceFormFlag.class; flag = SnowFormFlag.class;
} else { break;
return; case ICE:
case FROSTED_ICE:
case PACKED_ICE:
flag = IceFormFlag.class;
break;
default:
return; // other blocks are ignored by this event
} }
boolean allowed = plot.getFlag(flag); boolean allowed = plot.getFlag(flag);
Entity entity = event.getEntity(); Entity entity = event.getEntity();
@ -689,98 +701,111 @@ public class BlockEventListener implements Listener {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
Material blockType = block.getType(); switch (block.getType()) {
if (Tag.ICE.isTagged(blockType)) { case ICE:
if (!plot.getFlag(IceMeltFlag.class)) { if (!plot.getFlag(IceMeltFlag.class)) {
plot.debug("Ice could not melt because ice-melt = false"); plot.debug("Ice could not melt because ice-melt = false");
event.setCancelled(true); event.setCancelled(true);
} }
return; break;
} case SNOW:
if (Tag.SNOW.isTagged(blockType)) { if (!plot.getFlag(SnowMeltFlag.class)) {
if (!plot.getFlag(SnowMeltFlag.class)) { plot.debug("Snow could not melt because snow-melt = false");
plot.debug("Snow could not melt because snow-melt = false"); event.setCancelled(true);
event.setCancelled(true); }
} break;
return; case FARMLAND:
} if (!plot.getFlag(SoilDryFlag.class)) {
if (blockType == Material.FARMLAND) { plot.debug("Soil could not dry because soil-dry = false");
if (!plot.getFlag(SoilDryFlag.class)) { event.setCancelled(true);
plot.debug("Soil could not dry because soil-dry = false"); }
event.setCancelled(true); break;
} case TUBE_CORAL_BLOCK:
return; case BRAIN_CORAL_BLOCK:
} case BUBBLE_CORAL_BLOCK:
if (Tag.CORAL_BLOCKS.isTagged(blockType) || Tag.CORALS.isTagged(blockType)) { case FIRE_CORAL_BLOCK:
if (!plot.getFlag(CoralDryFlag.class)) { case HORN_CORAL_BLOCK:
plot.debug("Coral could not dry because coral-dry = false"); case TUBE_CORAL:
event.setCancelled(true); case BRAIN_CORAL:
} case BUBBLE_CORAL:
case FIRE_CORAL:
case HORN_CORAL:
case TUBE_CORAL_FAN:
case BRAIN_CORAL_FAN:
case BUBBLE_CORAL_FAN:
case FIRE_CORAL_FAN:
case HORN_CORAL_FAN:
case BRAIN_CORAL_WALL_FAN:
case BUBBLE_CORAL_WALL_FAN:
case FIRE_CORAL_WALL_FAN:
case HORN_CORAL_WALL_FAN:
case TUBE_CORAL_WALL_FAN:
if (!plot.getFlag(CoralDryFlag.class)) {
plot.debug("Coral could not dry because coral-dry = false");
event.setCancelled(true);
}
break;
} }
} }
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onChange(BlockFromToEvent event) { public void onChange(BlockFromToEvent event) {
Block fromBlock = event.getBlock(); Block from = event.getBlock();
// Check liquid flow flag inside of origin plot too // Check liquid flow flag inside of origin plot too
final Location fromLocation = BukkitUtil.adapt(fromBlock.getLocation()); final Location fLocation = BukkitUtil.adapt(from.getLocation());
final PlotArea fromArea = fromLocation.getPlotArea(); final PlotArea fromArea = fLocation.getPlotArea();
if (fromArea != null) { if (fromArea != null) {
final Plot fromPlot = fromArea.getOwnedPlot(fromLocation); final Plot plot = fromArea.getOwnedPlot(fLocation);
if (fromPlot != null && fromPlot.getFlag(LiquidFlowFlag.class) == LiquidFlowFlag.FlowStatus.DISABLED && event if (plot != null && plot.getFlag(LiquidFlowFlag.class) == LiquidFlowFlag.FlowStatus.DISABLED && event
.getBlock() .getBlock()
.isLiquid()) { .isLiquid()) {
fromPlot.debug("Liquid could not flow because liquid-flow = disabled"); plot.debug("Liquid could not flow because liquid-flow = disabled");
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
} }
Block toBlock = event.getToBlock(); Block to = event.getToBlock();
Location toLocation = BukkitUtil.adapt(toBlock.getLocation()); Location tLocation = BukkitUtil.adapt(to.getLocation());
PlotArea toArea = toLocation.getPlotArea(); PlotArea area = tLocation.getPlotArea();
if (toArea == null) { if (area == null) {
if (fromBlock.getType() == Material.DRAGON_EGG && fromArea != null) { if (from.getType() == Material.DRAGON_EGG && fromArea != null) {
event.setCancelled(true); event.setCancelled(true);
} }
return; return;
} }
if (toLocation.getY() >= toArea.getMaxBuildHeight() || toLocation.getY() < toArea.getMinBuildHeight()) { Plot plot = area.getOwnedPlot(tLocation);
event.setCancelled(true);
return;
}
Plot toPlot = toArea.getOwnedPlot(toLocation);
if (fromBlock.getType() == Material.DRAGON_EGG && fromArea != null) { if (from.getType() == Material.DRAGON_EGG && fromArea != null) {
final Plot fromPlot = fromArea.getOwnedPlot(fromLocation); final Plot fromPlot = fromArea.getOwnedPlot(fLocation);
if (fromPlot != null || toPlot != null) { if (fromPlot != null || plot != null) {
if ((fromPlot == null || !fromPlot.equals(toPlot)) && (toPlot == null || !toPlot.equals(fromPlot))) { if ((fromPlot == null || !fromPlot.equals(plot)) && (plot == null || !plot.equals(fromPlot))) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
} }
} }
if (toPlot != null) { if (plot != null) {
if (!toArea.contains(fromLocation.getX(), fromLocation.getZ()) || !Objects.equals(toPlot, toArea.getOwnedPlot(fromLocation))) { if (!area.contains(fLocation.getX(), fLocation.getZ()) || !Objects.equals(plot, area.getOwnedPlot(fLocation))) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if (toPlot.getFlag(LiquidFlowFlag.class) == LiquidFlowFlag.FlowStatus.ENABLED && event.getBlock().isLiquid()) { if (plot.getFlag(LiquidFlowFlag.class) == LiquidFlowFlag.FlowStatus.ENABLED && event.getBlock().isLiquid()) {
return; return;
} }
if (toPlot.getFlag(DisablePhysicsFlag.class)) { if (plot.getFlag(DisablePhysicsFlag.class)) {
toPlot.debug(event.getBlock().getType() + " could not update because disable-physics = true"); plot.debug(event.getBlock().getType() + " could not update because disable-physics = true");
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if (toPlot.getFlag(LiquidFlowFlag.class) == LiquidFlowFlag.FlowStatus.DISABLED && event.getBlock().isLiquid()) { if (plot.getFlag(LiquidFlowFlag.class) == LiquidFlowFlag.FlowStatus.DISABLED && event.getBlock().isLiquid()) {
toPlot.debug("Liquid could not flow because liquid-flow = disabled"); plot.debug("Liquid could not flow because liquid-flow = disabled");
event.setCancelled(true); event.setCancelled(true);
} }
} else if (!toArea.contains(fromLocation.getX(), fromLocation.getZ()) || !Objects.equals(null, toArea.getOwnedPlot(fromLocation))) { } else if (!area.contains(fLocation.getX(), fLocation.getZ()) || !Objects.equals(null, area.getOwnedPlot(fLocation))) {
event.setCancelled(true); event.setCancelled(true);
} else if (event.getBlock().isLiquid()) { } else if (event.getBlock().isLiquid()) {
final org.bukkit.Location location = event.getBlock().getLocation(); final org.bukkit.Location location = event.getBlock().getLocation();

View File

@ -33,7 +33,6 @@ 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 org.bukkit.Material;
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;
@ -47,31 +46,11 @@ import org.bukkit.event.block.BlockReceiveGameEvent;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set;
import java.util.UUID; import java.util.UUID;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class BlockEventListener117 implements Listener { public class BlockEventListener117 implements Listener {
private static final Set<Material> COPPER_OXIDIZING = Set.of(
Material.COPPER_BLOCK,
Material.EXPOSED_COPPER,
Material.WEATHERED_COPPER,
Material.OXIDIZED_COPPER,
Material.CUT_COPPER,
Material.EXPOSED_CUT_COPPER,
Material.WEATHERED_CUT_COPPER,
Material.OXIDIZED_CUT_COPPER,
Material.CUT_COPPER_STAIRS,
Material.EXPOSED_CUT_COPPER_STAIRS,
Material.WEATHERED_CUT_COPPER_STAIRS,
Material.OXIDIZED_CUT_COPPER_STAIRS,
Material.CUT_COPPER_SLAB,
Material.EXPOSED_CUT_COPPER_SLAB,
Material.WEATHERED_CUT_COPPER_SLAB,
Material.OXIDIZED_CUT_COPPER_SLAB
);
@Inject @Inject
public BlockEventListener117() { public BlockEventListener117() {
} }
@ -176,11 +155,27 @@ public class BlockEventListener117 implements Listener {
if (plot == null) { if (plot == null) {
return; return;
} }
if (COPPER_OXIDIZING.contains(event.getNewState().getType())) { switch (event.getNewState().getType()) {
if (!plot.getFlag(CopperOxideFlag.class)) { case COPPER_BLOCK:
plot.debug("Copper could not oxide because copper-oxide = false"); case EXPOSED_COPPER:
event.setCancelled(true); case WEATHERED_COPPER:
} case OXIDIZED_COPPER:
case CUT_COPPER:
case EXPOSED_CUT_COPPER:
case WEATHERED_CUT_COPPER:
case OXIDIZED_CUT_COPPER:
case CUT_COPPER_STAIRS:
case EXPOSED_CUT_COPPER_STAIRS:
case WEATHERED_CUT_COPPER_STAIRS:
case OXIDIZED_CUT_COPPER_STAIRS:
case CUT_COPPER_SLAB:
case EXPOSED_CUT_COPPER_SLAB:
case WEATHERED_CUT_COPPER_SLAB:
case OXIDIZED_CUT_COPPER_SLAB:
if (!plot.getFlag(CopperOxideFlag.class)) {
plot.debug("Copper could not oxide because copper-oxide = false");
event.setCancelled(true);
}
} }
} }

View File

@ -208,7 +208,7 @@ public class EntityEventListener implements Listener {
} }
return; return;
} }
if (BukkitEntityUtil.checkEntity(entity, plot.getBasePlot(false))) { if (BukkitEntityUtil.checkEntity(entity, plot)) {
event.setCancelled(true); event.setCancelled(true);
} }
} }

View File

@ -131,17 +131,17 @@ public class EntitySpawnListener implements Listener {
return; return;
} }
Plot plot = location.getOwnedPlotAbs(); Plot plot = location.getOwnedPlotAbs();
EntityType type = entity.getType();
if (plot == null) { if (plot == null) {
EntityType type = entity.getType();
if (!area.isMobSpawning()) { if (!area.isMobSpawning()) {
if (type == EntityType.PLAYER) { switch (type) {
return; case DROPPED_ITEM:
} if (Settings.Enabled_Components.KILL_ROAD_ITEMS) {
if (type == EntityType.DROPPED_ITEM) { event.setCancelled(true);
if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { return;
event.setCancelled(true); }
} case PLAYER:
return; return;
} }
if (type.isAlive()) { if (type.isAlive()) {
event.setCancelled(true); event.setCancelled(true);
@ -155,16 +155,15 @@ public class EntitySpawnListener implements Listener {
if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) {
event.setCancelled(true); event.setCancelled(true);
} }
if (type == EntityType.ENDER_CRYSTAL) { switch (entity.getType()) {
if (BukkitEntityUtil.checkEntity(entity, plot)) { case ENDER_CRYSTAL:
event.setCancelled(true); if (BukkitEntityUtil.checkEntity(entity, plot)) {
} event.setCancelled(true);
return; }
} case SHULKER:
if (type == EntityType.SHULKER) { if (!entity.hasMetadata("shulkerPlot")) {
if (!entity.hasMetadata("shulkerPlot")) { entity.setMetadata("shulkerPlot", new FixedMetadataValue((Plugin) PlotSquared.platform(), plot.getId()));
entity.setMetadata("shulkerPlot", new FixedMetadataValue((Plugin) PlotSquared.platform(), plot.getId())); }
}
} }
} }

View File

@ -237,15 +237,15 @@ public class PaperListener implements Listener {
if (plot == null) { if (plot == null) {
EntityType type = event.getType(); EntityType type = event.getType();
if (!area.isMobSpawning()) { if (!area.isMobSpawning()) {
if (type == EntityType.PLAYER) { switch (type) {
return; case DROPPED_ITEM:
} if (Settings.Enabled_Components.KILL_ROAD_ITEMS) {
if (type == EntityType.DROPPED_ITEM) { event.setShouldAbortSpawn(true);
if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { event.setCancelled(true);
event.setShouldAbortSpawn(true); return;
event.setCancelled(true); }
} case PLAYER:
return; return;
} }
if (type.isAlive()) { if (type.isAlive()) {
event.setShouldAbortSpawn(true); event.setShouldAbortSpawn(true);

View File

@ -89,7 +89,6 @@ import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.FluidCollisionMode; import org.bukkit.FluidCollisionMode;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState; import org.bukkit.block.BlockState;
@ -167,20 +166,6 @@ import java.util.regex.Pattern;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public class PlayerEventListener extends PlotListener implements Listener { public class PlayerEventListener extends PlotListener implements Listener {
private static final Set<Material> MINECARTS = Set.of(
Material.MINECART,
Material.TNT_MINECART,
Material.CHEST_MINECART,
Material.COMMAND_BLOCK_MINECART,
Material.FURNACE_MINECART,
Material.HOPPER_MINECART
);
private static final Set<Material> BOOKS = Set.of(
Material.BOOK,
Material.KNOWLEDGE_BOOK,
Material.WRITABLE_BOOK,
Material.WRITTEN_BOOK
);
private final EventDispatcher eventDispatcher; private final EventDispatcher eventDispatcher;
private final WorldEdit worldEdit; private final WorldEdit worldEdit;
private final PlotAreaManager plotAreaManager; private final PlotAreaManager plotAreaManager;
@ -852,10 +837,10 @@ public class PlayerEventListener extends PlotListener implements Listener {
if ((slot > 8) || !event.getEventName().equals("InventoryCreativeEvent")) { if ((slot > 8) || !event.getEventName().equals("InventoryCreativeEvent")) {
return; return;
} }
ItemStack oldItem = inv.getItemInHand(); ItemStack current = inv.getItemInHand();
ItemMeta oldMeta = oldItem.getItemMeta();
ItemStack newItem = event.getCursor(); ItemStack newItem = event.getCursor();
ItemMeta newMeta = newItem.getItemMeta(); ItemMeta newMeta = newItem.getItemMeta();
ItemMeta oldMeta = newItem.getItemMeta();
if (event.getClick() == ClickType.CREATIVE) { if (event.getClick() == ClickType.CREATIVE) {
final Plot plot = pp.getCurrentPlot(); final Plot plot = pp.getCurrentPlot();
@ -895,26 +880,34 @@ public class PlayerEventListener extends PlotListener implements Listener {
oldLore = lore.toString(); oldLore = lore.toString();
} }
} }
Material itemType = newItem.getType(); if (!"[(+NBT)]".equals(newLore) || (current.equals(newItem) && newLore.equals(oldLore))) {
if (!"[(+NBT)]".equals(newLore) || (oldItem.equals(newItem) && newLore.equals(oldLore))) { switch (newItem.getType()) {
if (newMeta == null || (itemType != Material.LEGACY_BANNER && itemType != Material.PLAYER_HEAD)) { case LEGACY_BANNER:
return; case PLAYER_HEAD:
if (newMeta != null) {
break;
}
default:
return;
} }
} }
Block block = player.getTargetBlock(null, 7); Block block = player.getTargetBlock(null, 7);
org.bukkit.block.BlockState state = block.getState(); org.bukkit.block.BlockState state = block.getState();
Material stateType = state.getType(); Material stateType = state.getType();
Material itemType = newItem.getType();
if (stateType != itemType) { if (stateType != itemType) {
if (stateType == Material.LEGACY_WALL_BANNER || stateType == Material.LEGACY_STANDING_BANNER) { switch (stateType) {
if (itemType != Material.LEGACY_BANNER) { case LEGACY_STANDING_BANNER:
case LEGACY_WALL_BANNER:
if (itemType == Material.LEGACY_BANNER) {
break;
}
case LEGACY_SKULL:
if (itemType == Material.LEGACY_SKULL_ITEM) {
break;
}
default:
return; return;
}
} else if (stateType == Material.LEGACY_SKULL) {
if (itemType != Material.LEGACY_SKULL_ITEM) {
return;
}
} else {
return;
} }
} }
Location location = BukkitUtil.adapt(state.getLocation()); Location location = BukkitUtil.adapt(state.getLocation());
@ -953,7 +946,7 @@ public class PlayerEventListener extends PlotListener implements Listener {
} }
} }
if (cancelled) { if (cancelled) {
if ((oldItem.getType() == newItem.getType()) && (oldItem.getDurability() == newItem if ((current.getType() == newItem.getType()) && (current.getDurability() == newItem
.getDurability())) { .getDurability())) {
event.setCursor( event.setCursor(
new ItemStack(newItem.getType(), newItem.getAmount(), newItem.getDurability())); new ItemStack(newItem.getType(), newItem.getAmount(), newItem.getDurability()));
@ -1140,21 +1133,14 @@ public class PlayerEventListener extends PlotListener implements Listener {
//Allow all players to eat while also allowing the block place event ot be fired //Allow all players to eat while also allowing the block place event ot be fired
return; return;
} }
if (type == Material.ARMOR_STAND) { switch (type) {
location = BukkitUtil.adapt(block.getRelative(event.getBlockFace()).getLocation()); case ACACIA_BOAT, BIRCH_BOAT, CHEST_MINECART, COMMAND_BLOCK_MINECART, DARK_OAK_BOAT, FURNACE_MINECART, HOPPER_MINECART, JUNGLE_BOAT, MINECART, OAK_BOAT, SPRUCE_BOAT, TNT_MINECART -> eventType = PlayerBlockEventType.PLACE_VEHICLE;
eventType = PlayerBlockEventType.PLACE_MISC; case FIREWORK_ROCKET, FIREWORK_STAR -> eventType = PlayerBlockEventType.SPAWN_MOB;
} case BOOK, KNOWLEDGE_BOOK, WRITABLE_BOOK, WRITTEN_BOOK -> eventType = PlayerBlockEventType.READ;
if (Tag.ITEMS_BOATS.isTagged(type) || MINECARTS.contains(type)) { case ARMOR_STAND -> {
eventType = PlayerBlockEventType.PLACE_VEHICLE; location = BukkitUtil.adapt(block.getRelative(event.getBlockFace()).getLocation());
break; eventType = PlayerBlockEventType.PLACE_MISC;
} }
if (type == Material.FIREWORK_ROCKET || type == Material.FIREWORK_STAR) {
eventType = PlayerBlockEventType.SPAWN_MOB;
break;
}
if (BOOKS.contains(type)) {
eventType = PlayerBlockEventType.READ;
break;
} }
break; break;
} }

View File

@ -55,7 +55,7 @@ further defined and clarified by project maintainers.
## Enforcement ## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at contact@intellectualsites.com. All reported by contacting the project team at contact@alexander-soderberg.com. All
complaints will be reviewed and investigated and will result in a response that complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident. obligated to maintain confidentiality with regard to the reporter of an incident.

View File

@ -2,18 +2,18 @@ import java.time.format.DateTimeFormatter
dependencies { dependencies {
// Expected everywhere. // Expected everywhere.
compileOnlyApi("org.checkerframework:checker-qual") compileOnlyApi(libs.checkerqual)
// Minecraft expectations // Minecraft expectations
compileOnlyApi("com.google.code.gson:gson") compileOnlyApi(libs.gson)
compileOnly("com.google.guava:guava") compileOnly(libs.guava)
// Platform expectations // Platform expectations
compileOnlyApi("org.yaml:snakeyaml") compileOnlyApi(libs.snakeyaml)
// Adventure // Adventure
api("net.kyori:adventure-api") api(libs.adventure)
api("net.kyori:adventure-text-minimessage") api(libs.minimessage)
// Guice // Guice
api(libs.guice) { api(libs.guice) {
@ -31,18 +31,18 @@ dependencies {
exclude(group = "dummypermscompat") exclude(group = "dummypermscompat")
} }
testImplementation(libs.worldeditCore) testImplementation(libs.worldeditCore)
compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Core") { isTransitive = false } compileOnly(libs.fastasyncworldeditCore) { isTransitive = false }
testImplementation("com.fastasyncworldedit:FastAsyncWorldEdit-Core") { isTransitive = false } testImplementation(libs.fastasyncworldeditCore) { isTransitive = false }
// Logging // Logging
compileOnlyApi("org.apache.logging.log4j:log4j-api") compileOnlyApi(libs.log4j)
// Other libraries // Other libraries
api(libs.prtree) api(libs.prtree)
api(libs.aopalliance) api(libs.aopalliance)
api(libs.cloudServices) api(libs.cloudServices)
api(libs.arkitektonika) api(libs.arkitektonika)
api("com.intellectualsites.paster:Paster") api(libs.paster)
} }
tasks.processResources { tasks.processResources {

View File

@ -72,10 +72,7 @@ import com.plotsquared.core.util.ReflectionUtils;
import com.plotsquared.core.util.task.TaskManager; import com.plotsquared.core.util.task.TaskManager;
import com.plotsquared.core.uuid.UUIDPipeline; import com.plotsquared.core.uuid.UUIDPipeline;
import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.event.platform.PlatformReadyEvent;
import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.util.eventbus.EventHandler;
import com.sk89q.worldedit.util.eventbus.Subscribe;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
@ -156,8 +153,6 @@ public class PlotSquared {
private EventDispatcher eventDispatcher; private EventDispatcher eventDispatcher;
private PlotListener plotListener; private PlotListener plotListener;
private boolean weInitialised;
/** /**
* Initialize PlotSquared with the desired Implementation class. * Initialize PlotSquared with the desired Implementation class.
* *
@ -228,7 +223,6 @@ public class PlotSquared {
} }
this.worldedit = WorldEdit.getInstance(); this.worldedit = WorldEdit.getInstance();
WorldEdit.getInstance().getEventBus().register(new WEPlatformReadyListener());
// Create Event utility class // Create Event utility class
this.eventDispatcher = new EventDispatcher(this.worldedit); this.eventDispatcher = new EventDispatcher(this.worldedit);
@ -1580,13 +1574,6 @@ public class PlotSquared {
return this.plotListener; return this.plotListener;
} }
/**
* Get if the {@link PlatformReadyEvent} has been sent by WE. There is no way to query this within WE itself.
*/
public boolean isWeInitialised() {
return weInitialised;
}
/** /**
* Different ways of sorting {@link Plot plots} * Different ways of sorting {@link Plot plots}
*/ */
@ -1609,15 +1596,4 @@ public class PlotSquared {
DISTANCE_FROM_ORIGIN DISTANCE_FROM_ORIGIN
} }
private final class WEPlatformReadyListener {
@SuppressWarnings("unused")
@Subscribe(priority = EventHandler.Priority.VERY_EARLY)
public void onPlatformReady(PlatformReadyEvent event) {
weInitialised = true;
WorldEdit.getInstance().getEventBus().unregister(WEPlatformReadyListener.this);
}
}
} }

View File

@ -53,15 +53,9 @@ public abstract class IndependentPlotGenerator {
* *
* @param result queue * @param result queue
* @param settings PlotArea (settings) * @param settings PlotArea (settings)
* @deprecated {@link ScopedQueueCoordinator} will be renamed in v7.
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public abstract void generateChunk(ScopedQueueCoordinator result, PlotArea settings); public abstract void generateChunk(ScopedQueueCoordinator result, PlotArea settings);
/**
* @deprecated {@link ScopedQueueCoordinator} will be renamed in v7.
*/
@Deprecated(forRemoval = true, since = "TODO")
public boolean populateChunk(ScopedQueueCoordinator result, PlotArea setting) { public boolean populateChunk(ScopedQueueCoordinator result, PlotArea setting) {
return false; return false;
} }

View File

@ -93,9 +93,7 @@ public abstract class QueueCoordinator {
* @param z chunk z coordinate * @param z chunk z coordinate
* @return a new {@link ScopedQueueCoordinator} * @return a new {@link ScopedQueueCoordinator}
* @since 6.6.0 * @since 6.6.0
* @deprecated {@link ScopedQueueCoordinator} will be renamed in v7.
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public ScopedQueueCoordinator getForChunk(int x, int z, int minY, int maxY) { public ScopedQueueCoordinator getForChunk(int x, int z, int minY, int maxY) {
int bx = x << 4; int bx = x << 4;
int bz = z << 4; int bz = z << 4;

View File

@ -42,10 +42,6 @@ public abstract class ChunkManager {
private static final Map<BlockVector2, RunnableVal<ScopedQueueCoordinator>> forceChunks = new ConcurrentHashMap<>(); private static final Map<BlockVector2, RunnableVal<ScopedQueueCoordinator>> forceChunks = new ConcurrentHashMap<>();
private static final Map<BlockVector2, RunnableVal<ScopedQueueCoordinator>> addChunks = new ConcurrentHashMap<>(); private static final Map<BlockVector2, RunnableVal<ScopedQueueCoordinator>> addChunks = new ConcurrentHashMap<>();
/**
* @deprecated {@link ScopedQueueCoordinator} will be renamed in v7.
*/
@Deprecated(forRemoval = true, since = "TODO")
public static void setChunkInPlotArea( public static void setChunkInPlotArea(
RunnableVal<ScopedQueueCoordinator> force, RunnableVal<ScopedQueueCoordinator> force,
RunnableVal<ScopedQueueCoordinator> add, RunnableVal<ScopedQueueCoordinator> add,
@ -83,10 +79,6 @@ public abstract class ChunkManager {
} }
} }
/**
* @deprecated {@link ScopedQueueCoordinator} will be renamed in v7.
*/
@Deprecated(forRemoval = true, since = "TODO")
public static boolean preProcessChunk(BlockVector2 loc, ScopedQueueCoordinator queue) { public static boolean preProcessChunk(BlockVector2 loc, ScopedQueueCoordinator queue) {
final RunnableVal<ScopedQueueCoordinator> forceChunk = forceChunks.get(loc); final RunnableVal<ScopedQueueCoordinator> forceChunk = forceChunks.get(loc);
if (forceChunk != null) { if (forceChunk != null) {
@ -97,10 +89,6 @@ public abstract class ChunkManager {
return false; return false;
} }
/**
* @deprecated {@link ScopedQueueCoordinator} will be renamed in v7.
*/
@Deprecated(forRemoval = true, since = "TODO")
public static boolean postProcessChunk(BlockVector2 loc, ScopedQueueCoordinator queue) { public static boolean postProcessChunk(BlockVector2 loc, ScopedQueueCoordinator queue) {
final RunnableVal<ScopedQueueCoordinator> addChunk = forceChunks.get(loc); final RunnableVal<ScopedQueueCoordinator> addChunk = forceChunks.get(loc);
if (addChunk != null) { if (addChunk != null) {

View File

@ -34,7 +34,7 @@ allprojects {
maven { maven {
name = "Sonatype OSS (S01)" name = "Sonatype OSS (S01)"
url = uri("https://s01.oss.sonatype.org/content/repositories/snapshots/") url = uri("https://s01.oss.sonatype.org/content/repositories/snapshots")
} }
maven { maven {
@ -64,10 +64,6 @@ subprojects {
plugin<EclipsePlugin>() plugin<EclipsePlugin>()
plugin<IdeaPlugin>() plugin<IdeaPlugin>()
} }
dependencies {
implementation(platform("com.intellectualsites.bom:bom-1.18.x:1.2"))
}
} }
allprojects { allprojects {

View File

@ -1,9 +1,15 @@
[versions] [versions]
# Minecraft expectations
gson = "2.8.8" # Version set by Minecraft
log4j-api = "2.17.1" # Version set by Minecraft
guava = "31.0.1-jre" # Version set by Minecraft
# Platform expectations # Platform expectations
paper = "1.18.1-R0.1-SNAPSHOT" paper = "1.18.1-R0.1-SNAPSHOT"
checker-qual = "3.22.0" checker-qual = "3.22.0"
guice = "5.1.0" guice = "5.1.0"
spotbugs = "4.7.0" spotbugs = "4.7.0"
snakeyaml = "1.30" # Version set by Bukkit
# Adventure & MiniMessage # Adventure & MiniMessage
adventure-api = "4.9.3" adventure-api = "4.9.3"
@ -12,6 +18,8 @@ adventure-platform-bukkit = "4.0.1"
# Plugins # Plugins
worldedit = "7.2.10" worldedit = "7.2.10"
fawe = "2.2.0"
vault = "1.7.1"
placeholderapi = "2.11.1" placeholderapi = "2.11.1"
luckperms = "5.4" luckperms = "5.4"
essentialsx = "2.19.4" essentialsx = "2.19.4"
@ -22,7 +30,11 @@ prtree = "2.0.0"
aopalliance = "1.0" aopalliance = "1.0"
cloud-services = "1.6.2" cloud-services = "1.6.2"
arkitektonika = "2.1.1" arkitektonika = "2.1.1"
paster = "1.1.4"
bstats = "3.0.0"
paperlib = "1.0.7"
squirrelid = "0.3.1" squirrelid = "0.3.1"
serverlib = "2.3.1"
http4j = "1.3" http4j = "1.3"
# Gradle plugins # Gradle plugins
@ -36,7 +48,12 @@ nexus = "1.1.0"
paper = { group = "io.papermc.paper", name = "paper-api", version.ref = "paper" } paper = { group = "io.papermc.paper", name = "paper-api", version.ref = "paper" }
checkerqual = { group = "org.checkerframework", name = "checker-qual", version.ref = "checker-qual" } checkerqual = { group = "org.checkerframework", name = "checker-qual", version.ref = "checker-qual" }
# Minecraft expectations
gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" }
log4j = { group = "org.apache.logging.log4j", name = "log4j-api", version.ref = "log4j-api" }
# Platform expectations # Platform expectations
snakeyaml = { group = "org.yaml", name = "snakeyaml", version.ref = "snakeyaml" }
guice = { group = "com.google.inject", name = "guice", version.ref = "guice" } guice = { group = "com.google.inject", name = "guice", version.ref = "guice" }
guiceassistedinject = { group = "com.google.inject.extensions", name = "guice-assistedinject", version.ref = "guice" } guiceassistedinject = { group = "com.google.inject.extensions", name = "guice-assistedinject", version.ref = "guice" }
spotbugs = { group = "com.github.spotbugs", name = "spotbugs-annotations", version.ref = "spotbugs" } spotbugs = { group = "com.github.spotbugs", name = "spotbugs-annotations", version.ref = "spotbugs" }
@ -49,6 +66,9 @@ adventurePlatformBukkit = { group = "net.kyori", name = "adventure-platform-bukk
# Plugins # Plugins
worldeditCore = { group = "com.sk89q.worldedit", name = "worldedit-core", version.ref = "worldedit" } worldeditCore = { group = "com.sk89q.worldedit", name = "worldedit-core", version.ref = "worldedit" }
worldeditBukkit = { group = "com.sk89q.worldedit", name = "worldedit-bukkit", version.ref = "worldedit" } worldeditBukkit = { group = "com.sk89q.worldedit", name = "worldedit-bukkit", version.ref = "worldedit" }
fastasyncworldeditBukkit = { group = "com.fastasyncworldedit", name = "FastAsyncWorldEdit-Bukkit", version.ref = "fawe" }
fastasyncworldeditCore = { group = "com.fastasyncworldedit", name = "FastAsyncWorldEdit-Core", version.ref = "fawe" }
vault = { group = "com.github.MilkBowl", name = "VaultAPI", version.ref = "vault" }
placeholderapi = { group = "me.clip", name = "placeholderapi", version.ref = "placeholderapi" } placeholderapi = { group = "me.clip", name = "placeholderapi", version.ref = "placeholderapi" }
luckperms = { group = "net.luckperms", name = "api", version.ref = "luckperms" } luckperms = { group = "net.luckperms", name = "api", version.ref = "luckperms" }
essentialsx = { group = "net.essentialsx", name = "EssentialsX", version.ref = "essentialsx" } essentialsx = { group = "net.essentialsx", name = "EssentialsX", version.ref = "essentialsx" }
@ -59,8 +79,13 @@ aopalliance = { group = "aopalliance", name = "aopalliance", version.ref = "aopa
cloudServices = { group = "cloud.commandframework", name = "cloud-services", version.ref = "cloud-services" } cloudServices = { group = "cloud.commandframework", name = "cloud-services", version.ref = "cloud-services" }
mvdwapi = { group = "com.intellectualsites.mvdwplaceholderapi", name = "MVdWPlaceholderAPI", version.ref = "mvdwapi" } mvdwapi = { group = "com.intellectualsites.mvdwplaceholderapi", name = "MVdWPlaceholderAPI", version.ref = "mvdwapi" }
squirrelid = { group = "org.enginehub", name = "squirrelid", version.ref = "squirrelid" } squirrelid = { group = "org.enginehub", name = "squirrelid", version.ref = "squirrelid" }
serverlib = { group = "dev.notmyfault.serverlib", name = "ServerLib", version.ref = "serverlib" }
bstats = { group = "org.bstats", name = "bstats-bukkit", version.ref = "bstats" }
paperlib = { group = "io.papermc", name = "paperlib", version.ref = "paperlib" }
arkitektonika = { group = "com.intellectualsites.arkitektonika", name = "Arkitektonika-Client", version.ref = "arkitektonika" } arkitektonika = { group = "com.intellectualsites.arkitektonika", name = "Arkitektonika-Client", version.ref = "arkitektonika" }
http4j = { group = "com.intellectualsites.http", name = "HTTP4J", version.ref = "http4j" } http4j = { group = "com.intellectualsites.http", name = "HTTP4J", version.ref = "http4j" }
paster = { group = "com.intellectualsites.paster", name = "Paster", version.ref = "paster" }
guava = { group = "com.google.guava", name = "guava", version.ref = "guava" }
[plugins] [plugins]
shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadow" } shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadow" }