diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ButtonBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ButtonBlockBehavior.java index 5ed09ea2e..fbf644466 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ButtonBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/ButtonBlockBehavior.java @@ -16,10 +16,7 @@ import net.momirealms.craftengine.core.block.properties.BooleanProperty; import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.entity.player.InteractionResult; import net.momirealms.craftengine.core.sound.SoundData; -import net.momirealms.craftengine.core.util.Direction; -import net.momirealms.craftengine.core.util.HorizontalDirection; -import net.momirealms.craftengine.core.util.ResourceConfigUtils; -import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.util.*; import net.momirealms.craftengine.core.world.context.UseOnContext; import javax.annotation.Nullable; @@ -198,13 +195,13 @@ public class ButtonBlockBehavior extends BukkitBlockBehavior { private static class Factory implements BlockBehaviorFactory { - @SuppressWarnings({"unchecked", "DuplicatedCode"}) + @SuppressWarnings("DuplicatedCode") @Override public ButtonBlockBehavior create(CustomBlock block, Map arguments) { BooleanProperty powered = (BooleanProperty) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("powered"), "warning.config.block.behavior.button.missing_powered"); int ticksToStayPressed = ResourceConfigUtils.getAsInt(arguments.getOrDefault("ticks-to-stay-pressed", 30), "ticks-to-stay-pressed"); boolean canButtonBeActivatedByArrows = ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("can-be-activated-by-arrows", true), "can-be-activated-by-arrows"); - Map sounds = (Map) arguments.get("sounds"); + Map sounds = MiscUtils.castToMap(arguments.get("sounds"), true); SoundData buttonClickOnSound = null; SoundData buttonClickOffSound = null; if (sounds != null) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PressurePlateBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PressurePlateBlockBehavior.java index f81776255..85209326e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PressurePlateBlockBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/PressurePlateBlockBehavior.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.bukkit.block.behavior; import io.papermc.paper.event.entity.EntityInsideBlockEvent; import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBlocks; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MEntitySelectors; @@ -15,13 +16,13 @@ import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; import net.momirealms.craftengine.core.block.properties.Property; import net.momirealms.craftengine.core.sound.SoundData; -import net.momirealms.craftengine.core.util.Direction; -import net.momirealms.craftengine.core.util.PressurePlateSensitivity; -import net.momirealms.craftengine.core.util.ResourceConfigUtils; -import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.util.*; import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.WorldEvents; import org.bukkit.GameEvent; +import org.bukkit.block.Block; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; import org.bukkit.util.Vector; import javax.annotation.Nullable; @@ -92,10 +93,16 @@ public class PressurePlateBlockBehavior extends BukkitBlockBehavior { @Override @SuppressWarnings("UnstableApiUsage") public void entityInside(Object thisBlock, Object[] args, Callable superMethod) { - EntityInsideBlockEvent event = new EntityInsideBlockEvent(FastNMS.INSTANCE.method$Entity$getBukkitEntity(args[3]), FastNMS.INSTANCE.method$CraftBlock$at(args[1], args[2])); + Entity entity = FastNMS.INSTANCE.method$Entity$getBukkitEntity(args[3]); + Block block = FastNMS.INSTANCE.method$CraftBlock$at(args[1], args[2]); + EntityInsideBlockEvent event = new EntityInsideBlockEvent(entity, block); if (EventUtils.fireAndCheckCancel(event)) { return; } + boolean canInteract = entity instanceof Player p && !BukkitCraftEngine.instance().antiGriefProvider().canInteract(p, block.getLocation()); + if (canInteract) { + return; + } Object state = args[0]; int signalForState = this.getSignalForState(state); if (signalForState == 0) { @@ -221,13 +228,13 @@ public class PressurePlateBlockBehavior extends BukkitBlockBehavior { private static class Factory implements BlockBehaviorFactory { - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "DuplicatedCode"}) @Override public PressurePlateBlockBehavior create(CustomBlock block, Map arguments) { Property powered = (Property) ResourceConfigUtils.requireNonNullOrThrow(block.getProperty("powered"), "warning.config.block.behavior.pressure_plate.missing_powered"); PressurePlateSensitivity pressurePlateSensitivity = PressurePlateSensitivity.byName(arguments.getOrDefault("sensitivity", "everything").toString()); int pressedTime = ResourceConfigUtils.getAsInt(arguments.getOrDefault("pressed-time", 20), "pressed-time"); - Map sounds = (Map) arguments.get("sounds"); + Map sounds = MiscUtils.castToMap(arguments.get("sounds"), true); SoundData onSound = null; SoundData offSound = null; if (sounds != null) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/entity/SimpleStorageBlockEntity.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/entity/SimpleStorageBlockEntity.java index 706ebf20d..50fa135df 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/entity/SimpleStorageBlockEntity.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/entity/SimpleStorageBlockEntity.java @@ -6,6 +6,7 @@ import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistryOps; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.core.block.ImmutableBlockState; @@ -112,8 +113,8 @@ public class SimpleStorageBlockEntity extends BlockEntity { } } - public void onPlayerClose(Player player) { - if (!isValidContainer()) return; + public void onPlayerClose(@Nullable Player player) { + if (player == null || !isValidContainer()) return; if (!player.isSpectatorMode()) { // 有非观察者的人,那么就不触发关闭音效和事件 for (HumanEntity viewer : this.inventory.getViewers()) { @@ -187,7 +188,9 @@ public class SimpleStorageBlockEntity extends BlockEntity { int validViewers = 0; for (HumanEntity viewer : viewers) { if (viewer instanceof org.bukkit.entity.Player player) { - maxInteractionDistance = Math.max(BukkitAdaptors.adapt(player).getCachedInteractionRange(), maxInteractionDistance); + BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); + if (serverPlayer == null) continue; + maxInteractionDistance = Math.max(serverPlayer.getCachedInteractionRange(), maxInteractionDistance); if (player.getGameMode() != GameMode.SPECTATOR) { validViewers++; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java index 3d32f683c..57c7105ef 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurniture.java @@ -6,6 +6,7 @@ import net.momirealms.craftengine.bukkit.entity.BukkitEntity; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MEntityTypes; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.core.entity.furniture.*; import net.momirealms.craftengine.core.entity.furniture.hitbox.FurnitureHitBoxConfig; @@ -122,7 +123,9 @@ public class BukkitFurniture extends Furniture { this.location = LocationUtils.toLocation(position); Object removePacket = FastNMS.INSTANCE.constructor$ClientboundRemoveEntitiesPacket(MiscUtils.init(new IntArrayList(), l -> l.add(itemDisplay.getEntityId()))); for (Player player : itemDisplay.getTrackedPlayers()) { - BukkitAdaptors.adapt(player).sendPacket(removePacket, false); + BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); + if (serverPlayer == null) continue; + serverPlayer.sendPacket(removePacket, false); } itemDisplay.teleportAsync(this.location).thenAccept(result -> { if (result) { @@ -132,7 +135,9 @@ public class BukkitFurniture extends Furniture { Object addPacket = FastNMS.INSTANCE.constructor$ClientboundAddEntityPacket(itemDisplay.getEntityId(), itemDisplay.getUniqueId(), itemDisplay.getX(), itemDisplay.getY(), itemDisplay.getZ(), itemDisplay.getPitch(), itemDisplay.getYaw(), MEntityTypes.ITEM_DISPLAY, 0, CoreReflections.instance$Vec3$Zero, 0); for (Player player : itemDisplay.getTrackedPlayers()) { - BukkitAdaptors.adapt(player).sendPacket(addPacket, false); + BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); + if (serverPlayer == null) continue; + serverPlayer.sendPacket(addPacket, false); } future.complete(true); } else { @@ -151,8 +156,10 @@ public class BukkitFurniture extends Furniture { Object addPacket = FastNMS.INSTANCE.constructor$ClientboundAddEntityPacket(itemDisplay.getEntityId(), itemDisplay.getUniqueId(), itemDisplay.getX(), itemDisplay.getY(), itemDisplay.getZ(), itemDisplay.getPitch(), itemDisplay.getYaw(), MEntityTypes.ITEM_DISPLAY, 0, CoreReflections.instance$Vec3$Zero, 0); for (Player player : itemDisplay.getTrackedPlayers()) { - BukkitAdaptors.adapt(player).sendPacket(removePacket, false); - BukkitAdaptors.adapt(player).sendPacket(addPacket, false); + BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); + if (serverPlayer == null) continue; + serverPlayer.sendPacket(removePacket, false); + serverPlayer.sendPacket(addPacket, false); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java index e5c9087f6..ec674d5ac 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java @@ -7,6 +7,7 @@ import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MEntityTypes; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.EntityUtils; import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.bukkit.util.LocationUtils; @@ -271,7 +272,9 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager { // 补发一次包,修复 for (Player player : entity.getTrackedPlayers()) { - BukkitAdaptors.adapt(player).sendPacket(FastNMS.INSTANCE.constructor$ClientboundAddEntityPacket( + BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); + if (serverPlayer == null) continue; + serverPlayer.sendPacket(FastNMS.INSTANCE.constructor$ClientboundAddEntityPacket( entity.getEntityId(), entity.getUniqueId(), location.getX(), location.getY(), location.getZ(), location.getPitch(), location.getYaw(), MEntityTypes.ITEM_DISPLAY, 0, CoreReflections.instance$Vec3$Zero, 0 ), false); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java index b46d17d88..4710ae8ca 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java @@ -128,6 +128,7 @@ public class FurnitureEventListener implements Listener { public void onFurniturePreBreak(FurnitureAttemptBreakEvent event) { Player bukkitPlayer = event.getPlayer(); BukkitServerPlayer player = BukkitAdaptors.adapt(bukkitPlayer); + if (player == null) return; Item itemInHand = player.getItemInHand(InteractionHand.MAIN_HAND); if (!BukkitItemUtils.isDebugStick(itemInHand)) return; if (!(player.canInstabuild() && player.hasPermission("minecraft.debugstick")) && !player.hasPermission("minecraft.debugstick.always")) { @@ -159,6 +160,7 @@ public class FurnitureEventListener implements Listener { public void onInteractFurniture(FurnitureInteractEvent event) { Player bukkitPlayer = event.getPlayer(); BukkitServerPlayer player = BukkitAdaptors.adapt(bukkitPlayer); + if (player == null) return; Item itemInHand = player.getItemInHand(InteractionHand.MAIN_HAND); if (!BukkitItemUtils.isDebugStick(itemInHand)) return; if (!(player.canInstabuild() && player.hasPermission("minecraft.debugstick")) && !player.hasPermission("minecraft.debugstick.always")) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java index 564a72662..97722ce75 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/ItemEventListener.java @@ -192,6 +192,11 @@ public class ItemEventListener implements Listener { boolean flag = player.isSneaking() && hasItem; if (!flag) { if (immutableBlockState.behavior() instanceof AbstractBlockBehavior behavior) { + if (!BukkitCraftEngine.instance().antiGriefProvider().canInteract(player, block.getLocation())) { + serverPlayer.updateLastSuccessfulInteractionTick(serverPlayer.gameTicks()); + event.setCancelled(true); + return; + } InteractionResult result = behavior.useOnBlock(useOnContext, immutableBlockState); if (result.success()) { serverPlayer.updateLastSuccessfulInteractionTick(serverPlayer.gameTicks()); @@ -373,8 +378,9 @@ public class ItemEventListener implements Listener { return; Player player = event.getPlayer(); BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); - if (serverPlayer.isSpectatorMode()) + if (serverPlayer == null || serverPlayer.isSpectatorMode()) { return; + } // Gets the item in hand InteractionHand hand = event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; // prevents duplicated events diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java index 82467401f..b06ceb424 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java @@ -481,7 +481,9 @@ public class RecipeEventListener implements Listener { Player player = InventoryUtils.getPlayerFromInventoryEvent(event); - if (finalCost >= maxRepairCost && !BukkitAdaptors.adapt(player).canInstabuild()) { + BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); + if (serverPlayer == null) return; + if (finalCost >= maxRepairCost && !serverPlayer.canInstabuild()) { hasResult = false; } @@ -663,6 +665,7 @@ public class RecipeEventListener implements Listener { Player player = InventoryUtils.getPlayerFromInventoryEvent(event); BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); + if (serverPlayer == null) return; // 对低版本nothing不全的兼容 if (!VersionHelper.isOrAbove1_20_5() && LegacyInventoryUtils.isHotBarSwapAndReadd(action)) { @@ -878,6 +881,7 @@ public class RecipeEventListener implements Listener { org.bukkit.inventory.Recipe recipe = inventory.getRecipe(); Player player = InventoryUtils.getPlayerFromInventoryEvent(event); BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); + if (serverPlayer == null) return; if (recipe instanceof SmithingTransformRecipe transformRecipe) { Key recipeId = KeyUtils.namespacedKey2Key(transformRecipe.getKey()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java index 70d1c6f53..5a6d8b25f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/loot/BukkitVanillaLootManager.java @@ -73,7 +73,7 @@ public class BukkitVanillaLootManager extends AbstractVanillaLootManager impleme if (VersionHelper.isOrAbove1_20_5()) { if (event.getDamageSource().getCausingEntity() instanceof Player player) { optionalPlayer = BukkitAdaptors.adapt(player); - builder.withParameter(DirectContextParameters.PLAYER, optionalPlayer); + builder.withOptionalParameter(DirectContextParameters.PLAYER, optionalPlayer); } } ContextHolder contextHolder = builder.build(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java index 1154fe4ec..c812389d2 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java @@ -48,10 +48,10 @@ import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; -import org.jetbrains.annotations.NotNull; -import org.jspecify.annotations.Nullable; +import org.jetbrains.annotations.Nullable; import java.io.*; import java.net.URL; @@ -424,8 +424,9 @@ public class BukkitCraftEngine extends CraftEngine { } } - public BukkitServerPlayer adapt(@NotNull org.bukkit.entity.Player player) { - Objects.requireNonNull(player, "player cannot be null"); + @Nullable + public BukkitServerPlayer adapt(@Nullable Player player) { + if (player == null) return null; return (BukkitServerPlayer) networkManager().getOnlineUser(player); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java index 0444f9b18..9dacacf3d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java @@ -4,6 +4,7 @@ import net.kyori.adventure.util.Index; import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.command.feature.*; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.core.plugin.command.AbstractCommandManager; import net.momirealms.craftengine.core.plugin.command.CommandFeature; import net.momirealms.craftengine.core.plugin.command.sender.Sender; @@ -87,7 +88,9 @@ public class BukkitCommandManager extends AbstractCommandManager @Override protected Locale getLocale(CommandSender sender) { if (sender instanceof Player player) { - return BukkitAdaptors.adapt(player).selectedLocale(); + BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); + if (serverPlayer == null) return null; + return serverPlayer.selectedLocale(); } return null; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugClearCooldownCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugClearCooldownCommand.java index 757627d11..af3f67529 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugClearCooldownCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugClearCooldownCommand.java @@ -21,6 +21,7 @@ public class DebugClearCooldownCommand extends BukkitCommandFeature { BukkitServerPlayer serverPlayer = plugin().adapt(context.get("player")); + if (serverPlayer == null) return; serverPlayer.cooldown().clearCooldowns(); plugin().senderFactory().wrap(context.sender()).sendMessage(Component.text("Done clearing cooldowns!")); }); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugFurnitureCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugFurnitureCommand.java index ee2ac39d5..9ad27c0c3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugFurnitureCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugFurnitureCommand.java @@ -23,6 +23,7 @@ public class DebugFurnitureCommand extends BukkitCommandFeature { .senderType(Player.class) .handler(context -> { BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(context.sender()); + if (serverPlayer == null) return; boolean b = !serverPlayer.enableFurnitureDebug(); serverPlayer.setEnableFurnitureDebug(b); serverPlayer.sendMessage(Component.text("Furniture Debug Mode: ").append(Component.text(b ? "ON" : "OFF").color(b ? NamedTextColor.GREEN : NamedTextColor.RED)), false); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ItemBrowserAdminCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ItemBrowserAdminCommand.java index 5961dfcec..d7bf104a6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ItemBrowserAdminCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ItemBrowserAdminCommand.java @@ -24,6 +24,7 @@ public class ItemBrowserAdminCommand extends BukkitCommandFeature MultiplePlayerSelector selector = context.get("players"); for (Player player : selector.values()) { BukkitServerPlayer serverPlayer = plugin().adapt(player); + if (serverPlayer == null) return; plugin().itemBrowserManager().open(serverPlayer); } }); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ItemBrowserPlayerCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ItemBrowserPlayerCommand.java index 889d75611..000200793 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ItemBrowserPlayerCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ItemBrowserPlayerCommand.java @@ -21,6 +21,7 @@ public class ItemBrowserPlayerCommand extends BukkitCommandFeature { Player player = context.sender(); BukkitServerPlayer serverPlayer = plugin().adapt(player); + if (serverPlayer == null) return; plugin().itemBrowserManager().open(serverPlayer); }); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SearchRecipeAdminCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SearchRecipeAdminCommand.java index 254a40037..00aedb3cf 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SearchRecipeAdminCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SearchRecipeAdminCommand.java @@ -46,6 +46,7 @@ public class SearchRecipeAdminCommand extends BukkitCommandFeature> inRecipes = plugin().recipeManager().recipeByResult(itemId); if (!inRecipes.isEmpty()) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SearchRecipePlayerCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SearchRecipePlayerCommand.java index e1163bcb0..83e0588aa 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SearchRecipePlayerCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SearchRecipePlayerCommand.java @@ -30,6 +30,7 @@ public class SearchRecipePlayerCommand extends BukkitCommandFeature { Player player = context.sender(); BukkitServerPlayer serverPlayer = plugin().adapt(player); + if (serverPlayer == null) return; Item item = serverPlayer.getItemInHand(InteractionHand.MAIN_HAND); if (ItemUtils.isEmpty(item)) { handleFeedback(context, MessageConstants.COMMAND_SEARCH_RECIPE_NO_ITEM); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SearchUsageAdminCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SearchUsageAdminCommand.java index ee5b93bde..e652b1c93 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SearchUsageAdminCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SearchUsageAdminCommand.java @@ -46,6 +46,7 @@ public class SearchUsageAdminCommand extends BukkitCommandFeature NamespacedKey namespacedKey = context.get("id"); for (Player player : players) { BukkitServerPlayer serverPlayer = plugin().adapt(player); + if (serverPlayer == null) continue; Key itemId = Key.of(namespacedKey.namespace(), namespacedKey.value()); List> inRecipes = plugin().recipeManager().recipeByIngredient(itemId); if (!inRecipes.isEmpty()) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SearchUsagePlayerCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SearchUsagePlayerCommand.java index 9cd21ae36..a416ac1d1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SearchUsagePlayerCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SearchUsagePlayerCommand.java @@ -30,6 +30,7 @@ public class SearchUsagePlayerCommand extends BukkitCommandFeature { Player player = context.sender(); BukkitServerPlayer serverPlayer = plugin().adapt(player); + if (serverPlayer == null) return; Item item = serverPlayer.getItemInHand(InteractionHand.MAIN_HAND); if (ItemUtils.isEmpty(item)) { handleFeedback(context, MessageConstants.COMMAND_SEARCH_USAGE_NO_ITEM); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SetDisplayEntityViewDistanceScaleCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SetDisplayEntityViewDistanceScaleCommand.java index e10907455..9f5acf22f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SetDisplayEntityViewDistanceScaleCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SetDisplayEntityViewDistanceScaleCommand.java @@ -30,6 +30,7 @@ public class SetDisplayEntityViewDistanceScaleCommand extends BukkitCommandFeatu Player player = context.get("player"); double scale = context.get("scale"); BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); + if (serverPlayer == null) return; serverPlayer.setDisplayEntityViewDistanceScale(scale); handleFeedback(context, MessageConstants.COMMAND_DISPLAY_ENTITY_VIEW_DISTANCE_SCALE_SET_SUCCESS, Component.text(scale), Component.text(player.getName())); }); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SetEntityCullingDistanceScaleCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SetEntityCullingDistanceScaleCommand.java index 89968985e..0d9a92796 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SetEntityCullingDistanceScaleCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/SetEntityCullingDistanceScaleCommand.java @@ -30,6 +30,7 @@ public class SetEntityCullingDistanceScaleCommand extends BukkitCommandFeature { return; } BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); + if (serverPlayer == null) return; serverPlayer.setSelectedLocale(locale); handleFeedback(context, MessageConstants.COMMAND_LOCALE_SET_SUCCESS, Component.text(TranslationManager.formatLocale(locale)), Component.text(player.getName())); }); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ToggleEntityCullingCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ToggleEntityCullingCommand.java index 1d8786ec9..d9ba3e737 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ToggleEntityCullingCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ToggleEntityCullingCommand.java @@ -37,6 +37,7 @@ public class ToggleEntityCullingCommand extends BukkitCommandFeature state = context.optional("state"); boolean isEnabled = serverPlayer.enableEntityCulling(); if (state.isPresent()) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TotemAnimationCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TotemAnimationCommand.java index ea75683d3..046f76444 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TotemAnimationCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TotemAnimationCommand.java @@ -93,6 +93,7 @@ public class TotemAnimationCommand extends BukkitCommandFeature { Collection players = selector.values(); for (Player player : players) { BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); + if (serverPlayer == null) continue; Item item = customItem.buildItem(serverPlayer); if (VersionHelper.isOrAbove1_21_2()) { item.setJavaComponent(DataComponentTypes.DEATH_PROTECTION, Map.of()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/UnsetLocaleCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/UnsetLocaleCommand.java index d80adf744..8016756bb 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/UnsetLocaleCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/UnsetLocaleCommand.java @@ -27,6 +27,7 @@ public class UnsetLocaleCommand extends BukkitCommandFeature { .handler(context -> { Player player = context.get("player"); BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); + if (serverPlayer == null) return; serverPlayer.setSelectedLocale(null); handleFeedback(context, MessageConstants.COMMAND_LOCALE_UNSET_SUCCESS, Component.text(player.getName())); }); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlayerUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlayerUtils.java index 96de3b3c8..59f6c93de 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlayerUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlayerUtils.java @@ -38,6 +38,7 @@ public final class PlayerUtils { } public static void giveItem(Player player, Item original, Item item) { + if (player == null) return; Object serverPlayer = player.serverPlayer(); Object inventory = FastNMS.INSTANCE.method$Player$getInventory(serverPlayer); boolean flag = FastNMS.INSTANCE.method$Inventory$add(inventory, item.getLiteralObject());