Compare commits

..

2 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
4e8f775772 Fix NullPointerException when listing plots from console
Co-authored-by: NotMyFault <13383509+NotMyFault@users.noreply.github.com>
2025-09-26 20:10:44 +00:00
copilot-swe-agent[bot]
31d27861e3 Initial plan 2025-09-26 20:04:12 +00:00
30 changed files with 413 additions and 608 deletions

View File

@@ -11,7 +11,7 @@ jobs:
- name: Checkout Repository
uses: actions/checkout@v5
- name: Validate Gradle Wrapper
uses: gradle/actions/wrapper-validation@v5
uses: gradle/actions/wrapper-validation@v4
- name: Setup Java
uses: actions/setup-java@v5
with:

View File

@@ -11,7 +11,7 @@ jobs:
- name: Checkout Repository
uses: actions/checkout@v5
- name: Validate Gradle Wrapper
uses: gradle/actions/wrapper-validation@v5
uses: gradle/actions/wrapper-validation@v4
- name: Setup Java
uses: actions/setup-java@v5
with:

View File

@@ -27,10 +27,10 @@ jobs:
distribution: temurin
java-version: 21
- name: Initialize CodeQL
uses: github/codeql-action/init@v4
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
- name: Autobuild
uses: github/codeql-action/autobuild@v4
uses: github/codeql-action/autobuild@v3
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4
uses: github/codeql-action/analyze@v3

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

