Compare commits

..

24 Commits

Author SHA1 Message Date
dordsor21
e2b6324b1c feat: implement better add/trust/deny/remove events
- closes #3509
2025-12-31 16:05:24 +00:00
Alexander Brandes
8edc5c15f1 Back to snapshot for development
Signed-off-by: Alexander Brandes <mc.cache@web.de>
2025-12-24 19:55:02 +01:00
Alexander Brandes
4fefe240ad Release 7.5.11
Signed-off-by: Alexander Brandes <mc.cache@web.de>
2025-12-24 19:54:22 +01:00
Lucyy_
8caa426c3a Fix: (build) Defer shadowJar output access to fix exclusive lock issue (#4805) 2025-12-22 18:46:28 +01:00
renovate[bot]
fce55662e1 Update fawe to v2.14.3 (#4806)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-21 19:27:32 +00:00
renovate[bot]
ab51b543f9 Update adventure to v4.26.1 (#4807)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-21 19:27:10 +00:00
Jordan
b4483ef3e2 fix: attempt to address unnecessary flight status changes (#4744)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-20 22:53:43 +01:00
renovate[bot]
10e094050b Update dependency com.gradleup.shadow to v9.3.0 (#4804)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-08 00:32:20 +00:00
renovate[bot]
93f19e719f Update dependency org.checkerframework:checker-qual to v3.52.1 (#4803)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-08 00:31:37 +00:00
renovate[bot]
d249340d88 Update actions/checkout action to v6 (#4800)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-01 02:01:30 +00:00
renovate[bot]
2438efcf87 Update fawe to v2.14.2 (#4799)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-12-01 02:00:54 +00:00
Alexander Brandes
5946444889 Back to snapshot for development
Signed-off-by: Alexander Brandes <mc.cache@web.de>
2025-11-25 21:27:38 +01:00
Alexander Brandes
0c6f55c328 Release 7.5.10
Signed-off-by: Alexander Brandes <mc.cache@web.de>
2025-11-25 21:26:02 +01:00
renovate[bot]
c7fe3f79e4 Update Gradle to v9.2.1 (#4797)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-24 01:04:05 +00:00
renovate[bot]
b455b94bcf Update dependency com.diffplug.spotless to v8.1.0 (#4798)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-24 01:03:25 +00:00
Alexander Brandes
d1a357a788 Fix javadoc generation
Signed-off-by: Alexander Brandes <mc.cache@web.de>
2025-11-18 15:51:18 +01:00
renovate[bot]
9abfcfdd01 Update dependency com.vanniktech.maven.publish to v0.35.0 (#4795)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-17 02:56:28 +00:00
linus
840ef5d236 Preserve vanilla drop behavior when tile-drop flag is applied (#4793)
make tile-drop flag respect vanilla willDrop=false
2025-11-16 01:36:20 +01:00
renovate[bot]
92db0467b1 Update dependency org.checkerframework:checker-qual to v3.52.0 (#4792)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-10 01:37:44 +00:00
Alexander Brandes
3ad7372f4c Back to snapshot for development
Signed-off-by: Alexander Brandes <mc.cache@web.de>
2025-11-04 10:38:20 +01:00
Alexander Brandes
2021f17368 Release 7.5.9
Signed-off-by: Alexander Brandes <mc.cache@web.de>
2025-11-04 10:37:09 +01:00
renovate[bot]
537661529e Update dependency me.clip:placeholderapi to v2.11.7 (#4790)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-04 09:33:44 +00:00
renovate[bot]
befc670646 Update Gradle to v9.2.0 (#4789)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-03 03:12:59 +00:00
renovate[bot]
ca4e3bffb1 Update junit-framework monorepo to v6.0.1 (#4788)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-11-03 03:10:37 +00:00
45 changed files with 1172 additions and 507 deletions

View File

@@ -27,7 +27,7 @@ body:
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.4'
- '1.21.11'
- '1.21.3'
- '1.21.1'
- '1.20.6'

18
.github/stale.yml vendored
View File

@@ -1,18 +0,0 @@
daysUntilStale: 30
daysUntilClose: 7
only: issues
exemptLabels:
- "Bug"
- "Enhancement"
- "Approved"
- "Priority"
- "Under investigation"
staleLabel: "resolution: stale"
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. If the issue is still present and can be reproduced, please let the team know.
Thank you for your contributions.
closeComment: >
This issue has been automatically closed because it has not had activity in
a long time. If the issue still applies to the most recent supported
version, please reply to this issue and the team will reopen it.

View File

@@ -9,7 +9,7 @@ jobs:
os: [ ubuntu-latest, windows-latest, macos-latest ]
steps:
- name: Checkout Repository
uses: actions/checkout@v5
uses: actions/checkout@v6
- name: Validate Gradle Wrapper
uses: gradle/actions/wrapper-validation@v5
- name: Setup Java

View File

@@ -9,7 +9,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v5
uses: actions/checkout@v6
- name: Validate Gradle Wrapper
uses: gradle/actions/wrapper-validation@v5
- name: Setup Java

View File

@@ -20,7 +20,7 @@ jobs:
language: [ 'java' ]
steps:
- name: Checkout repository
uses: actions/checkout@v5
uses: actions/checkout@v6
- name: Setup Java
uses: actions/setup-java@v5
with:

View File

@@ -110,9 +110,9 @@ tasks {
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
val opt = options as StandardJavadocDocletOptions
opt.links("https://jd.papermc.io/paper/1.20.4/")
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://intellectualsites.github.io/plotsquared-javadocs/core/")
opt.links("https://jd.advntr.dev/api/" + libs.adventureApi.get().versionConstraint.toString())
// opt.links("https://jd.advntr.dev/api/" + libs.adventureApi.get().versionConstraint.toString())
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
opt.links("https://checkerframework.org/api/")
opt.isLinkSource = true

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.plotsquared.bukkit.entity.EntityType;
import com.plotsquared.bukkit.generator.BukkitPlotGenerator;
import com.plotsquared.bukkit.inject.BackupModule;
import com.plotsquared.bukkit.inject.BukkitModule;
@@ -795,29 +794,60 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
if (entity.getMetadata("ps_custom_spawned").stream().anyMatch(MetadataValue::asBoolean)) {
continue;
}
switch (EntityType.of(entity.getType())) {
case EGG, FISHING_BOBBER, EYE_OF_ENDER, AREA_EFFECT_CLOUD, EXPERIENCE_ORB, LEASH_KNOT, FIREWORK_ROCKET,
LIGHTNING_BOLT, WITHER_SKULL, UNKNOWN, PLAYER, MANNEQUIN, BLOCK_DISPLAY, INTERACTION, ITEM_DISPLAY,
GLOW_ITEM_FRAME, TEXT_DISPLAY, OMINOUS_ITEM_SPAWNER, MARKER -> {
// TODO: use (type) pattern matching when targeting java 21
switch (entity.getType().toString()) {
case "EGG":
case "FISHING_HOOK", "FISHING_BOBBER":
case "ENDER_SIGNAL", "EYE_OF_ENDER":
case "AREA_EFFECT_CLOUD":
case "EXPERIENCE_ORB":
case "LEASH_HITCH", "LEASH_KNOT":
case "FIREWORK", "FIREWORK_ROCKET":
case "LIGHTNING", "LIGHTNING_BOLT":
case "WITHER_SKULL":
case "UNKNOWN":
case "PLAYER":
// non moving / unmovable
}
case EXPERIENCE_BOTTLE, SPLASH_POTION, LINGERING_POTION, SNOWBALL, SHULKER_BULLET, SPECTRAL_ARROW,
ENDER_PEARL, ARROW, LLAMA_SPIT, TRIDENT -> {
continue;
case "THROWN_EXP_BOTTLE", "EXPERIENCE_BOTTLE":
case "SPLASH_POTION", "POTION":
case "SNOWBALL":
case "SHULKER_BULLET":
case "SPECTRAL_ARROW":
case "ENDER_PEARL":
case "ARROW":
case "LLAMA_SPIT":
case "TRIDENT":
// managed elsewhere | projectile
}
case TNT, FALLING_BLOCK -> {
// managed elsewhere
}
case ITEM_FRAME, PAINTING -> {
continue;
case "ITEM_FRAME":
case "PAINTING":
// Not vehicles
}
// ARMOR_STAND temporarily classified as vehicle
case ARMOR_STAND, MINECART, CHEST_MINECART, COMMAND_BLOCK_MINECART, FURNACE_MINECART, HOPPER_MINECART,
SPAWNER_MINECART, END_CRYSTAL, TNT_MINECART, ACACIA_BOAT, BIRCH_BOAT, CHERRY_BOAT, DARK_OAK_BOAT,
JUNGLE_BOAT, MANGROVE_BOAT, OAK_BOAT, PALE_OAK_BOAT, SPRUCE_BOAT, BAMBOO_RAFT, ACACIA_CHEST_BOAT,
BIRCH_CHEST_BOAT, CHERRY_CHEST_BOAT, DARK_OAK_CHEST_BOAT, JUNGLE_CHEST_BOAT, MANGROVE_CHEST_BOAT,
OAK_CHEST_BOAT, PALE_OAK_CHEST_BOAT, SPRUCE_CHEST_BOAT, BAMBOO_CHEST_RAFT -> {
continue;
case "ARMOR_STAND":
// 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 "END_CRYSTAL":
case "ENDER_CRYSTAL": // Backwards compatibility for 1.20.4
case "MINECART_TNT":
case "TNT_MINECART":
case "CHEST_BOAT":
case "BOAT":
case "ACACIA_BOAT", "BIRCH_BOAT", "CHERRY_BOAT", "DARK_OAK_BOAT", "JUNGLE_BOAT", "MANGROVE_BOAT",
"OAK_BOAT", "PALE_OAK_BOAT", "SPRUCE_BOAT", "BAMBOO_RAFT":
case "ACACIA_CHEST_BOAT", "BIRCH_CHEST_BOAT", "CHERRY_CHEST_BOAT", "DARK_OAK_CHEST_BOAT",
"JUNGLE_CHEST_BOAT", "MANGROVE_CHEST_BOAT", "OAK_CHEST_BOAT", "PALE_OAK_CHEST_BOAT",
"SPRUCE_CHEST_BOAT", "BAMBOO_CHEST_RAFT":
if (Settings.Enabled_Components.KILL_ROAD_VEHICLES) {
com.plotsquared.core.location.Location location = BukkitUtil.adapt(entity.getLocation());
Plot plot = location.getPlot();
@@ -842,15 +872,22 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
this.removeRoadEntity(entity, iterator);
}
}
}
case SMALL_FIREBALL, FIREBALL, DRAGON_FIREBALL, ITEM, WIND_CHARGE, BREEZE_WIND_CHARGE -> {
continue;
case "SMALL_FIREBALL":
case "FIREBALL":
case "DRAGON_FIREBALL":
case "DROPPED_ITEM", "ITEM":
if (Settings.Enabled_Components.KILL_ROAD_ITEMS
&& plotArea.getOwnedPlotAbs(BukkitUtil.adapt(entity.getLocation())) == null) {
this.removeRoadEntity(entity, iterator);
}
// dropped item
}
case SHULKER -> {
continue;
case "PRIMED_TNT", "TNT":
case "FALLING_BLOCK":
// managed elsewhere
continue;
case "SHULKER":
if (Settings.Enabled_Components.KILL_ROAD_MOBS && (Settings.Enabled_Components.KILL_NAMED_ROAD_MOBS || entity.getCustomName() == null)) {
LivingEntity livingEntity = (LivingEntity) entity;
List<MetadataValue> meta = entity.getMetadata("shulkerPlot");
@@ -891,16 +928,80 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
}
}
}
}
case ZOMBIFIED_PIGLIN, PIGLIN_BRUTE, LLAMA, DONKEY, MULE, ZOMBIE_HORSE, SKELETON_HORSE, HUSK,
ELDER_GUARDIAN, WITHER_SKELETON, STRAY, ZOMBIE_VILLAGER, EVOKER, EVOKER_FANGS, VEX, VINDICATOR,
POLAR_BEAR, BAT, BLAZE, CAVE_SPIDER, CHICKEN, COW, CREEPER, ENDERMAN, ENDERMITE, ENDER_DRAGON, GHAST,
HAPPY_GHAST, GIANT, GUARDIAN, HORSE, IRON_GOLEM, MAGMA_CUBE, MOOSHROOM, OCELOT, PIG, RABBIT, SHEEP,
SILVERFISH, SKELETON, SLIME, SNOW_GOLEM, SPIDER, SQUID, VILLAGER, WITCH, WITHER, WOLF, ZOMBIE,
PARROT, SALMON, DOLPHIN, TROPICAL_FISH, DROWNED, COD, TURTLE, PUFFERFISH, PHANTOM, ILLUSIONER, CAT,
PANDA, FOX, PILLAGER, TRADER_LLAMA, WANDERING_TRADER, RAVAGER, BEE, HOGLIN, PIGLIN, ZOGLIN, FROG,
GOAT, WARDEN, TADPOLE, ALLAY, ARMADILLO, AXOLOTL, STRIDER, SNIFFER, CAMEL, BOGGED, COPPER_GOLEM,
GLOW_SQUID, BREEZE, CREAKING -> {
continue;
case "ZOMBIFIED_PIGLIN":
case "PIGLIN_BRUTE":
case "LLAMA":
case "DONKEY":
case "MULE":
case "ZOMBIE_HORSE":
case "SKELETON_HORSE":
case "HUSK":
case "ELDER_GUARDIAN":
case "WITHER_SKELETON":
case "STRAY":
case "ZOMBIE_VILLAGER":
case "EVOKER":
case "EVOKER_FANGS":
case "VEX":
case "VINDICATOR":
case "POLAR_BEAR":
case "BAT":
case "BLAZE":
case "CAVE_SPIDER":
case "CHICKEN":
case "COW":
case "CREEPER":
case "ENDERMAN":
case "ENDERMITE":
case "ENDER_DRAGON":
case "GHAST":
case "HAPPY_GHAST": // 1.21.6+
case "GHASTLING": // 1.21.6+
case "GIANT":
case "GUARDIAN":
case "HORSE":
case "IRON_GOLEM":
case "MAGMA_CUBE":
case "MUSHROOM_COW", "MOOSHROOM":
case "OCELOT":
case "PIG":
case "PIG_ZOMBIE":
case "RABBIT":
case "SHEEP":
case "SILVERFISH":
case "SKELETON":
case "SLIME":
case "SNOWMAN", "SNOW_GOLEM":
case "SPIDER":
case "SQUID":
case "VILLAGER":
case "WITCH":
case "WITHER":
case "WOLF":
case "ZOMBIE":
case "PARROT":
case "SALMON":
case "DOLPHIN":
case "TROPICAL_FISH":
case "DROWNED":
case "COD":
case "TURTLE":
case "PUFFERFISH":
case "PHANTOM":
case "ILLUSIONER":
case "CAT":
case "PANDA":
case "FOX":
case "PILLAGER":
case "TRADER_LLAMA":
case "WANDERING_TRADER":
case "RAVAGER":
case "BEE":
case "HOGLIN":
case "PIGLIN":
case "ZOGLIN":
default: {
if (Settings.Enabled_Components.KILL_ROAD_MOBS) {
Location location = entity.getLocation();
if (BukkitUtil.adapt(location).isPlotRoad()) {

View File

@@ -1,261 +0,0 @@
package com.plotsquared.bukkit.entity;
import com.sk89q.worldedit.util.Enums;
import org.bukkit.entity.Entity;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.EnumMap;
/**
* Wrapper Class for Bukkit {@link org.bukkit.entity.EntityType EntityTypes}.
* <br>
* Intended for a backwards compatible way to interact with entity types. Enum Constants should always be named after the
* constants of bukkits EntityType enum in the latest supported versions. Backwards compatible enum constants identifiers
* should have a comment assigned to them, so they can be removed in future versions.
*/
@ApiStatus.Internal
public enum EntityType {
ACACIA_BOAT,
ACACIA_CHEST_BOAT,
ALLAY,
AREA_EFFECT_CLOUD,
ARMADILLO,
ARMOR_STAND,
ARROW,
AXOLOTL,
BAMBOO_CHEST_RAFT,
BAMBOO_RAFT,
BAT,
BEE,
BIRCH_BOAT,
BIRCH_CHEST_BOAT,
BLAZE,
BLOCK_DISPLAY,
BOGGED,
BREEZE,
BREEZE_WIND_CHARGE,
CAMEL,
CAT,
CAVE_SPIDER,
CHERRY_BOAT,
CHERRY_CHEST_BOAT,
// 1.20.5: MINECART_CHEST -> CHEST_MINECART
CHEST_MINECART("MINECART_CHEST"),
CHICKEN,
COD,
// 1.20.5: MINECART_COMMAND -> COMMAND_BLOCK_MINECART
COMMAND_BLOCK_MINECART("MINECART_COMMAND"),
COPPER_GOLEM,
COW,
CREAKING,
CREEPER,
DARK_OAK_BOAT,
DARK_OAK_CHEST_BOAT,
DOLPHIN,
DONKEY,
DRAGON_FIREBALL,
DROWNED,
EGG,
ELDER_GUARDIAN,
// 1.20.5: ENDER_CRYSTAL -> END_CRYSTAL
END_CRYSTAL("ENDER_CRYSTAL"),
ENDER_DRAGON,
ENDER_PEARL,
ENDERMAN,
ENDERMITE,
EVOKER,
EVOKER_FANGS,
// 1.20.5: THROWN_EXP_BOTTLE -> EXPERIENCE_BOTTLE
EXPERIENCE_BOTTLE("THROWN_EXP_BOTTLE"),
EXPERIENCE_ORB,
// 1.20.5: ENDER_SIGNAL -> EYE_OF_ENDER
EYE_OF_ENDER("ENDER_SIGNAL"),
FALLING_BLOCK,
FIREBALL,
// 1.20.5: FIREWORK -> FIREWORK_ROCKET
FIREWORK_ROCKET("FIREWORK"),
// 1.20.5: FISHING_HOOK -> FISHING_BOBBER
FISHING_BOBBER("FISHING_HOOK"),
FOX,
FROG,
// 1.20.5: MINECART_FURNACE -> FURNACE_MINECART
FURNACE_MINECART("MINECART_FURNACE"),
GHAST,
GIANT,
GLOW_ITEM_FRAME,
GLOW_SQUID,
GOAT,
GUARDIAN,
HAPPY_GHAST,
HOGLIN,
// 1.20.5: MINECART_HOPPER -> HOPPER_MINECART
HOPPER_MINECART("MINECART_HOPPER"),
HORSE,
HUSK,
ILLUSIONER,
INTERACTION,
IRON_GOLEM,
// 1.20.5: DROPPED_ITEM -> ITEM
ITEM("DROPPED_ITEM"),
ITEM_DISPLAY,
ITEM_FRAME,
JUNGLE_BOAT,
JUNGLE_CHEST_BOAT,
// 1.20.5: LEASH_HITCH -> LEASH_KNOT
LEASH_KNOT("LEASH_HITCH"),
// 1.20.5: LIGHTNING -> LIGHTNING_BOLT
LIGHTNING_BOLT("LIGHTNING"),
LINGERING_POTION,
LLAMA,
LLAMA_SPIT,
MAGMA_CUBE,
MANGROVE_BOAT,
MANGROVE_CHEST_BOAT,
MANNEQUIN,
MARKER,
MINECART,
// 1.20.5: MUSHROOM_COW -> MOOSHROOM
MOOSHROOM("MUSHROOM_COW"),
MULE,
// 1.21.3: BOAT -> boat subvariants (oak, dark_oak, ...)
OAK_BOAT("BOAT"),
// 1.21.3: CHEST_BOAT -> chest boat subvariants (oak, dark_oak, ...)
OAK_CHEST_BOAT("CHEST_BOAT"),
OCELOT,
OMINOUS_ITEM_SPAWNER,
PAINTING,
PALE_OAK_BOAT,
PALE_OAK_CHEST_BOAT,
PANDA,
PARROT,
PHANTOM,
PIG,
PIGLIN,
PIGLIN_BRUTE,
PILLAGER,
PLAYER,
POLAR_BEAR,
PUFFERFISH,
RABBIT,
RAVAGER,
SALMON,
SHEEP,
SHULKER,
SHULKER_BULLET,
SILVERFISH,
SKELETON,
SKELETON_HORSE,
SLIME,
SMALL_FIREBALL,
SNIFFER,
// 1.20.5: SNOWMAN -> SNOW_GOLEM
SNOW_GOLEM("SNOWMAN"),
SNOWBALL,
// 1.20.5: MINECART_MOB_SPAWNER -> SPAWNER_MINECART
SPAWNER_MINECART("MINECART_MOB_SPAWNER"),
SPECTRAL_ARROW,
SPIDER,
// 1.21.5: POTION -> SPLASH_POTION + LINGERING_POTION (use SPLASH_POTION FOR compatibility)
SPLASH_POTION("POTION"),
SPRUCE_BOAT,
SPRUCE_CHEST_BOAT,
SQUID,
STRAY,
STRIDER,
TADPOLE,
TEXT_DISPLAY,
// 1.20.5: PRIMED_TNT -> TNT
TNT("PRIMED_TNT"),
// 1.20.5: MINECART_TNT -> TNT_MINECART
TNT_MINECART("MINECART_TNT"),
TRADER_LLAMA,
TRIDENT,
TROPICAL_FISH,
TURTLE,
UNKNOWN,
VEX,
VILLAGER,
VINDICATOR,
WANDERING_TRADER,
WARDEN,
WIND_CHARGE,
WITCH,
WITHER,
WITHER_SKELETON,
WITHER_SKULL,
WOLF,
ZOGLIN,
ZOMBIE,
ZOMBIE_HORSE,
ZOMBIE_VILLAGER,
ZOMBIFIED_PIGLIN;
private static final Logger LOGGER = LoggerFactory.getLogger("PlotSquared/" + EntityType.class.getSimpleName());
private static final EnumMap<org.bukkit.entity.EntityType, EntityType> BUKKIT_TO_INTERNAL =
new EnumMap<>(org.bukkit.entity.EntityType.class);
private final org.bukkit.entity.EntityType bukkitType;
EntityType(final String... additionalBukkitEnumFields) {
org.bukkit.entity.EntityType temp = null;
try {
temp = org.bukkit.entity.EntityType.valueOf(name());
} catch (IllegalArgumentException ignored) {
if (additionalBukkitEnumFields.length > 0) {
temp = Enums.findByValue(org.bukkit.entity.EntityType.class, additionalBukkitEnumFields);
}
}
bukkitType = temp;
}
public @Nullable org.bukkit.entity.EntityType bukkitType() {
return bukkitType;
}
public boolean isAlive() {
return this.bukkitType != null && this.bukkitType.isAlive();
}
public boolean isSpawnable() {
return this.bukkitType != null && this.bukkitType.isSpawnable();
}
@Override
public String toString() {
return "EntityType{name=" + name() + "}";
}
public static EntityType of(org.bukkit.entity.EntityType bukkitType) {
return BUKKIT_TO_INTERNAL.get(bukkitType);
}
public static EntityType of(Entity entity) {
return of(entity.getType());
}
static {
// Register all entity types with their aliases
for (final EntityType value : values()) {
org.bukkit.entity.EntityType bukkitType = value.bukkitType();
if (bukkitType != null) {
BUKKIT_TO_INTERNAL.put(bukkitType, value);
}
}
// Make sure this wrapper contains EVERY possible entity type available by the server
for (final org.bukkit.entity.EntityType bukkitType : org.bukkit.entity.EntityType.values()) {
if (!BUKKIT_TO_INTERNAL.containsKey(bukkitType)) {
LOGGER.error(
"EntityType {} provided by server has no wrapper equivalent. Is this server version supported? " +
"Falling back to 'UNKNOWN' type.",
bukkitType
);
BUKKIT_TO_INTERNAL.put(bukkitType, EntityType.UNKNOWN);
}
}
}
}

View File

@@ -21,6 +21,7 @@ package com.plotsquared.bukkit.entity;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.checkerframework.checker.nullness.qual.NonNull;
public abstract class EntityWrapper {
@@ -35,7 +36,7 @@ public abstract class EntityWrapper {
EntityWrapper(final @NonNull Entity entity) {
this.entity = entity;
this.type = EntityType.of(entity.getType());
this.type = entity.getType();
final Location location = entity.getLocation();
this.x = location.getX();
@@ -48,7 +49,7 @@ public abstract class EntityWrapper {
@SuppressWarnings("deprecation")
@Override
public String toString() {
return String.format("[%s, x=%s, y=%s, z=%s]", type, x, y, z);
return String.format("[%s, x=%s, y=%s, z=%s]", type.getName(), x, y, z);
}
public abstract Entity spawn(World world, int xOffset, int zOffset);

View File

@@ -37,7 +37,6 @@ import org.bukkit.entity.ChestBoat;
import org.bukkit.entity.ChestedHorse;
import org.bukkit.entity.EnderDragon;
import org.bukkit.entity.Entity;
import org.bukkit.entity.GlowItemFrame;
import org.bukkit.entity.IronGolem;
import org.bukkit.entity.Item;
import org.bukkit.entity.ItemFrame;
@@ -53,7 +52,6 @@ import org.bukkit.util.EulerAngle;
import org.bukkit.util.Vector;
import java.util.List;
import java.util.Objects;
public final class ReplicatingEntityWrapper extends EntityWrapper {
@@ -87,7 +85,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
return;
}
List<Entity> passengers = entity.getPassengers();
if (!passengers.isEmpty()) {
if (passengers.size() > 0) {
this.base.passenger = new ReplicatingEntityWrapper(passengers.get(0), depth);
}
this.base.fall = entity.getFallDistance();
@@ -103,40 +101,44 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
if (!entity.hasGravity()) {
this.noGravity = true;
}
switch (EntityType.of(entity.getType())) {
case ACACIA_BOAT, BIRCH_BOAT, CHERRY_BOAT, DARK_OAK_BOAT, JUNGLE_BOAT, MANGROVE_BOAT,
OAK_BOAT, PALE_OAK_BOAT, SPRUCE_BOAT, BAMBOO_RAFT -> {
switch (entity.getType().toString()) {
case "BOAT", "ACACIA_BOAT", "BIRCH_BOAT", "CHERRY_BOAT", "DARK_OAK_BOAT", "JUNGLE_BOAT", "MANGROVE_BOAT",
"OAK_BOAT", "PALE_OAK_BOAT", "SPRUCE_BOAT", "BAMBOO_RAFT" -> {
Boat boat = (Boat) entity;
this.dataByte = getOrdinal(Boat.Type.values(), boat.getBoatType());
return;
}
case ACACIA_CHEST_BOAT, BIRCH_CHEST_BOAT, CHERRY_CHEST_BOAT, DARK_OAK_CHEST_BOAT,
JUNGLE_CHEST_BOAT, MANGROVE_CHEST_BOAT, OAK_CHEST_BOAT, PALE_OAK_CHEST_BOAT,
SPRUCE_CHEST_BOAT, BAMBOO_CHEST_RAFT -> {
case "ACACIA_CHEST_BOAT", "BIRCH_CHEST_BOAT", "CHERRY_CHEST_BOAT", "DARK_OAK_CHEST_BOAT",
"JUNGLE_CHEST_BOAT", "MANGROVE_CHEST_BOAT", "OAK_CHEST_BOAT", "PALE_OAK_CHEST_BOAT",
"SPRUCE_CHEST_BOAT", "BAMBOO_CHEST_RAFT" -> {
ChestBoat boat = (ChestBoat) entity;
this.dataByte = getOrdinal(Boat.Type.values(), boat.getBoatType());
storeInventory(boat);
}
case ARROW, EGG, END_CRYSTAL, ENDER_PEARL, EYE_OF_ENDER, EXPERIENCE_ORB, FALLING_BLOCK, FIREBALL,
FIREWORK_ROCKET, FISHING_BOBBER, LEASH_KNOT, LIGHTNING_BOLT, MINECART, COMMAND_BLOCK_MINECART,
SPAWNER_MINECART, TNT_MINECART, PLAYER, TNT, SLIME, SMALL_FIREBALL, SNOWBALL, FURNACE_MINECART, SPLASH_POTION,
EXPERIENCE_BOTTLE, WITHER_SKULL, UNKNOWN, SPECTRAL_ARROW, SHULKER_BULLET, DRAGON_FIREBALL, AREA_EFFECT_CLOUD,
TRIDENT, LLAMA_SPIT -> {
case "ARROW", "EGG", "END_CRYSTAL", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "EXPERIENCE_ORB", "FALLING_BLOCK", "FIREBALL",
"FIREWORK", "FISHING_HOOK", "LEASH_HITCH", "LIGHTNING", "MINECART", "MINECART_COMMAND", "MINECART_MOB_SPAWNER",
"MINECART_TNT", "PLAYER", "PRIMED_TNT", "SLIME", "SMALL_FIREBALL", "SNOWBALL", "MINECART_FURNACE", "SPLASH_POTION",
"THROWN_EXP_BOTTLE", "WITHER_SKULL", "UNKNOWN", "SPECTRAL_ARROW", "SHULKER_BULLET", "DRAGON_FIREBALL", "AREA_EFFECT_CLOUD",
"TRIDENT", "LLAMA_SPIT" -> {
// Do this stuff later
return;
}
// MISC //
case ITEM -> {
case "DROPPED_ITEM", "ITEM" -> {
Item item = (Item) entity;
this.stack = item.getItemStack();
return;
}
case ITEM_FRAME, GLOW_ITEM_FRAME -> {
case "ITEM_FRAME" -> {
this.x = Math.floor(this.getX());
this.y = Math.floor(this.getY());
this.z = Math.floor(this.getZ());
ItemFrame itemFrame = (ItemFrame) entity;
this.dataByte = getOrdinal(Rotation.values(), itemFrame.getRotation());
this.stack = itemFrame.getItem().clone();
return;
}
case PAINTING -> {
case "PAINTING" -> {
this.x = Math.floor(this.getX());
this.y = Math.floor(this.getY());
this.z = Math.floor(this.getZ());
@@ -148,16 +150,18 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
this.y -= 1;
}
this.dataString = art.name();
return;
}
// END MISC //
// INVENTORY HOLDER //
case CHEST_MINECART, HOPPER_MINECART -> {
case "MINECART_CHEST", "CHEST_MINECART", "MINECART_HOPPER", "HOPPER_MINECART" -> {
storeInventory((InventoryHolder) entity);
return;
}
// START LIVING ENTITY //
// START AGEABLE //
// START TAMEABLE //
case CAMEL, HORSE, DONKEY, LLAMA, TRADER_LLAMA, MULE, SKELETON_HORSE, ZOMBIE_HORSE -> {
case "CAMEL", "HORSE", "DONKEY", "LLAMA", "TRADER_LLAMA", "MULE", "SKELETON_HORSE", "ZOMBIE_HORSE" -> {
AbstractHorse horse = (AbstractHorse) entity;
this.horse = new HorseStats();
this.horse.jump = horse.getJumpStrength();
@@ -172,15 +176,17 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
storeBreedable(horse);
storeLiving(horse);
storeInventory(horse);
return;
}
// END INVENTORY HOLDER //
case WOLF, OCELOT, CAT, PARROT -> {
case "WOLF", "OCELOT", "CAT", "PARROT" -> {
storeTameable((Tameable) entity);
storeBreedable((Breedable) entity);
storeLiving((LivingEntity) entity);
return;
}
// END TAMEABLE //
case SHEEP -> {
case "SHEEP" -> {
Sheep sheep = (Sheep) entity;
if (sheep.isSheared()) {
this.dataByte = (byte) 1;
@@ -190,18 +196,21 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
this.dataByte2 = getOrdinal(DyeColor.values(), sheep.getColor());
storeBreedable(sheep);
storeLiving(sheep);
return;
}
case VILLAGER, CHICKEN, COW, MOOSHROOM, PIG, TURTLE, POLAR_BEAR -> {
case "VILLAGER", "CHICKEN", "COW", "MUSHROOM_COW", "PIG", "TURTLE", "POLAR_BEAR" -> {
storeBreedable((Breedable) entity);
storeLiving((LivingEntity) entity);
return;
}
case RABBIT -> {
case "RABBIT" -> {
this.dataByte = getOrdinal(Rabbit.Type.values(), ((Rabbit) entity).getRabbitType());
storeBreedable((Breedable) entity);
storeLiving((LivingEntity) entity);
return;
}
// END AGEABLE //
case ARMOR_STAND -> {
case "ARMOR_STAND" -> {
ArmorStand stand = (ArmorStand) entity;
this.inventory =
new ItemStack[]{stand.getItemInHand().clone(), stand.getHelmet().clone(),
@@ -245,26 +254,31 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
if (stand.isSmall()) {
this.stand.small = true;
}
return;
}
case ENDERMITE -> {
case "ENDERMITE" -> {
return;
}
case BAT -> {
case "BAT" -> {
if (((Bat) entity).isAwake()) {
this.dataByte = (byte) 1;
} else {
this.dataByte = (byte) 0;
}
return;
}
case ENDER_DRAGON -> {
case "ENDER_DRAGON" -> {
EnderDragon entity1 = (EnderDragon) entity;
this.dataByte = (byte) entity1.getPhase().ordinal();
return;
}
case SKELETON, WITHER_SKELETON, GUARDIAN, ELDER_GUARDIAN, GHAST, HAPPY_GHAST, MAGMA_CUBE,
SQUID, HOGLIN, ZOMBIFIED_PIGLIN, PIGLIN, PIGLIN_BRUTE, ZOMBIE, WITHER, WITCH, SPIDER, CAVE_SPIDER, SILVERFISH,
GIANT, ENDERMAN, CREEPER, BLAZE, SHULKER, SNOW_GOLEM -> {
case "SKELETON", "WITHER_SKELETON", "GUARDIAN", "ELDER_GUARDIAN", "GHAST", "HAPPY_GHAST", "GHASTLING", "MAGMA_CUBE", "SQUID", "PIG_ZOMBIE", "HOGLIN",
"ZOMBIFIED_PIGLIN", "PIGLIN", "PIGLIN_BRUTE", "ZOMBIE", "WITHER", "WITCH", "SPIDER", "CAVE_SPIDER", "SILVERFISH",
"GIANT", "ENDERMAN", "CREEPER", "BLAZE", "SHULKER", "SNOWMAN", "SNOW_GOLEM" -> {
storeLiving((LivingEntity) entity);
return;
}
case IRON_GOLEM -> {
case "IRON_GOLEM" -> {
if (((IronGolem) entity).isPlayerCreated()) {
this.dataByte = (byte) 1;
} else {
@@ -376,8 +390,8 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
}
/**
* @since 7.1.0
* @deprecated Use {@link #restoreBreedable(Breedable)} instead
* @since 7.1.0
*/
@Deprecated(forRemoval = true, since = "7.1.0")
private void restoreAgeable(Ageable entity) {
@@ -391,8 +405,8 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
}
/**
* @since 7.1.0
* @deprecated Use {@link #storeBreedable(Breedable)} instead
* @since 7.1.0
*/
@Deprecated(forRemoval = true, since = "7.1.0")
public void storeAgeable(Ageable aged) {
@@ -441,17 +455,16 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
return null;
}
Entity entity;
switch (this.getType()) {
case ITEM -> {
switch (this.getType().toString()) {
case "DROPPED_ITEM", "ITEM" -> {
return world.dropItem(location, this.stack);
}
case PLAYER, LEASH_KNOT -> {
case "PLAYER", "LEASH_HITCH" -> {
return null;
}
case ITEM_FRAME -> entity = world.spawn(location, ItemFrame.class);
case GLOW_ITEM_FRAME -> entity = world.spawn(location, GlowItemFrame.class);
case PAINTING -> entity = world.spawn(location, Painting.class);
default -> entity = world.spawnEntity(location, Objects.requireNonNull(this.getType().bukkitType()));
case "ITEM_FRAME" -> entity = world.spawn(location, ItemFrame.class);
case "PAINTING" -> entity = world.spawn(location, Painting.class);
default -> entity = world.spawnEntity(location, this.getType());
}
if (this.depth == 0) {
return entity;
@@ -478,16 +491,16 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
if (this.noGravity) {
entity.setGravity(false);
}
switch (EntityType.of(entity.getType())) {
case ACACIA_BOAT, BIRCH_BOAT, CHERRY_BOAT, DARK_OAK_BOAT, JUNGLE_BOAT, MANGROVE_BOAT,
OAK_BOAT, PALE_OAK_BOAT, SPRUCE_BOAT, BAMBOO_RAFT -> {
switch (entity.getType().toString()) {
case "BOAT", "ACACIA_BOAT", "BIRCH_BOAT", "CHERRY_BOAT", "DARK_OAK_BOAT", "JUNGLE_BOAT", "MANGROVE_BOAT",
"OAK_BOAT", "PALE_OAK_BOAT", "SPRUCE_BOAT", "BAMBOO_RAFT" -> {
Boat boat = (Boat) entity;
boat.setBoatType(Boat.Type.values()[dataByte]);
return entity;
}
case ACACIA_CHEST_BOAT, BIRCH_CHEST_BOAT, CHERRY_CHEST_BOAT, DARK_OAK_CHEST_BOAT,
JUNGLE_CHEST_BOAT, MANGROVE_CHEST_BOAT, OAK_CHEST_BOAT, PALE_OAK_CHEST_BOAT,
SPRUCE_CHEST_BOAT, BAMBOO_CHEST_RAFT -> {
case "ACACIA_CHEST_BOAT", "BIRCH_CHEST_BOAT", "CHERRY_CHEST_BOAT", "DARK_OAK_CHEST_BOAT",
"JUNGLE_CHEST_BOAT", "MANGROVE_CHEST_BOAT", "OAK_CHEST_BOAT", "PALE_OAK_CHEST_BOAT",
"SPRUCE_CHEST_BOAT", "BAMBOO_CHEST_RAFT" -> {
ChestBoat boat = (ChestBoat) entity;
boat.setBoatType(Boat.Type.values()[dataByte]);
restoreInventory(boat);
@@ -498,22 +511,22 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
((Slime) entity).setSize(this.dataByte);
return entity;
} */
case ARROW, EGG, END_CRYSTAL, ENDER_PEARL, EYE_OF_ENDER, ITEM, EXPERIENCE_ORB, FALLING_BLOCK, FIREBALL,
FIREWORK_ROCKET, FISHING_BOBBER, LEASH_KNOT, LIGHTNING_BOLT, MINECART, COMMAND_BLOCK_MINECART, SPAWNER_MINECART,
TNT_MINECART, PLAYER, TNT, SMALL_FIREBALL, SNOWBALL, SPLASH_POTION, EXPERIENCE_BOTTLE, SPECTRAL_ARROW,
SHULKER_BULLET, AREA_EFFECT_CLOUD, DRAGON_FIREBALL, WITHER_SKULL, FURNACE_MINECART, LLAMA_SPIT, TRIDENT,
UNKNOWN -> {
case "ARROW", "EGG", "END_CRYSTAL", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "DROPPED_ITEM", "EXPERIENCE_ORB", "FALLING_BLOCK",
"FIREBALL", "FIREWORK", "FISHING_HOOK", "LEASH_HITCH", "LIGHTNING", "MINECART", "MINECART_COMMAND",
"MINECART_MOB_SPAWNER", "MINECART_TNT", "PLAYER", "PRIMED_TNT", "SMALL_FIREBALL", "SNOWBALL",
"SPLASH_POTION", "THROWN_EXP_BOTTLE", "SPECTRAL_ARROW", "SHULKER_BULLET", "AREA_EFFECT_CLOUD",
"DRAGON_FIREBALL", "WITHER_SKULL", "MINECART_FURNACE", "LLAMA_SPIT", "TRIDENT", "UNKNOWN" -> {
// Do this stuff later
return entity;
}
// MISC //
case ITEM_FRAME, GLOW_ITEM_FRAME -> {
case "ITEM_FRAME" -> {
ItemFrame itemframe = (ItemFrame) entity;
itemframe.setRotation(Rotation.values()[this.dataByte]);
itemframe.setItem(this.stack);
return entity;
}
case PAINTING -> {
case "PAINTING" -> {
Painting painting = (Painting) entity;
painting.setFacingDirection(BlockFace.values()[this.dataByte], true);
painting.setArt(Art.getByName(this.dataString), true);
@@ -521,14 +534,14 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
}
// END MISC //
// INVENTORY HOLDER //
case CHEST_MINECART, HOPPER_MINECART -> {
case "MINECART_CHEST", "CHEST_MINECART", "MINECART_HOPPER", "HOPPER_MINECART" -> {
restoreInventory((InventoryHolder) entity);
return entity;
}
// START LIVING ENTITY //
// START AGEABLE //
// START TAMEABLE //
case CAMEL, HORSE, DONKEY, LLAMA, TRADER_LLAMA, MULE, SKELETON_HORSE, ZOMBIE_HORSE -> {
case "CAMEL", "HORSE", "DONKEY", "LLAMA", "TRADER_LLAMA", "MULE", "SKELETON_HORSE", "ZOMBIE_HORSE" -> {
AbstractHorse horse = (AbstractHorse) entity;
horse.setJumpStrength(this.horse.jump);
if (horse instanceof ChestedHorse) {
@@ -545,14 +558,14 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
return entity;
}
// END INVENTORY HOLDER //
case WOLF, OCELOT, CAT, PARROT -> {
case "WOLF", "OCELOT", "CAT", "PARROT" -> {
restoreTameable((Tameable) entity);
restoreBreedable((Breedable) entity);
restoreLiving((LivingEntity) entity);
return entity;
}
// END AGEABLE //
case SHEEP -> {
case "SHEEP" -> {
Sheep sheep = (Sheep) entity;
if (this.dataByte == 1) {
sheep.setSheared(true);
@@ -564,13 +577,13 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
restoreLiving(sheep);
return sheep;
}
case VILLAGER, CHICKEN, COW, TURTLE, POLAR_BEAR, MOOSHROOM, PIG -> {
case "VILLAGER", "CHICKEN", "COW", "TURTLE", "POLAR_BEAR", "MUSHROOM_COW", "PIG" -> {
restoreBreedable((Breedable) entity);
restoreLiving((LivingEntity) entity);
return entity;
}
// END AGEABLE //
case RABBIT -> {
case "RABBIT" -> {
if (this.dataByte != 0) {
((Rabbit) entity).setRabbitType(Rabbit.Type.values()[this.dataByte]);
}
@@ -578,7 +591,7 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
restoreLiving((LivingEntity) entity);
return entity;
}
case ARMOR_STAND -> {
case "ARMOR_STAND" -> {
// CHECK positions
ArmorStand stand = (ArmorStand) entity;
if (this.inventory[0] != null) {
@@ -597,27 +610,41 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
stand.setBoots(this.inventory[4]);
}
if (this.stand.head[0] != 0 || this.stand.head[1] != 0 || this.stand.head[2] != 0) {
EulerAngle pose = new EulerAngle(this.stand.head[0], this.stand.head[1], this.stand.head[2]);
EulerAngle pose =
new EulerAngle(this.stand.head[0], this.stand.head[1], this.stand.head[2]);
stand.setHeadPose(pose);
}
if (this.stand.body[0] != 0 || this.stand.body[1] != 0 || this.stand.body[2] != 0) {
EulerAngle pose = new EulerAngle(this.stand.body[0], this.stand.body[1], this.stand.body[2]);
EulerAngle pose =
new EulerAngle(this.stand.body[0], this.stand.body[1], this.stand.body[2]);
stand.setBodyPose(pose);
}
if (this.stand.leftLeg[0] != 0 || this.stand.leftLeg[1] != 0 || this.stand.leftLeg[2] != 0) {
EulerAngle pose = new EulerAngle(this.stand.leftLeg[0], this.stand.leftLeg[1], this.stand.leftLeg[2]);
if (this.stand.leftLeg[0] != 0 || this.stand.leftLeg[1] != 0
|| this.stand.leftLeg[2] != 0) {
EulerAngle pose = new EulerAngle(this.stand.leftLeg[0], this.stand.leftLeg[1],
this.stand.leftLeg[2]
);
stand.setLeftLegPose(pose);
}
if (this.stand.rightLeg[0] != 0 || this.stand.rightLeg[1] != 0 || this.stand.rightLeg[2] != 0) {
EulerAngle pose = new EulerAngle(this.stand.rightLeg[0], this.stand.rightLeg[1], this.stand.rightLeg[2]);
if (this.stand.rightLeg[0] != 0 || this.stand.rightLeg[1] != 0
|| this.stand.rightLeg[2] != 0) {
EulerAngle pose = new EulerAngle(this.stand.rightLeg[0], this.stand.rightLeg[1],
this.stand.rightLeg[2]
);
stand.setRightLegPose(pose);
}
if (this.stand.leftArm[0] != 0 || this.stand.leftArm[1] != 0 || this.stand.leftArm[2] != 0) {
EulerAngle pose = new EulerAngle(this.stand.leftArm[0], this.stand.leftArm[1], this.stand.leftArm[2]);
if (this.stand.leftArm[0] != 0 || this.stand.leftArm[1] != 0
|| this.stand.leftArm[2] != 0) {
EulerAngle pose = new EulerAngle(this.stand.leftArm[0], this.stand.leftArm[1],
this.stand.leftArm[2]
);
stand.setLeftArmPose(pose);
}
if (this.stand.rightArm[0] != 0 || this.stand.rightArm[1] != 0 || this.stand.rightArm[2] != 0) {
EulerAngle pose = new EulerAngle(this.stand.rightArm[0], this.stand.rightArm[1], this.stand.rightArm[2]);
if (this.stand.rightArm[0] != 0 || this.stand.rightArm[1] != 0
|| this.stand.rightArm[2] != 0) {
EulerAngle pose = new EulerAngle(this.stand.rightArm[0], this.stand.rightArm[1],
this.stand.rightArm[2]
);
stand.setRightArmPose(pose);
}
if (this.stand.invisible) {
@@ -635,28 +662,25 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
restoreLiving(stand);
return stand;
}
case BAT -> {
case "BAT" -> {
if (this.dataByte != 0) {
((Bat) entity).setAwake(true);
}
restoreLiving((LivingEntity) entity);
return entity;
}
case ENDER_DRAGON -> {
case "ENDER_DRAGON" -> {
if (this.dataByte != 0) {
((EnderDragon) entity).setPhase(EnderDragon.Phase.values()[this.dataByte]);
}
restoreLiving((LivingEntity) entity);
return entity;
}
case ENDERMITE, GHAST, HAPPY_GHAST, MAGMA_CUBE, SQUID, HOGLIN, PIGLIN,
ZOMBIFIED_PIGLIN, PIGLIN_BRUTE, ZOMBIE, WITHER, WITCH, SPIDER, CAVE_SPIDER, SILVERFISH, GIANT,
ENDERMAN, CREEPER, BLAZE, SNOW_GOLEM, SHULKER, GUARDIAN, ELDER_GUARDIAN, SKELETON,
WITHER_SKELETON -> {
case "ENDERMITE", "GHAST", "HAPPY_GHAST", "GHASTLING", "MAGMA_CUBE", "SQUID", "PIG_ZOMBIE", "HOGLIN", "PIGLIN", "ZOMBIFIED_PIGLIN", "PIGLIN_BRUTE", "ZOMBIE", "WITHER", "WITCH", "SPIDER", "CAVE_SPIDER", "SILVERFISH", "GIANT", "ENDERMAN", "CREEPER", "BLAZE", "SNOWMAN", "SHULKER", "GUARDIAN", "ELDER_GUARDIAN", "SKELETON", "WITHER_SKELETON" -> {
restoreLiving((LivingEntity) entity);
return entity;
}
case IRON_GOLEM -> {
case "IRON_GOLEM" -> {
if (this.dataByte != 0) {
((IronGolem) entity).setPlayerCreated(true);
}

View File

@@ -20,7 +20,6 @@ package com.plotsquared.bukkit.listener;
import com.google.inject.Inject;
import com.plotsquared.bukkit.BukkitPlatform;
import com.plotsquared.bukkit.entity.EntityType;
import com.plotsquared.bukkit.player.BukkitPlayer;
import com.plotsquared.bukkit.util.BukkitEntityUtil;
import com.plotsquared.bukkit.util.BukkitUtil;
@@ -53,6 +52,7 @@ import org.bukkit.block.Block;
import org.bukkit.entity.Ageable;
import org.bukkit.entity.Boat;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
@@ -148,8 +148,8 @@ public class EntityEventListener implements Listener {
if (area == null) {
return;
}
// Armor-stands are handled elsewhere and should not be handled by area-wide entity-spawn options
if (EntityType.of(event.getEntityType()) == EntityType.ARMOR_STAND) {
// Armour-stands are handled elsewhere and should not be handled by area-wide entity-spawn options
if (entity.getType() == EntityType.ARMOR_STAND) {
return;
}
CreatureSpawnEvent.SpawnReason reason = event.getSpawnReason();
@@ -212,7 +212,7 @@ public class EntityEventListener implements Listener {
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onEntityFall(EntityChangeBlockEvent event) {
if (EntityType.of(event.getEntityType()) != EntityType.FALLING_BLOCK) {
if (event.getEntityType() != EntityType.FALLING_BLOCK) {
return;
}
Block block = event.getBlock();
@@ -278,7 +278,7 @@ public class EntityEventListener implements Listener {
@EventHandler(priority = EventPriority.HIGH)
public void onDamage(EntityDamageEvent event) {
if (EntityType.of(event.getEntityType()) != EntityType.PLAYER) {
if (event.getEntityType() != EntityType.PLAYER) {
return;
}
Location location = BukkitUtil.adapt(event.getEntity().getLocation());

View File

@@ -18,7 +18,6 @@
*/
package com.plotsquared.bukkit.listener;
import com.plotsquared.bukkit.entity.EntityType;
import com.plotsquared.bukkit.util.BukkitEntityUtil;
import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.core.PlotSquared;
@@ -34,6 +33,7 @@ import org.bukkit.block.Block;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.EnderCrystal;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Item;
import org.bukkit.entity.Vehicle;
import org.bukkit.event.EventHandler;
@@ -84,7 +84,6 @@ public class EntitySpawnListener implements Listener {
public static void test(Entity entity) {
@NonNull World world = entity.getWorld();
List<MetadataValue> meta = entity.getMetadata(KEY);
final EntityType entityType = EntityType.of(entity);
if (meta.isEmpty()) {
if (PlotSquared.get().getPlotAreaManager().hasPlotArea(world.getName())) {
entity.setMetadata(KEY, new FixedMetadataValue((Plugin) PlotSquared.platform(), entity.getLocation()));
@@ -95,7 +94,7 @@ public class EntitySpawnListener implements Listener {
if (!originWorld.equals(world)) {
if (!ignoreTP) {
if (!world.getName().equalsIgnoreCase(originWorld + "_the_end")) {
if (entityType == EntityType.PLAYER) {
if (entity.getType() == EntityType.PLAYER) {
return;
}
try {
@@ -109,7 +108,7 @@ public class EntitySpawnListener implements Listener {
}
}
} else {
if (entityType == EntityType.PLAYER) {
if (entity.getType() == EntityType.PLAYER) {
return;
}
entity.remove();
@@ -133,7 +132,7 @@ public class EntitySpawnListener implements Listener {
}
}
Plot plot = location.getOwnedPlotAbs();
EntityType type = EntityType.of(entity);
EntityType type = entity.getType();
if (plot == null) {
if (entity instanceof Item) {
if (Settings.Enabled_Components.KILL_ROAD_ITEMS) {
@@ -202,16 +201,15 @@ public class EntitySpawnListener implements Listener {
final PlotArea fromArea = fromLocLocation.getPlotArea();
Location toLocLocation = BukkitUtil.adapt(toLocation.getLocation());
PlotArea toArea = toLocLocation.getPlotArea();
final EntityType entityType = EntityType.of(entity);
if (toArea == null) {
if (entityType == EntityType.SHULKER && fromArea != null) {
if (fromLocation.getType() == EntityType.SHULKER && fromArea != null) {
event.setCancelled(true);
}
return;
}
Plot toPlot = toArea.getOwnedPlot(toLocLocation);
if (entityType == EntityType.SHULKER && fromArea != null) {
if (fromLocation.getType() == EntityType.SHULKER && fromArea != null) {
final Plot fromPlot = fromArea.getOwnedPlot(fromLocLocation);
if (fromPlot != null || toPlot != null) {
@@ -233,7 +231,7 @@ public class EntitySpawnListener implements Listener {
@EventHandler
public void spawn(CreatureSpawnEvent event) {
if (EntityType.of(event.getEntityType()) == EntityType.ARMOR_STAND) {
if (event.getEntityType() == EntityType.ARMOR_STAND) {
testCreate(event.getEntity());
}
}

View File

@@ -28,7 +28,6 @@ import com.destroystokyo.paper.event.entity.SlimePathfindEvent;
import com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent;
import com.destroystokyo.paper.event.server.AsyncTabCompleteEvent;
import com.google.inject.Inject;
import com.plotsquared.bukkit.entity.EntityType;
import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.command.Command;
@@ -56,9 +55,11 @@ 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.Chunk;
import org.bukkit.NamespacedKey;
import org.bukkit.block.Block;
import org.bukkit.block.TileState;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.Slime;
@@ -83,6 +84,9 @@ import java.util.regex.Pattern;
@SuppressWarnings("unused")
public class PaperListener implements Listener {
private static final NamespacedKey ITEM = NamespacedKey.minecraft("item");
private static final NamespacedKey FISHING_BOBBER = NamespacedKey.minecraft("fishing_bobber");
private final PlotAreaManager plotAreaManager;
private Chunk lastChunk;
@@ -100,6 +104,10 @@ public class PaperListener implements Listener {
}
Plot plot = area.getPlot(location);
if (plot != null) {
// Prevent dropping blocks which normally would not be dropped.
if (!event.willDrop()) {
return;
}
event.setWillDrop(plot.getFlag(TileDropFlag.class));
}
}
@@ -124,7 +132,7 @@ public class PaperListener implements Listener {
return;
}
handleEntityMovement(event, event.getEntity().getLocation(), b.getLocation());
handleEntityMovement(event, event.getEntity().getLocation(), b.getLocation());
}
@EventHandler
@@ -178,9 +186,8 @@ public class PaperListener implements Listener {
if (area == null) {
return;
}
final EntityType entityType = EntityType.of(event.getType());
// Armor-stands are handled elsewhere and should not be handled by area-wide entity-spawn options
if (entityType == EntityType.ARMOR_STAND) {
// Armour-stands are handled elsewhere and should not be handled by area-wide entity-spawn options
if (event.getType() == EntityType.ARMOR_STAND) {
return;
}
// If entities are spawning... the chunk should be loaded?
@@ -199,8 +206,7 @@ public class PaperListener implements Listener {
return;
}
}
case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SILVERFISH_BLOCK", "ENDER_PEARL", "TRAP",
"VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> {
case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SILVERFISH_BLOCK", "ENDER_PEARL", "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> {
if (!area.isMobSpawning()) {
event.setShouldAbortSpawn(true);
event.setCancelled(true);
@@ -231,23 +237,24 @@ public class PaperListener implements Listener {
}
Plot plot = location.getOwnedPlotAbs();
if (plot == null) {
EntityType type = event.getType();
// PreCreatureSpawnEvent **should** not be called for DROPPED_ITEM, just for the sake of consistency
if (entityType == EntityType.ITEM) {
if (type.getKey().equals(ITEM)) {
if (Settings.Enabled_Components.KILL_ROAD_ITEMS) {
event.setCancelled(true);
}
return;
}
if (!area.isMobSpawning()) {
if (entityType == EntityType.PLAYER) {
if (type == EntityType.PLAYER) {
return;
}
if (entityType.isAlive()) {
if (type.isAlive()) {
event.setShouldAbortSpawn(true);
event.setCancelled(true);
}
}
if (!area.isMiscSpawnUnowned() && !entityType.isAlive()) {
if (!area.isMiscSpawnUnowned() && !type.isAlive()) {
event.setShouldAbortSpawn(true);
event.setCancelled(true);
}
@@ -319,7 +326,6 @@ public class PaperListener implements Listener {
return;
}
Projectile entity = event.getProjectile();
EntityType entityType = EntityType.of(entity);
ProjectileSource shooter = entity.getShooter();
if (!(shooter instanceof Player)) {
return;
@@ -359,7 +365,7 @@ public class PaperListener implements Listener {
event.setCancelled(true);
}
} else if (!plot.isAdded(pp.getUUID())) {
if (entityType == EntityType.FISHING_BOBBER) {
if (entity.getType().getKey().equals(FISHING_BOBBER)) {
if (plot.getFlag(FishingFlag.class)) {
return;
}

View File

@@ -21,7 +21,6 @@ package com.plotsquared.bukkit.listener;
import com.destroystokyo.paper.MaterialTags;
import com.google.common.base.Charsets;
import com.google.inject.Inject;
import com.plotsquared.bukkit.entity.EntityType;
import com.plotsquared.bukkit.player.BukkitPlayer;
import com.plotsquared.bukkit.util.BukkitEntityUtil;
import com.plotsquared.bukkit.util.BukkitUtil;
@@ -80,6 +79,7 @@ import com.plotsquared.core.util.task.TaskManager;
import com.plotsquared.core.util.task.TaskTime;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.util.Enums;
import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.block.BlockTypes;
import io.papermc.lib.PaperLib;
@@ -98,6 +98,7 @@ 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;
import org.bukkit.entity.ItemFrame;
import org.bukkit.entity.LivingEntity;
@@ -159,6 +160,7 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
@@ -184,6 +186,14 @@ public class PlayerEventListener implements Listener {
Material.WRITTEN_BOOK
);
/**
* The correct EntityType for End Crystal, determined once at class loading time.
* Tries END_CRYSTAL first (1.21+), falls back to ENDER_CRYSTAL (1.20.4 and older).
*/
private static final EntityType END_CRYSTAL_ENTITY_TYPE = Objects.requireNonNull(
Enums.findByValue(EntityType.class, "END_CRYSTAL", "ENDER_CRYSTAL")
);
private static final Set<String> DYES;
static {
@@ -590,7 +600,7 @@ public class PlayerEventListener implements Listener {
PlotArea area = location.getPlotArea();
if (area == null) {
if (lastPlot != null) {
plotListener.plotExit(pp, lastPlot);
plotListener.plotExit(pp, lastPlot, null, null);
lastPlotAccess.remove();
}
try (final MetaDataAccess<Location> lastLocationAccess =
@@ -743,7 +753,7 @@ public class PlayerEventListener implements Listener {
if (now == null) {
try (final MetaDataAccess<Boolean> kickAccess =
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(
if (lastPlot != null && !plotListener.plotExit(pp, lastPlot, now, area) && this.tmpTeleport && !kickAccess.get().orElse(
false)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
@@ -837,7 +847,7 @@ public class PlayerEventListener implements Listener {
if (plot == null) {
try (final MetaDataAccess<Boolean> kickAccess =
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(
if (lastPlot != null && !plotListener.plotExit(pp, lastPlot, null, area) && this.tmpTeleport && !kickAccess.get().orElse(
false)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
@@ -1318,7 +1328,7 @@ public class PlayerEventListener implements Listener {
// reset the player's hand item if spawning needs to be cancelled.
if (type == Material.ARMOR_STAND || type == Material.END_CRYSTAL) {
Plot plot = location.getOwnedPlotAbs();
EntityType entityType = type == Material.ARMOR_STAND ? EntityType.ARMOR_STAND : EntityType.END_CRYSTAL;
EntityType entityType = type == Material.ARMOR_STAND ? EntityType.ARMOR_STAND : END_CRYSTAL_ENTITY_TYPE;
if (BukkitEntityUtil.checkEntity(entityType, plot)) {
event.setCancelled(true);
break;
@@ -1699,7 +1709,7 @@ public class PlayerEventListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
if (EntityType.of(event.getRightClicked().getType()) == EntityType.UNKNOWN) {
if (event.getRightClicked().getType() == EntityType.UNKNOWN) {
return;
}
Location location = BukkitUtil.adapt(event.getRightClicked().getLocation());

View File

@@ -18,7 +18,6 @@
*/
package com.plotsquared.bukkit.util;
import com.plotsquared.bukkit.entity.EntityType;
import com.plotsquared.bukkit.player.BukkitPlayer;
import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
@@ -49,6 +48,7 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Creature;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Firework;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
@@ -189,7 +189,7 @@ public class BukkitEntityUtil {
);
return false;
}
} else if (EntityType.of(victim.getType()) == EntityType.ARMOR_STAND) {
} else if (victim.getType() == EntityType.ARMOR_STAND) {
if (plot != null && (plot.getFlag(MiscBreakFlag.class) || plot
.isAdded(plotPlayer.getUUID()))) {
return true;
@@ -354,7 +354,7 @@ public class BukkitEntityUtil {
}
public static boolean checkEntity(Entity entity, Plot plot) {
return checkEntity(EntityType.of(entity.getType()), plot);
return checkEntity(entity.getType(), plot);
}
public static boolean checkEntity(EntityType type, Plot plot) {
@@ -364,7 +364,7 @@ public class BukkitEntityUtil {
}
final com.sk89q.worldedit.world.entity.EntityType entityType =
BukkitAdapter.adapt(type.bukkitType());
BukkitAdapter.adapt(type);
if (EntityCategories.PLAYER.contains(entityType)) {
return false;

View File

@@ -67,8 +67,8 @@ tasks {
withType<Javadoc> {
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
val opt = options as StandardJavadocDocletOptions
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/" + libs.worldeditCore.get().versionConstraint.toString())
opt.links("https://jd.advntr.dev/api/" + libs.adventureApi.get().versionConstraint.toString())
// opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/" + libs.worldeditCore.get().versionConstraint.toString())
// opt.links("https://jd.advntr.dev/api/" + libs.adventureApi.get().versionConstraint.toString())
opt.links("https://jd.advntr.dev/text-minimessage/" + libs.adventureApi.get().versionConstraint.toString())
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
opt.links("https://checkerframework.org/api/")

View File

@@ -23,6 +23,8 @@ 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.events.PlayerPlotAddRemoveEvent;
import com.plotsquared.core.events.Result;
import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
@@ -151,20 +153,41 @@ public class Add extends Command {
return;
}
// Success
confirm.run(this, () -> {
for (UUID uuid : uuids) {
if (uuid != DBFunc.EVERYONE) {
if (!plot.removeTrusted(uuid)) {
if (plot.getDenied().contains(uuid)) {
plot.removeDenied(uuid);
confirm.run(
this, () -> {
for (UUID uuid : uuids) {
if (this.eventDispatcher.callPlayerAdd(
player,
plot,
uuid,
PlayerPlotAddRemoveEvent.Reason.COMMAND
).getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Add")))
);
continue;
}
if (uuid != DBFunc.EVERYONE) {
if (!plot.removeTrusted(uuid)) {
if (plot.getDenied().contains(uuid)) {
plot.removeDenied(uuid);
}
}
}
plot.addMember(uuid);
this.eventDispatcher.callMember(player, plot, uuid, true);
this.eventDispatcher.callPostAdded(
player,
plot,
uuid,
false,
PlayerPlotAddRemoveEvent.Reason.COMMAND
);
player.sendMessage(TranslatableCaption.of("member.member_added"));
}
}
plot.addMember(uuid);
this.eventDispatcher.callMember(player, plot, uuid, true);
player.sendMessage(TranslatableCaption.of("member.member_added"));
}
}, null);
}, null
);
} catch (final Throwable exception) {
future.completeExceptionally(exception);
return;

View File

@@ -23,6 +23,8 @@ 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.events.PlayerPlotAddRemoveEvent;
import com.plotsquared.core.events.Result;
import com.plotsquared.core.events.TeleportCause;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.permissions.Permission;
@@ -124,21 +126,29 @@ public class Deny extends SubCommand {
);
return;
} else {
if (this.eventDispatcher
.callPlayerDeny(player, plot, uuid, PlayerPlotAddRemoveEvent.Reason.COMMAND)
.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Deny")))
);
continue;
}
if (uuid != DBFunc.EVERYONE) {
plot.removeMember(uuid);
plot.removeTrusted(uuid);
}
plot.addDenied(uuid);
this.eventDispatcher.callDenied(player, plot, uuid, true);
this.eventDispatcher.callPostDenied(player, plot, uuid, true, PlayerPlotAddRemoveEvent.Reason.COMMAND);
if (!uuid.equals(DBFunc.EVERYONE)) {
handleKick(PlotSquared.platform().playerManager().getPlayerIfExists(uuid), plot);
} else {
for (PlotPlayer<?> plotPlayer : plot.getPlayersInPlot()) {
// Ignore plot-owners
if (plot.isAdded(plotPlayer.getUUID())) {
continue;
if (plot.isDenied(plotPlayer.getUUID())) {
handleKick(plotPlayer, plot);
}
handleKick(plotPlayer, plot);
}
}
}

View File

@@ -20,6 +20,8 @@ package com.plotsquared.core.command;
import com.google.inject.Inject;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.events.PlayerPlotAddRemoveEvent;
import com.plotsquared.core.events.Result;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.util.EventDispatcher;
@@ -61,11 +63,22 @@ public class Leave extends Command {
} else {
UUID uuid = player.getUUID();
if (plot.isAdded(uuid)) {
if (this.eventDispatcher
.callPlayerRemove(player, plot, uuid, PlayerPlotAddRemoveEvent.Reason.COMMAND)
.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Leave")))
);
return CompletableFuture.completedFuture(true);
}
if (plot.removeTrusted(uuid)) {
this.eventDispatcher.callTrusted(player, plot, uuid, false);
this.eventDispatcher.callPostTrusted(player, plot, uuid, false, PlayerPlotAddRemoveEvent.Reason.COMMAND);
}
if (plot.removeMember(uuid)) {
this.eventDispatcher.callMember(player, plot, uuid, false);
this.eventDispatcher.callPostAdded(player, plot, uuid, false, PlayerPlotAddRemoveEvent.Reason.COMMAND);
}
player.sendMessage(
TranslatableCaption.of("member.plot_left"),

View File

@@ -21,6 +21,8 @@ package com.plotsquared.core.command;
import com.google.inject.Inject;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.database.DBFunc;
import com.plotsquared.core.events.PlayerPlotAddRemoveEvent;
import com.plotsquared.core.events.Result;
import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
@@ -82,33 +84,48 @@ public class Remove extends SubCommand {
return;
} else if (!uuids.isEmpty()) {
for (UUID uuid : uuids) {
if (this.eventDispatcher
.callPlayerRemove(player, plot, uuid, PlayerPlotAddRemoveEvent.Reason.COMMAND)
.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Remove")))
);
continue;
}
if (plot.getTrusted().contains(uuid)) {
if (plot.removeTrusted(uuid)) {
this.eventDispatcher.callTrusted(player, plot, uuid, false);
this.eventDispatcher.callPostTrusted(player, plot, uuid, false, PlayerPlotAddRemoveEvent.Reason.COMMAND);
count++;
}
} else if (plot.getMembers().contains(uuid)) {
if (plot.removeMember(uuid)) {
this.eventDispatcher.callMember(player, plot, uuid, false);
this.eventDispatcher.callPostAdded(player, plot, uuid, false, PlayerPlotAddRemoveEvent.Reason.COMMAND);
count++;
}
} else if (plot.getDenied().contains(uuid)) {
if (plot.removeDenied(uuid)) {
this.eventDispatcher.callDenied(player, plot, uuid, false);
this.eventDispatcher.callPostDenied(player, plot, uuid, true, PlayerPlotAddRemoveEvent.Reason.COMMAND);
count++;
}
} else if (uuid == DBFunc.EVERYONE) {
count += plot.getTrusted().size();
if (plot.removeTrusted(uuid)) {
this.eventDispatcher.callTrusted(player, plot, uuid, false);
this.eventDispatcher.callPostTrusted(player, plot, uuid, false, PlayerPlotAddRemoveEvent.Reason.COMMAND);
}
count += plot.getMembers().size();
if (plot.removeMember(uuid)) {
this.eventDispatcher.callMember(player, plot, uuid, false);
this.eventDispatcher.callPostAdded(player, plot, uuid, false, PlayerPlotAddRemoveEvent.Reason.COMMAND);
}
count += plot.getDenied().size();
if (plot.removeDenied(uuid)) {
this.eventDispatcher.callDenied(player, plot, uuid, false);
this.eventDispatcher.callPostDenied(player, plot, uuid, true, PlayerPlotAddRemoveEvent.Reason.COMMAND);
}
}
}

View File

@@ -23,6 +23,8 @@ 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.events.PlayerPlotAddRemoveEvent;
import com.plotsquared.core.events.Result;
import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
@@ -150,23 +152,43 @@ public class Trust extends Command {
return;
}
// Success
confirm.run(this, () -> {
for (UUID uuid : uuids) {
if (uuid != DBFunc.EVERYONE) {
if (!currentPlot.removeMember(uuid)) {
if (currentPlot.getDenied().contains(uuid)) {
currentPlot.removeDenied(uuid);
confirm.run(
this, () -> {
for (UUID uuid : uuids) {
if (this.eventDispatcher
.callPlayerTrust(player, currentPlot, uuid, PlayerPlotAddRemoveEvent.Reason.COMMAND)
.getEventResult() == Result.DENY) {
player.sendMessage(
TranslatableCaption.of("events.event_denied"),
TagResolver.resolver("value", Tag.inserting(Component.text("Trust")))
);
return;
}
if (uuid != DBFunc.EVERYONE) {
if (!currentPlot.removeMember(uuid)) {
if (currentPlot.getDenied().contains(uuid)) {
currentPlot.removeDenied(uuid);
}
}
}
currentPlot.addTrusted(uuid);
this.eventDispatcher.callTrusted(player, currentPlot, uuid, true);
this.eventDispatcher.callPostTrusted(
player,
currentPlot,
uuid,
false,
PlayerPlotAddRemoveEvent.Reason.COMMAND
);
player.sendMessage(TranslatableCaption.of("trusted.trusted_added"));
}
}
currentPlot.addTrusted(uuid);
this.eventDispatcher.callTrusted(player, currentPlot, uuid, true);
player.sendMessage(TranslatableCaption.of("trusted.trusted_added"));
}
}, null);
}, null
);
}
future.complete(true);
});
future.complete(true);
}
);
return CompletableFuture.completedFuture(true);
}

View File

@@ -0,0 +1,45 @@
/*
* 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.core.events;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import java.util.UUID;
/**
* Called when a player is going to be added to a plot
*
* @since TODO
*/
public class PlayerPlotAddEvent extends PlayerPlotAddRemoveCancellableEvent {
/**
* Called when a player will be added to a plot
*
* @param initiator Player that initiated the event
* @param plot Plot in which the event occurred
* @param player Player that will be added
* @param reason The reason for the add
*/
public PlayerPlotAddEvent(PlotPlayer<?> initiator, Plot plot, UUID player, Reason reason) {
super(initiator, plot, player, reason);
}
}

View File

@@ -0,0 +1,55 @@
/*
* 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.core.events;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.UUID;
/**
* Parent class for the varies events regarding a player being added/removed/denied/trusted
*
* @since TODO
*/
public class PlayerPlotAddRemoveCancellableEvent extends PlayerPlotAddRemoveEvent implements CancellablePlotEvent {
private Result eventResult;
protected PlayerPlotAddRemoveCancellableEvent(
final PlotPlayer<?> initiator,
Plot plot,
final UUID player,
final Reason reason
) {
super(initiator, plot, player, reason);
}
@Override
public @Nullable Result getEventResult() {
return eventResult;
}
@Override
public void setEventResult(@Nullable final Result eventResult) {
this.eventResult = eventResult;
}
}

View File

@@ -0,0 +1,88 @@
/*
* 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.core.events;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.UUID;
/**
* Parent class for the varies events regarding a player being added/removed/denied/trusted
*
* @since TODO
*/
public class PlayerPlotAddRemoveEvent extends PlotEvent {
private final Reason reason;
private final PlotPlayer<?> initiator;
private final UUID player;
protected PlayerPlotAddRemoveEvent(final PlotPlayer<?> initiator, Plot plot, final UUID player, final Reason reason) {
super(plot);
this.initiator = initiator;
this.player = player;
this.reason = reason;
}
/**
* The player to be added/denied/removed/trusted.
*
* @return UUID
*/
public UUID getPlayer() {
return this.player;
}
/**
* The player initiating the action. May be null (if a player, or a {@link com.plotsquared.core.player.ConsolePlayer}.
*
* @return PlotPlayer
*/
@Nullable
public PlotPlayer<?> getInitiator() {
return this.initiator;
}
/**
* Get the reason the player is being added/removed/denied/trusted
*
* @return Reason
*/
public Reason getReason() {
return this.reason;
}
public enum Reason {
/**
* If a plot merge caused the player to be added/removed/denied/trusted
*/
MERGE,
/**
* If a command caused the player to be added/removed/denied/trusted
*/
COMMAND,
/**
* If something unknown caused the player to be added/removed/denied/trusted
*/
UNKNOWN
}
}

View File

@@ -23,6 +23,10 @@ import com.plotsquared.core.plot.Plot;
import java.util.UUID;
/**
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotDeniedEvent}
*/
@Deprecated(forRemoval = true, since = "TODO")
public class PlayerPlotDeniedEvent extends PlotEvent {
private final PlotPlayer<?> initiator;
@@ -36,7 +40,9 @@ public class PlayerPlotDeniedEvent extends PlotEvent {
* @param plot Plot in which the event occurred
* @param player Player that was denied/un-denied
* @param added {@code true} of add to deny list, {@code false} if removed
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotDeniedEvent}
*/
@Deprecated(forRemoval = true, since = "TODO")
public PlayerPlotDeniedEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added) {
super(plot);
this.initiator = initiator;
@@ -48,7 +54,9 @@ public class PlayerPlotDeniedEvent extends PlotEvent {
* If a user was added.
*
* @return boolean
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotDeniedEvent}
*/
@Deprecated(forRemoval = true, since = "TODO")
public boolean wasAdded() {
return this.added;
}
@@ -57,7 +65,9 @@ public class PlayerPlotDeniedEvent extends PlotEvent {
* The player added/removed.
*
* @return UUID
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotDeniedEvent}
*/
@Deprecated(forRemoval = true, since = "TODO")
public UUID getPlayer() {
return this.player;
}
@@ -66,7 +76,9 @@ public class PlayerPlotDeniedEvent extends PlotEvent {
* The player initiating the action.
*
* @return PlotPlayer
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotDeniedEvent}
*/
@Deprecated(forRemoval = true, since = "TODO")
public PlotPlayer<?> getInitiator() {
return this.initiator;
}

View File

@@ -0,0 +1,45 @@
/*
* 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.core.events;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import java.util.UUID;
/**
* Called when a player is going to be denied from a plot
*
* @since TODO
*/
public class PlayerPlotDenyEvent extends PlayerPlotAddRemoveCancellableEvent {
/**
* Called when a player will be denied from a plot
*
* @param initiator Player that initiated the event
* @param plot Plot in which the event occurred
* @param player Player that will be denied
* @param reason The reason for the deny
*/
public PlayerPlotDenyEvent(PlotPlayer<?> initiator, Plot plot, UUID player, Reason reason) {
super(initiator, plot, player, reason);
}
}

View File

@@ -24,8 +24,9 @@ import com.plotsquared.core.plot.Plot;
import java.util.UUID;
/**
*
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotAddedEvent}
*/
@Deprecated(forRemoval = true, since = "TODO")
public class PlayerPlotHelperEvent extends PlotEvent {
private final PlotPlayer<?> initiator;
@@ -39,7 +40,9 @@ public class PlayerPlotHelperEvent extends PlotEvent {
* @param plot Plot in which the event occurred
* @param player Player that was added/removed from the helper list
* @param added {@code true} if the player was added, {@code false} if the player was removed
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotAddedEvent}
*/
@Deprecated(forRemoval = true, since = "TODO")
public PlayerPlotHelperEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added) {
super(plot);
this.initiator = initiator;
@@ -51,7 +54,9 @@ public class PlayerPlotHelperEvent extends PlotEvent {
* If a player was added
*
* @return boolean
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotAddedEvent}
*/
@Deprecated(forRemoval = true, since = "TODO")
public boolean wasAdded() {
return this.added;
}
@@ -60,7 +65,9 @@ public class PlayerPlotHelperEvent extends PlotEvent {
* The UUID added/removed
*
* @return UUID
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotAddedEvent}
*/
@Deprecated(forRemoval = true, since = "TODO")
public UUID getPlayer() {
return this.player;
}
@@ -69,7 +76,9 @@ public class PlayerPlotHelperEvent extends PlotEvent {
* The player initiating the action
*
* @return PlotPlayer
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotAddedEvent}
*/
@Deprecated(forRemoval = true, since = "TODO")
public PlotPlayer<?> getInitiator() {
return this.initiator;
}

View File

@@ -0,0 +1,45 @@
/*
* 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.core.events;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import java.util.UUID;
/**
* Called when a player is going to be removed from a plot (could be removed from added, trusted, or denied)
*
* @since TODO
*/
public class PlayerPlotRemoveEvent extends PlayerPlotAddRemoveCancellableEvent {
/**
* Called when a player is going to be removed from a plot (could be removed from added, trusted, or denied)
*
* @param initiator Player that initiated the event
* @param plot Plot in which the event occurred
* @param player Player that will be removed
* @param reason The reason for the remove
*/
public PlayerPlotRemoveEvent(PlotPlayer<?> initiator, Plot plot, UUID player, Reason reason) {
super(initiator, plot, player, reason);
}
}

View File

@@ -0,0 +1,45 @@
/*
* 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.core.events;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import java.util.UUID;
/**
* Called when a player is going to be trusted to a plot
*
* @since TODO
*/
public class PlayerPlotTrustEvent extends PlayerPlotAddRemoveCancellableEvent {
/**
* Called when a player will be trusted to a plot
*
* @param initiator Player that initiated the event
* @param plot Plot in which the event occurred
* @param player Player that will be trusted
* @param reason The reason for the trust
*/
public PlayerPlotTrustEvent(PlotPlayer<?> initiator, Plot plot, UUID player, Reason reason) {
super(initiator, plot, player, reason);
}
}

View File

@@ -23,6 +23,10 @@ import com.plotsquared.core.plot.Plot;
import java.util.UUID;
/**
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotTrustedEvent}
*/
@Deprecated(forRemoval = true, since = "TODO")
public class PlayerPlotTrustedEvent extends PlotEvent {
private final PlotPlayer<?> initiator;
@@ -36,7 +40,9 @@ public class PlayerPlotTrustedEvent extends PlotEvent {
* @param plot Plot in which the event occurred
* @param player Player that was added/removed from the trusted list
* @param added {@code true} if the player was added, {@code false} if the player was removed
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotTrustedEvent}
*/
@Deprecated(forRemoval = true, since = "TODO")
public PlayerPlotTrustedEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added) {
super(plot);
this.initiator = initiator;
@@ -48,7 +54,9 @@ public class PlayerPlotTrustedEvent extends PlotEvent {
* If a player was added
*
* @return boolean
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotTrustedEvent}
*/
@Deprecated(forRemoval = true, since = "TODO")
public boolean wasAdded() {
return this.added;
}
@@ -57,7 +65,9 @@ public class PlayerPlotTrustedEvent extends PlotEvent {
* The UUID added/removed
*
* @return UUID
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotTrustedEvent}
*/
@Deprecated(forRemoval = true, since = "TODO")
public UUID getPlayer() {
return this.player;
}
@@ -66,7 +76,9 @@ public class PlayerPlotTrustedEvent extends PlotEvent {
* The player initiating the action
*
* @return PlotPlayer
* @deprecated Use {@link com.plotsquared.core.events.post.PostPlayerPlotTrustedEvent}
*/
@Deprecated(forRemoval = true, since = "TODO")
public PlotPlayer<?> getInitiator() {
return this.initiator;
}

View File

@@ -0,0 +1,56 @@
/*
* 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.core.events.post;
import com.plotsquared.core.events.PlayerPlotAddRemoveEvent;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import java.util.UUID;
/**
* Parent class for events covering players being added/removed to added/trusted/denied lists.
*
* @since TODO
*/
public sealed class PostPlayerPlotAddRemoveEvent extends PlayerPlotAddRemoveEvent permits PostPlayerPlotAddedEvent,
PostPlayerPlotDeniedEvent, PostPlayerPlotTrustedEvent {
private final boolean added;
protected PostPlayerPlotAddRemoveEvent(
final PlotPlayer<?> initiator,
final Plot plot,
final UUID player,
final Reason reason,
boolean added
) {
super(initiator, plot, player, reason);
this.added = added;
}
/**
* Get if the player was added to a list, or removed.
*/
public boolean added() {
return added;
}
}

View File

@@ -0,0 +1,46 @@
/*
* 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.core.events.post;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import java.util.UUID;
/**
* Called when a player is added to a plot
*
* @since TODO
*/
public final class PostPlayerPlotAddedEvent extends PostPlayerPlotAddRemoveEvent {
/**
* PlayerPlotHelperEvent: Called when a player is added to a plot
*
* @param initiator Player that initiated the event
* @param plot Plot in which the event occurred
* @param player Player that was added/removed from the helper list
* @param added {@code true} if the player was added, {@code false} if the player was removed
* @param reason The reason for the add/remove
*/
public PostPlayerPlotAddedEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added, Reason reason) {
super(initiator, plot, player, reason, added);
}
}

View File

@@ -0,0 +1,46 @@
/*
* 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.core.events.post;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import java.util.UUID;
/**
* Called when a player is denied from a plot
*
* @since TODO
*/
public final class PostPlayerPlotDeniedEvent extends PostPlayerPlotAddRemoveEvent {
/**
* PlayerPlotDeniedEvent: Called when the denied UUID list is modified for a plot.
*
* @param initiator Player that initiated the event
* @param plot Plot in which the event occurred
* @param player Player that was denied/un-denied
* @param added {@code true} of add to deny list, {@code false} if removed
* @param reason The reason for the deny/remove
*/
public PostPlayerPlotDeniedEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added, Reason reason) {
super(initiator, plot, player, reason, added);
}
}

View File

@@ -0,0 +1,46 @@
/*
* 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.core.events.post;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import java.util.UUID;
/**
* Called when a plot trusted user is added/removed
*
* @since TODO
*/
public final class PostPlayerPlotTrustedEvent extends PostPlayerPlotAddRemoveEvent {
/**
* PlayerPlotTrustedEvent: Called when a plot trusted user is added/removed
*
* @param initiator Player that initiated the event
* @param plot Plot in which the event occurred
* @param player Player that was added/removed from the trusted list
* @param added {@code true} if the player was added, {@code false} if the player was removed
* @param reason The reason for the trust/remove
*/
public PostPlayerPlotTrustedEvent(PlotPlayer<?> initiator, Plot plot, UUID player, boolean added, Reason reason) {
super(initiator, plot, player, reason, added);
}
}

View File

@@ -164,7 +164,7 @@ public class PlotListener {
try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
Plot last = lastPlot.get().orElse(null);
if ((last != null) && !last.getId().equals(plot.getId())) {
plotExit(player, last);
plotExit(player, last, plot, plot.getArea());
}
if (PlotSquared.platform().expireManager() != null) {
PlotSquared.platform().expireManager().handleEntry(player, plot);
@@ -365,7 +365,12 @@ public class PlotListener {
return true;
}
public boolean plotExit(final PlotPlayer<?> player, Plot plot) {
public boolean plotExit(
final PlotPlayer<?> player,
@NonNull Plot plot,
@Nullable Plot nextPlot,
@Nullable PlotArea nextArea
) {
try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
final Plot previous = lastPlot.remove();
@@ -382,7 +387,9 @@ public class PlotListener {
if (plot.hasOwner()) {
PlotArea pw = plot.getArea();
if (pw == null) {
return true;
if (nextPlot == null || nextPlot.getArea() == null) {
return true;
}
}
try (final MetaDataAccess<Boolean> kickAccess =
player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
@@ -440,11 +447,23 @@ public class PlotListener {
player.setFlight(value.get());
metaDataAccess.remove();
} else {
GameMode gameMode = player.getGameMode();
if (gameMode == GameModes.SURVIVAL || gameMode == GameModes.ADVENTURE) {
player.setFlight(false);
} else if (!player.getFlight()) {
player.setFlight(true);
FlyFlag.FlyStatus flight = FlyFlag.FlyStatus.DEFAULT;
if (nextPlot != null) {
flight = nextPlot.getFlag(FlyFlag.class);
} else if (nextArea != null) {
if (nextArea.isRoadFlags()) {
flight = nextArea.getRoadFlag(FlyFlag.class);
} else {
flight = nextArea.getFlag(FlyFlag.class);
}
}
if (flight != FlyFlag.FlyStatus.ENABLED) {
GameMode gameMode = player.getGameMode();
if (gameMode == GameModes.SURVIVAL || gameMode == GameModes.ADVENTURE) {
player.setFlight(false);
} else if (!player.getFlight()) {
player.setFlight(true);
}
}
}
}

View File

@@ -355,7 +355,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
/**
* {@return the world name at the player's contextual position}
* The contextual position can be affected when using a command with
* an explicit plot override, e.g., `/plot &ltid&gt info`.
* an explicit plot override, e.g., {@code /plot <id> info}.
*/
private @NonNull String getContextualWorldName() {
Plot current = getCurrentPlot();
@@ -368,9 +368,9 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
/**
* {@return the plot area at the player's contextual position}
* The contextual position can be affected when using a command with
* an explicit plot override, e.g., `/plot &ltid&gt info`.
* an explicit plot override, e.g., {@code /plot <id> info}.
*
* @since TODO
* @since 7.5.9
*/
public @Nullable PlotArea getContextualPlotArea() {
Plot current = getCurrentPlot();

View File

@@ -29,6 +29,7 @@ import com.plotsquared.core.configuration.caption.CaptionUtility;
import com.plotsquared.core.configuration.caption.StaticCaption;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.database.DBFunc;
import com.plotsquared.core.events.PlayerPlotAddRemoveEvent;
import com.plotsquared.core.events.PlayerTeleportToPlotEvent;
import com.plotsquared.core.events.Result;
import com.plotsquared.core.events.TeleportCause;
@@ -974,7 +975,10 @@ public class Plot {
* Sets the denied users for this plot.
*
* @param uuids uuids to deny
* @deprecated Use {@link Plot#addDenied(UUID)} (UUID)} calling
* {@link EventDispatcher#callPlayerDeny(PlotPlayer, Plot, UUID, PlayerPlotAddRemoveEvent.Reason)} for each.
*/
@Deprecated
public void setDenied(final @NonNull Set<UUID> uuids) {
boolean larger = uuids.size() > getDenied().size();
HashSet<UUID> intersection;
@@ -1015,7 +1019,10 @@ public class Plot {
* Sets the trusted users for this plot.
*
* @param uuids uuids to trust
* @deprecated Use {@link Plot#addTrusted(UUID)} calling
* {@link EventDispatcher#callPlayerTrust(PlotPlayer, Plot, UUID, PlayerPlotAddRemoveEvent.Reason)} for each.
*/
@Deprecated
public void setTrusted(final @NonNull Set<UUID> uuids) {
boolean larger = uuids.size() > getTrusted().size();
HashSet<UUID> intersection = new HashSet<>(larger ? getTrusted() : uuids);
@@ -1047,7 +1054,10 @@ public class Plot {
* Sets the members for this plot.
*
* @param uuids uuids to set member status for
* @deprecated Use {@link Plot#addMember(UUID)} (UUID)} (UUID)} calling
* {@link EventDispatcher#callPlayerAdd(PlotPlayer, Plot, UUID, PlayerPlotAddRemoveEvent.Reason)} for each.
*/
@Deprecated
public void setMembers(final @NonNull Set<UUID> uuids) {
boolean larger = uuids.size() > getMembers().size();
HashSet<UUID> intersection = new HashSet<>(larger ? getMembers() : uuids);
@@ -1340,7 +1350,7 @@ public class Plot {
for (Plot current : getConnectedPlots()) {
List<PlotPlayer<?>> players = current.getPlayersInPlot();
for (PlotPlayer<?> pp : players) {
this.plotListener.plotExit(pp, current);
this.plotListener.plotExit(pp, current, null, area);
}
if (Settings.Backup.DELETE_ON_UNCLAIM) {
@@ -2302,23 +2312,53 @@ public class Plot {
this.setAlias(plot.getAlias());
}
for (UUID uuid : this.getTrusted()) {
plot.addTrusted(uuid);
if (eventDispatcher
.callPlayerTrust(null, plot, uuid, PlayerPlotAddRemoveEvent.Reason.MERGE)
.getEventResult() != Result.DENY) {
plot.addTrusted(uuid);
eventDispatcher.callPostTrusted(null, plot, uuid, true, PlayerPlotAddRemoveEvent.Reason.MERGE);
}
}
for (UUID uuid : plot.getTrusted()) {
this.addTrusted(uuid);
if (eventDispatcher
.callPlayerTrust(null, this, uuid, PlayerPlotAddRemoveEvent.Reason.MERGE)
.getEventResult() != Result.DENY) {
this.addTrusted(uuid);
eventDispatcher.callPostTrusted(null, this, uuid, true, PlayerPlotAddRemoveEvent.Reason.MERGE);
}
}
for (UUID uuid : this.getMembers()) {
plot.addMember(uuid);
if (eventDispatcher
.callPlayerAdd(null, plot, uuid, PlayerPlotAddRemoveEvent.Reason.MERGE)
.getEventResult() != Result.DENY) {
plot.addMember(uuid);
eventDispatcher.callPostAdded(null, plot, uuid, true, PlayerPlotAddRemoveEvent.Reason.MERGE);
}
}
for (UUID uuid : plot.getMembers()) {
this.addMember(uuid);
if (eventDispatcher
.callPlayerAdd(null, this, uuid, PlayerPlotAddRemoveEvent.Reason.MERGE)
.getEventResult() != Result.DENY) {
this.addMember(uuid);
eventDispatcher.callPostAdded(null, this, uuid, true, PlayerPlotAddRemoveEvent.Reason.MERGE);
}
}
for (UUID uuid : this.getDenied()) {
plot.addDenied(uuid);
if (eventDispatcher
.callPlayerDeny(null, plot, uuid, PlayerPlotAddRemoveEvent.Reason.MERGE)
.getEventResult() != Result.DENY) {
plot.addDenied(uuid);
eventDispatcher.callPostDenied(null, plot, uuid, true, PlayerPlotAddRemoveEvent.Reason.MERGE);
}
}
for (UUID uuid : plot.getDenied()) {
this.addDenied(uuid);
if (eventDispatcher
.callPlayerDeny(null, this, uuid, PlayerPlotAddRemoveEvent.Reason.MERGE)
.getEventResult() != Result.DENY) {
this.addDenied(uuid);
eventDispatcher.callPostDenied(null, this, uuid, true, PlayerPlotAddRemoveEvent.Reason.MERGE);
}
}
}
@@ -2594,7 +2634,7 @@ public class Plot {
public void reEnter() {
TaskManager.runTaskLater(() -> {
for (PlotPlayer<?> pp : Plot.this.getPlayersInPlot()) {
this.plotListener.plotExit(pp, Plot.this);
this.plotListener.plotExit(pp, Plot.this, Plot.this, area);
this.plotListener.plotEntry(pp, Plot.this);
}
}, TaskTime.ticks(1L));

View File

@@ -21,6 +21,7 @@ package com.plotsquared.core.plot;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.inject.Inject;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.collection.QuadMap;
import com.plotsquared.core.configuration.ConfigurationNode;
@@ -29,6 +30,8 @@ import com.plotsquared.core.configuration.ConfigurationUtil;
import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.configuration.file.YamlConfiguration;
import com.plotsquared.core.events.PlayerPlotAddRemoveEvent;
import com.plotsquared.core.events.Result;
import com.plotsquared.core.generator.GridPlotWorld;
import com.plotsquared.core.generator.IndependentPlotGenerator;
import com.plotsquared.core.inject.annotations.WorldConfig;
@@ -47,6 +50,7 @@ import com.plotsquared.core.plot.flag.PlotFlag;
import com.plotsquared.core.plot.flag.implementations.DoneFlag;
import com.plotsquared.core.queue.GlobalBlockQueue;
import com.plotsquared.core.queue.QueueCoordinator;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.MathMan;
import com.plotsquared.core.util.PlotExpression;
import com.plotsquared.core.util.RegionUtil;
@@ -155,6 +159,9 @@ public abstract class PlotArea implements ComponentLike {
private QuadMap<PlotCluster> clusters;
private String signMaterial = "OAK_WALL_SIGN";
private String legacySignMaterial = "WALL_SIGN";
// These will be injected
@Inject
private EventDispatcher eventDispatcher;
public PlotArea(
final @NonNull String worldName, final @Nullable String id,
@@ -1104,9 +1111,44 @@ public abstract class PlotArea implements ComponentLike {
final PlotId id = PlotId.of(x, y);
final Plot plot = getPlotAbs(id);
plot.setTrusted(trusted);
plot.setMembers(members);
plot.setDenied(denied);
Set<UUID> currentlyTrusted = plot.getTrusted();
trusted.forEach(uuid -> {
if (!currentlyTrusted.contains(uuid) && eventDispatcher.callPlayerTrust(
null,
plot,
uuid,
PlayerPlotAddRemoveEvent.Reason.MERGE
).getEventResult() != Result.DENY) {
plot.addTrusted(uuid);
eventDispatcher.callPostTrusted(null, plot, uuid, true, PlayerPlotAddRemoveEvent.Reason.MERGE);
}
});
Set<UUID> currentlyAdded = plot.getMembers();
members.forEach(uuid -> {
if (!currentlyAdded.contains(uuid) && eventDispatcher.callPlayerAdd(
null,
plot,
uuid,
PlayerPlotAddRemoveEvent.Reason.MERGE
).getEventResult() != Result.DENY) {
plot.addMember(uuid);
eventDispatcher.callPostAdded(null, plot, uuid, true, PlayerPlotAddRemoveEvent.Reason.MERGE);
}
});
Set<UUID> currentlyDenied = plot.getDenied();
denied.forEach(uuid -> {
if (!currentlyDenied.contains(uuid) && eventDispatcher.callPlayerDeny(
null,
plot,
uuid,
PlayerPlotAddRemoveEvent.Reason.MERGE
).getEventResult() != Result.DENY) {
plot.addDenied(uuid);
eventDispatcher.callPostDenied(null, plot, uuid, true, PlayerPlotAddRemoveEvent.Reason.MERGE);
}
});
Plot plot2;
if (lx) {

View File

@@ -29,9 +29,14 @@ import com.plotsquared.core.events.PlayerBuyPlotEvent;
import com.plotsquared.core.events.PlayerClaimPlotEvent;
import com.plotsquared.core.events.PlayerEnterPlotEvent;
import com.plotsquared.core.events.PlayerLeavePlotEvent;
import com.plotsquared.core.events.PlayerPlotAddEvent;
import com.plotsquared.core.events.PlayerPlotAddRemoveEvent;
import com.plotsquared.core.events.PlayerPlotDeniedEvent;
import com.plotsquared.core.events.PlayerPlotDenyEvent;
import com.plotsquared.core.events.PlayerPlotHelperEvent;
import com.plotsquared.core.events.PlayerPlotLimitEvent;
import com.plotsquared.core.events.PlayerPlotRemoveEvent;
import com.plotsquared.core.events.PlayerPlotTrustEvent;
import com.plotsquared.core.events.PlayerPlotTrustedEvent;
import com.plotsquared.core.events.PlayerTeleportToPlotEvent;
import com.plotsquared.core.events.PlotAutoMergeEvent;
@@ -51,6 +56,9 @@ import com.plotsquared.core.events.RemoveRoadEntityEvent;
import com.plotsquared.core.events.TeleportCause;
import com.plotsquared.core.events.post.PostPlayerAutoPlotEvent;
import com.plotsquared.core.events.post.PostPlayerBuyPlotEvent;
import com.plotsquared.core.events.post.PostPlayerPlotAddedEvent;
import com.plotsquared.core.events.post.PostPlayerPlotDeniedEvent;
import com.plotsquared.core.events.post.PostPlayerPlotTrustedEvent;
import com.plotsquared.core.events.post.PostPlotChangeOwnerEvent;
import com.plotsquared.core.events.post.PostPlotClearEvent;
import com.plotsquared.core.events.post.PostPlotDeleteEvent;
@@ -258,6 +266,7 @@ public class EventDispatcher {
return event;
}
@Deprecated(forRemoval = true, since = "TODO")
public PlayerPlotDeniedEvent callDenied(
PlotPlayer<?> initiator, Plot plot, UUID player,
boolean added
@@ -267,6 +276,7 @@ public class EventDispatcher {
return event;
}
@Deprecated(forRemoval = true, since = "TODO")
public PlayerPlotTrustedEvent callTrusted(
PlotPlayer<?> initiator, Plot plot, UUID player,
boolean added
@@ -276,6 +286,7 @@ public class EventDispatcher {
return event;
}
@Deprecated(forRemoval = true, since = "TODO")
public PlayerPlotHelperEvent callMember(
PlotPlayer<?> initiator, Plot plot, UUID player,
boolean added
@@ -285,6 +296,62 @@ public class EventDispatcher {
return event;
}
public PostPlayerPlotDeniedEvent callPostDenied(
PlotPlayer<?> initiator, Plot plot, UUID player, boolean added, PlayerPlotAddRemoveEvent.Reason reason
) {
PostPlayerPlotDeniedEvent event = new PostPlayerPlotDeniedEvent(initiator, plot, player, added, reason);
callEvent(event);
return event;
}
public PostPlayerPlotTrustedEvent callPostTrusted(
PlotPlayer<?> initiator, Plot plot, UUID player, boolean added, PlayerPlotAddRemoveEvent.Reason reason
) {
PostPlayerPlotTrustedEvent event = new PostPlayerPlotTrustedEvent(initiator, plot, player, added, reason);
callEvent(event);
return event;
}
public PostPlayerPlotAddedEvent callPostAdded(
PlotPlayer<?> initiator, Plot plot, UUID player, boolean added, PlayerPlotAddRemoveEvent.Reason reason
) {
PostPlayerPlotAddedEvent event = new PostPlayerPlotAddedEvent(initiator, plot, player, added, reason);
callEvent(event);
return event;
}
public PlayerPlotDenyEvent callPlayerDeny(
PlotPlayer<?> initiator, Plot plot, UUID player, PlayerPlotAddRemoveEvent.Reason reason
) {
PlayerPlotDenyEvent event = new PlayerPlotDenyEvent(initiator, plot, player, reason);
callEvent(event);
return event;
}
public PlayerPlotTrustEvent callPlayerTrust(
PlotPlayer<?> initiator, Plot plot, UUID player, PlayerPlotAddRemoveEvent.Reason reason
) {
PlayerPlotTrustEvent event = new PlayerPlotTrustEvent(initiator, plot, player, reason);
callEvent(event);
return event;
}
public PlayerPlotAddEvent callPlayerAdd(
PlotPlayer<?> initiator, Plot plot, UUID player, PlayerPlotAddRemoveEvent.Reason reason
) {
PlayerPlotAddEvent event = new PlayerPlotAddEvent(initiator, plot, player, reason);
callEvent(event);
return event;
}
public PlayerPlotRemoveEvent callPlayerRemove(
PlotPlayer<?> initiator, Plot plot, UUID player, PlayerPlotAddRemoveEvent.Reason reason
) {
PlayerPlotRemoveEvent event = new PlayerPlotRemoveEvent(initiator, plot, player, reason);
callEvent(event);
return event;
}
public PlotChangeOwnerEvent callOwnerChange(
PlotPlayer<?> initiator, Plot plot, UUID oldOwner,
UUID newOwner, boolean hasOldOwner

View File

@@ -265,7 +265,7 @@ public final class PlaceholderRegistry {
* @param key Placeholder key
* @param placeholderFunction Placeholder generator. Cannot return null
* @param requireAbsolute If the plot given to the placeholder should be the absolute (not base) plot
* @since TODO
* @since 7.5.9
*/
public void createPlaceholder(
final @NonNull String key,

View File

@@ -38,7 +38,7 @@ public abstract class PlotSpecificPlaceholder extends Placeholder {
*
* @param key Placeholder key
* @param requireAbsolute If the plot given to the placeholder should be the absolute (not base) plot
* @since TODO
* @since 7.5.9
*/
public PlotSpecificPlaceholder(final @NonNull String key, final boolean requireAbsolute) {
super(key);

View File

@@ -20,7 +20,7 @@ plugins {
}
group = "com.intellectualsites.plotsquared"
version = "7.5.9-SNAPSHOT"
version = "7.5.12-SNAPSHOT"
if (!File("$rootDir/.git").exists()) {
logger.lifecycle("""
@@ -73,8 +73,8 @@ subprojects {
dependencies {
// Tests
testImplementation("org.junit.jupiter:junit-jupiter:6.0.0")
testRuntimeOnly("org.junit.platform:junit-platform-launcher:6.0.0")
testImplementation("org.junit.jupiter:junit-jupiter:6.0.1")
testRuntimeOnly("org.junit.platform:junit-platform-launcher:6.0.1")
}
plugins.withId("java") {
@@ -231,9 +231,10 @@ tasks {
register<RunServer>("runServer-$it") {
dependsOn(getByName("cacheLatestFaweArtifact"))
minecraftVersion(it)
pluginJars(*project(":plotsquared-bukkit").getTasksByName("shadowJar", false)
.map { task -> (task as Jar).archiveFile }
.toTypedArray())
pluginJars(project.files(
project(":plotsquared-bukkit").tasks.named<Jar>("shadowJar")
.map { it.archiveFile }
))
jvmArgs("-DPaper.IgnoreJavaVersion=true", "-Dcom.mojang.eula.agree=true")
downloadPlugins {
url("https://ci.athion.net/job/FastAsyncWorldEdit/lastSuccessfulBuild/artifact/artifacts/${project.ext["faweArtifact"]}")

View File

@@ -3,18 +3,18 @@
paper = "1.20.4-R0.1-SNAPSHOT"
guice = "7.0.0"
spotbugs = "4.9.8"
checkerqual = "3.51.1"
checkerqual = "3.52.1"
gson = "2.10"
guava = "31.1-jre"
snakeyaml = "2.0"
adventure = "4.25.0"
adventure = "4.26.1"
adventure-bukkit = "4.4.1"
log4j = "2.19.0"
# Plugins
worldedit = "7.2.20"
fawe = "2.14.0"
placeholderapi = "2.11.6"
fawe = "2.14.3"
placeholderapi = "2.11.7"
luckperms = "5.5"
essentialsx = "2.21.2"
mvdwapi = "3.1.1"
@@ -33,10 +33,10 @@ vault = "1.7.1"
serverlib = "2.3.7"
# Gradle plugins
shadow = "9.2.2"
shadow = "9.3.0"
grgit = "4.1.1"
spotless = "8.0.0"
publish = "0.34.0"
spotless = "8.1.0"
publish = "0.35.0"
runPaper = "3.0.2"
[libraries]

Binary file not shown.

View File

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