@@ -219,7 +219,7 @@ public class BlockEventListener implements Listener {
}
}
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
@EventHandler(priority = EventPriority.LOWEST)
public void blockDestroy(BlockBreakEvent event) {
Player player = event.getPlayer();
Location location = BukkitUtil.adapt(event.getBlock().getLocation());

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();
@@ -160,7 +160,7 @@ public class EntityEventListener implements Listener {
return;
}
}
case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SILVERFISH_BLOCK", "ENDER_PEARL",
case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL",
"TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN", "NETHER_PORTAL",
"FROZEN", "SPELL", "DEFAULT" -> {
if (!area.isMobSpawning()) {
@@ -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;
@@ -124,7 +128,7 @@ public class PaperListener implements Listener {
return;
}
handleEntityMovement(event, event.getEntity().getLocation(), b.getLocation());
handleEntityMovement(event, event.getEntity().getLocation(), b.getLocation());
}
@EventHandler
@@ -178,9 +182,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 +202,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", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL", "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> {
if (!area.isMobSpawning()) {
event.setShouldAbortSpawn(true);
event.setCancelled(true);
@@ -231,23 +233,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 +322,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 +361,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 {
@@ -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

@@ -90,7 +90,7 @@ public class DebugRoadRegen extends SubCommand {
}
public boolean regenPlot(PlotPlayer<?> player) {
PlotArea area = player.getContextualPlotArea();
PlotArea area = player.getCurrentPlot().getArea();
if (area == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
return false;
@@ -145,10 +145,9 @@ public class DebugRoadRegen extends SubCommand {
return false;
}
PlotArea area = player.getContextualPlotArea();
PlotArea area = player.getCurrentPlot().getArea();
if (area == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
return false;
}
Plot plot = player.getCurrentPlot();
PlotManager manager = area.getPlotManager();

View File

@@ -150,8 +150,9 @@ public class ListCmd extends SubCommand {
page = 0;
}
PlotArea area = player.getContextualPlotArea();
String world = area != null ? area.getWorldName() : "";
Plot currentPlot = player.getCurrentPlot();
String world = currentPlot != null ? currentPlot.getWorldName() : null;
PlotArea area = currentPlot != null ? currentPlot.getArea() : null;
String arg = args[0].toLowerCase();
final boolean[] sort = new boolean[]{true};
@@ -226,13 +227,17 @@ public class ListCmd extends SubCommand {
);
return false;
}
if (!player.hasPermission("plots.list.world." + world)) {
if (world != null && !player.hasPermission("plots.list.world." + world)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.world." + world)))
);
return false;
}
if (world == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
return false;
}
plotConsumer.accept(PlotQuery.newQuery().inWorld(world));
}
case "expired" -> {
@@ -257,7 +262,7 @@ public class ListCmd extends SubCommand {
);
return false;
}
if (!player.hasPermission("plots.list.world." + world)) {
if (world != null && !player.hasPermission("plots.list.world." + world)) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission"),
TagResolver.resolver("node", Tag.inserting(Component.text("plots.list.world." + world)))

View File

@@ -68,6 +68,11 @@ public class Load extends SubCommand {
@Override
public boolean onCommand(final PlotPlayer<?> player, final String[] args) {
final String world = player.getCurrentPlot().getWorldName();
if (!this.plotAreaManager.hasPlotArea(world)) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world"));
return false;
}
final Plot plot = player.getCurrentPlot();
if (plot == null) {
player.sendMessage(TranslatableCaption.of("errors.not_in_plot"));

View File

@@ -78,7 +78,7 @@ public class Set extends SubCommand {
@Override
public boolean set(PlotPlayer<?> player, final Plot plot, String value) {
final PlotArea plotArea = player.getContextualPlotArea();
final PlotArea plotArea = player.getCurrentPlot().getArea();
if (plotArea == null) {
return false;
}

View File

@@ -435,11 +435,6 @@ public class Settings extends Config {
public static String SCHEMATICS = "schematics";
public static String TEMPLATES = "templates";
@Comment({"If schematics used for generation should be searched for in the path.schematics location",
" - This setting exists and is `false` by default for backwards compatibility.",
" - If false then generation schematics must be located in `schematics`",
" - Schematics must still always be under GEN_ROAD_SCHEMATIC/<world> etc."})
public static boolean USE_SCHEMATICS_PATH_FOR_GEN_SCHEMATICS = false;
}

View File

@@ -140,8 +140,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
@NonNull
@Override
protected PlotManager createManager() {
return new HybridPlotManager(
this, PlotSquared.platform().regionManager(),
return new HybridPlotManager(this, PlotSquared.platform().regionManager(),
PlotSquared.platform().injector().getInstance(ProgressSubscriberFactory.class)
);
}
@@ -216,16 +215,15 @@ public class HybridPlotWorld extends ClassicPlotWorld {
// Try to determine root. This means that plot areas can have separate schematic
// directories
String schematicFolder = Settings.Paths.USE_SCHEMATICS_PATH_FOR_GEN_SCHEMATICS ? Settings.Paths.SCHEMATICS : "schematics";
if (!(root =
FileUtils.getFile(
PlotSquared.platform().getDirectory(),
schematicFolder + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + this.getWorldName() + File.separator + this.getId()
"schematics/GEN_ROAD_SCHEMATIC/" + this.getWorldName() + "/" + this.getId()
))
.exists()) {
root = FileUtils.getFile(
PlotSquared.platform().getDirectory(),
schematicFolder + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + this.getWorldName()
"schematics/GEN_ROAD_SCHEMATIC/" + this.getWorldName()
);
}

View File

@@ -290,7 +290,8 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
*
* @return the plot the player is standing on or null if standing on a road or not in a {@link PlotArea}
*/
public @Nullable Plot getCurrentPlot() {
@Nullable
public Plot getCurrentPlot() {
try (final MetaDataAccess<Plot> lastPlotAccess =
this.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
if (lastPlotAccess.get().orElse(null) == null && !Settings.Enabled_Components.EVENTS) {
@@ -319,7 +320,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
*/
public int getPlotCount() {
if (!Settings.Limit.GLOBAL) {
return getPlotCount(getContextualWorldName());
return getPlotCount(getCurrentPlot().getWorldName());
}
final AtomicInteger count = new AtomicInteger(0);
final UUID uuid = getUUID();
@@ -339,7 +340,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
public int getClusterCount() {
if (!Settings.Limit.GLOBAL) {
return getClusterCount(getContextualWorldName());
return getClusterCount(getCurrentPlot().getWorldName());
}
final AtomicInteger count = new AtomicInteger(0);
this.plotAreaManager.forEachPlotArea(value -> {
@@ -352,34 +353,6 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
return count.get();
}
/**
* {@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`.
*/
private @NonNull String getContextualWorldName() {
Plot current = getCurrentPlot();
if (current != null) {
return current.getWorldName();
}
return getLocation().getWorldName();
}
/**
* {@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`.
*
* @since TODO
*/
public @Nullable PlotArea getContextualPlotArea() {
Plot current = getCurrentPlot();
if (current != null) {
return current.getArea();
}
return getLocation().getPlotArea();
}
/**
* Get the number of plots this player owns in the world.
*
@@ -710,87 +683,86 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
public void populatePersistentMetaMap() {
if (Settings.Enabled_Components.PERSISTENT_META) {
DBFunc.getPersistentMeta(
getUUID(), new RunnableVal<>() {
@Override
public void run(Map<String, byte[]> value) {
try {
PlotPlayer.this.metaMap = value;
if (value.isEmpty()) {
return;
}
DBFunc.getPersistentMeta(getUUID(), new RunnableVal<>() {
@Override
public void run(Map<String, byte[]> value) {
try {
PlotPlayer.this.metaMap = value;
if (value.isEmpty()) {
return;
}
if (PlotPlayer.this.getAttribute("debug")) {
debugModeEnabled.add(PlotPlayer.this);
}
if (PlotPlayer.this.getAttribute("debug")) {
debugModeEnabled.add(PlotPlayer.this);
}
if (!Settings.Teleport.ON_LOGIN) {
return;
}
PlotAreaManager manager = PlotPlayer.this.plotAreaManager;
if (!Settings.Teleport.ON_LOGIN) {
return;
}
PlotAreaManager manager = PlotPlayer.this.plotAreaManager;
if (!(manager instanceof SinglePlotAreaManager)) {
return;
}
PlotArea area = ((SinglePlotAreaManager) manager).getArea();
boolean V2 = false;
byte[] arr = PlotPlayer.this.getPersistentMeta("quitLoc");
if (arr == null) {
arr = PlotPlayer.this.getPersistentMeta("quitLocV2");
if (arr == null) {
return;
}
V2 = true;
removePersistentMeta("quitLocV2");
} else {
removePersistentMeta("quitLoc");
}
if (!(manager instanceof SinglePlotAreaManager)) {
return;
}
PlotArea area = ((SinglePlotAreaManager) manager).getArea();
boolean V2 = false;
byte[] arr = PlotPlayer.this.getPersistentMeta("quitLoc");
if (arr == null) {
arr = PlotPlayer.this.getPersistentMeta("quitLocV2");
if (arr == null) {
return;
}
V2 = true;
removePersistentMeta("quitLocV2");
} else {
removePersistentMeta("quitLoc");
}
if (!getMeta("teleportOnLogin", true)) {
return;
}
ByteBuffer quitWorld = ByteBuffer.wrap(arr);
final int plotX = quitWorld.getShort();
final int plotZ = quitWorld.getShort();
PlotId id = PlotId.of(plotX, plotZ);
int x = quitWorld.getInt();
int y = V2 ? quitWorld.getShort() : (quitWorld.get() & 0xFF);
int z = quitWorld.getInt();
Plot plot = area.getOwnedPlot(id);
if (!getMeta("teleportOnLogin", true)) {
return;
}
ByteBuffer quitWorld = ByteBuffer.wrap(arr);
final int plotX = quitWorld.getShort();
final int plotZ = quitWorld.getShort();
PlotId id = PlotId.of(plotX, plotZ);
int x = quitWorld.getInt();
int y = V2 ? quitWorld.getShort() : (quitWorld.get() & 0xFF);
int z = quitWorld.getInt();
Plot plot = area.getOwnedPlot(id);
if (plot == null) {
return;
}
if (plot == null) {
return;
}
final Location location = Location.at(plot.getWorldName(), x, y, z);
if (plot.isLoaded()) {
TaskManager.runTask(() -> {
if (getMeta("teleportOnLogin", true)) {
teleport(location, TeleportCause.LOGIN);
sendMessage(
TranslatableCaption.of("teleport.teleported_to_plot"));
}
});
} else if (!PlotSquared.get().isMainThread(Thread.currentThread())) {
if (getMeta("teleportOnLogin", true)) {
plot.teleportPlayer(
PlotPlayer.this,
result -> TaskManager.runTask(() -> {
if (getMeta("teleportOnLogin", true)) {
if (plot.isLoaded()) {
teleport(location, TeleportCause.LOGIN);
sendMessage(TranslatableCaption
.of("teleport.teleported_to_plot"));
}
}
})
);
}
final Location location = Location.at(plot.getWorldName(), x, y, z);
if (plot.isLoaded()) {
TaskManager.runTask(() -> {
if (getMeta("teleportOnLogin", true)) {
teleport(location, TeleportCause.LOGIN);
sendMessage(
TranslatableCaption.of("teleport.teleported_to_plot"));
}
} catch (Throwable e) {
LOGGER.error("Error populating persistent meta for player {}", PlotPlayer.this.getName(), e);
});
} else if (!PlotSquared.get().isMainThread(Thread.currentThread())) {
if (getMeta("teleportOnLogin", true)) {
plot.teleportPlayer(
PlotPlayer.this,
result -> TaskManager.runTask(() -> {
if (getMeta("teleportOnLogin", true)) {
if (plot.isLoaded()) {
teleport(location, TeleportCause.LOGIN);
sendMessage(TranslatableCaption
.of("teleport.teleported_to_plot"));
}
}
})
);
}
}
} catch (Throwable e) {
LOGGER.error("Error populating persistent meta for player {}", PlotPlayer.this.getName(), e);
}
}
}
);
}
@@ -860,8 +832,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
}
@SuppressWarnings("unchecked")
@Nullable
<T> T getPersistentMeta(final @NonNull MetaDataKey<T> key) {
@Nullable <T> T getPersistentMeta(final @NonNull MetaDataKey<T> key) {
final byte[] value = this.getPersistentMeta(key.toString());
if (value == null) {
return null;
@@ -1031,11 +1002,9 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
if (throwable != null) {
sendMessage(
TranslatableCaption.of("errors.error"),
TagResolver.resolver(
"value", Tag.inserting(
Component.text("Failed to resolve asynchronous caption replacements")
)
)
TagResolver.resolver("value", Tag.inserting(
Component.text("Failed to resolve asynchronous caption replacements")
))
);
LOGGER.error("Failed to resolve asynchronous tagresolver(s) for " + caption, throwable);
} else {

View File

@@ -541,7 +541,7 @@ public class Plot {
*
* @return World name
*/
public @NonNull String getWorldName() {
public @Nullable String getWorldName() {
return area.getWorldName();
}

View File

@@ -58,7 +58,7 @@ public class SinglePlot extends Plot {
}
@Override
public @NonNull String getWorldName() {
public String getWorldName() {
return getId().toUnderscoreSeparatedString();
}

View File

@@ -204,9 +204,6 @@ public final class PlaceholderRegistry {
this.createPlaceholder("currentplot_x", (player, plot) -> Integer.toString(plot.getId().getX()));
this.createPlaceholder("currentplot_y", (player, plot) -> Integer.toString(plot.getId().getY()));
this.createPlaceholder("currentplot_xy", (player, plot) -> plot.getId().toString());
this.createPlaceholder("currentplot_abs_x", (player, plot) -> Integer.toString(plot.getId().getX()), true);
this.createPlaceholder("currentplot_abs_y", (player, plot) -> Integer.toString(plot.getId().getY()), true);
this.createPlaceholder("currentplot_abs_xy", (player, plot) -> plot.getId().toString(), true);
this.createPlaceholder("currentplot_rating", (player, plot) -> {
if (Double.isNaN(plot.getAverageRating())) {
return legacyComponent(TranslatableCaption.of("placeholder.nan"), player);
@@ -256,23 +253,7 @@ public final class PlaceholderRegistry {
final @NonNull String key,
final @NonNull BiFunction<PlotPlayer<?>, Plot, String> placeholderFunction
) {
this.createPlaceholder(key, placeholderFunction, false);
}
/**
* Create a functional placeholder
*
* @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
*/
public void createPlaceholder(
final @NonNull String key,
final @NonNull BiFunction<PlotPlayer<?>, Plot, String> placeholderFunction,
final boolean requireAbsolute
) {
this.registerPlaceholder(new PlotSpecificPlaceholder(key, requireAbsolute) {
this.registerPlaceholder(new PlotSpecificPlaceholder(key) {
@Override
public @NonNull String getValue(final @NonNull PlotPlayer<?> player, final @NonNull Plot plot) {
return placeholderFunction.apply(player, plot);

View File

@@ -27,28 +27,14 @@ import org.checkerframework.checker.nullness.qual.NonNull;
*/
public abstract class PlotSpecificPlaceholder extends Placeholder {
private final boolean requireAbsolute;
public PlotSpecificPlaceholder(final @NonNull String key) {
this(key, false);
}
/**
* Create a functional placeholder
*
* @param key Placeholder key
* @param requireAbsolute If the plot given to the placeholder should be the absolute (not base) plot
* @since TODO
*/
public PlotSpecificPlaceholder(final @NonNull String key, final boolean requireAbsolute) {
super(key);
this.requireAbsolute = requireAbsolute;
}
@Override
public @NonNull
final String getValue(final @NonNull PlotPlayer<?> player) {
final Plot plot = requireAbsolute ? player.getLocation().getPlotAbs() : player.getCurrentPlot();
final Plot plot = player.getCurrentPlot();
if (plot == null) {
return "";
}

View File

@@ -65,16 +65,10 @@ subprojects {
plugin<IdeaPlugin>()
}
configurations.matching { it.name == "signatures" }.configureEach {
attributes {
attribute(Attribute.of("signatures-unique", String::class.java), "true")
}
}
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:5.13.4")
testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.13.4")
}
plugins.withId("java") {
@@ -101,15 +95,9 @@ subprojects {
}
}
afterEvaluate {
val javaComponent = components["java"] as AdhocComponentWithVariants
configurations.findByName("shadowRuntimeElements")?.let { shadowRuntimeElements ->
javaComponent.withVariantsFromConfiguration(shadowRuntimeElements) {
skip()
}
} ?: run {
logger.warn("Configuration 'shadowRuntimeElements' does not exist.")
}
val javaComponent = components["java"] as AdhocComponentWithVariants
javaComponent.withVariantsFromConfiguration(configurations["shadowRuntimeElements"]) {
skip()
}
signing {

View File

@@ -2,18 +2,18 @@
# Platform expectations
paper = "1.20.4-R0.1-SNAPSHOT"
guice = "7.0.0"
spotbugs = "4.9.8"
checkerqual = "3.51.1"
spotbugs = "4.9.6"
checkerqual = "3.51.0"
gson = "2.10"
guava = "31.1-jre"
snakeyaml = "2.0"
adventure = "4.25.0"
adventure = "4.24.0"
adventure-bukkit = "4.4.1"
log4j = "2.19.0"
# Plugins
worldedit = "7.2.20"
fawe = "2.14.0"
fawe = "2.13.2"
placeholderapi = "2.11.6"
luckperms = "5.5"
essentialsx = "2.21.2"
@@ -33,11 +33,11 @@ vault = "1.7.1"
serverlib = "2.3.7"
# Gradle plugins
shadow = "9.2.2"
shadow = "8.3.9"
grgit = "4.1.1"
spotless = "8.0.0"
spotless = "7.2.1"
publish = "0.34.0"
runPaper = "3.0.2"
runPaper = "2.3.1"
[libraries]
# Platform expectations

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-8.14.3-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

5
gradlew vendored
View File

@@ -1,7 +1,7 @@
#!/bin/sh
#
# Copyright © 2015 the original authors.
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -114,6 +114,7 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM.
@@ -171,6 +172,7 @@ fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
@@ -210,6 +212,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"

3
gradlew.bat vendored
View File

@@ -70,10 +70,11 @@ goto fail
:execute
@rem Setup the command line
set CLASSPATH=
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell