diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/mythicmobs/MythicItemDrop.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/mythicmobs/MythicItemDrop.java index 8b151df79..634f341c2 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/mythicmobs/MythicItemDrop.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/mythicmobs/MythicItemDrop.java @@ -9,7 +9,7 @@ import io.lumine.mythic.api.skills.SkillCaster; import io.lumine.mythic.bukkit.BukkitAdapter; import io.lumine.mythic.bukkit.adapters.BukkitItemStack; import io.lumine.mythic.core.drops.droppables.ItemDrop; -import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.core.item.CustomItem; import net.momirealms.craftengine.core.item.ItemBuildContext; import net.momirealms.craftengine.core.plugin.CraftEngine; @@ -38,7 +38,7 @@ public class MythicItemDrop extends ItemDrop implements IItemDrop { if (caster != null && caster.getEntity() instanceof AbstractPlayer abstractPlayer) { Entity bukkitEntity = abstractPlayer.getBukkitEntity(); if (bukkitEntity instanceof Player bukkitPlayer) { - var player = BukkitCraftEngine.instance().adapt(bukkitPlayer); + var player = BukkitAdaptors.adapt(bukkitPlayer); context = ItemBuildContext.of(player); } } diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/condition/CondIsFurniture.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/condition/CondIsFurniture.java index 287596ff4..96b57c2d5 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/condition/CondIsFurniture.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/condition/CondIsFurniture.java @@ -12,8 +12,6 @@ import org.bukkit.entity.Entity; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; -import java.util.function.Predicate; - public class CondIsFurniture extends Condition { public static void register() { diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/event/EvtCustomBlock.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/event/EvtCustomBlock.java index 14a2dbdd4..93174f608 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/event/EvtCustomBlock.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/event/EvtCustomBlock.java @@ -10,8 +10,6 @@ import ch.njol.skript.lang.SkriptParser; import ch.njol.skript.registrations.EventValues; import net.momirealms.craftengine.bukkit.api.event.CustomBlockBreakEvent; import net.momirealms.craftengine.bukkit.api.event.CustomBlockPlaceEvent; -import net.momirealms.craftengine.bukkit.api.event.FurnitureBreakEvent; -import net.momirealms.craftengine.bukkit.api.event.FurniturePlaceEvent; import net.momirealms.craftengine.bukkit.util.BlockStateUtils; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.block.UnsafeBlockStateMatcher; @@ -19,7 +17,6 @@ import net.momirealms.craftengine.core.entity.player.InteractionHand; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Block; -import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/event/EvtCustomClick.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/event/EvtCustomClick.java index d9b04c7ab..86b66d401 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/event/EvtCustomClick.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/event/EvtCustomClick.java @@ -11,7 +11,6 @@ import ch.njol.skript.lang.SkriptEvent; import ch.njol.skript.lang.SkriptParser; import ch.njol.skript.registrations.EventValues; import net.momirealms.craftengine.bukkit.api.event.CustomBlockInteractEvent; -import net.momirealms.craftengine.bukkit.api.event.FurnitureBreakEvent; import net.momirealms.craftengine.bukkit.api.event.FurnitureInteractEvent; import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.block.UnsafeBlockStateMatcher; diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/event/EvtCustomFurniture.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/event/EvtCustomFurniture.java index e45b73a54..2afbea401 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/event/EvtCustomFurniture.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/skript/event/EvtCustomFurniture.java @@ -8,8 +8,6 @@ import ch.njol.skript.lang.Literal; import ch.njol.skript.lang.SkriptEvent; import ch.njol.skript.lang.SkriptParser; import ch.njol.skript.registrations.EventValues; -import io.papermc.paper.event.player.PlayerTrackEntityEvent; -import net.momirealms.craftengine.bukkit.api.event.CustomBlockInteractEvent; import net.momirealms.craftengine.bukkit.api.event.FurnitureBreakEvent; import net.momirealms.craftengine.bukkit.api.event.FurniturePlaceEvent; import org.bukkit.Location; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java index 085c0059b..7052fc484 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.bukkit.block; import io.papermc.paper.event.block.BlockBreakBlockEvent; +import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.api.event.CustomBlockBreakEvent; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; @@ -56,7 +57,7 @@ public final class BlockEventListener implements Listener { public void onPlayerAttack(EntityDamageByEntityEvent event) { if (!VersionHelper.isOrAbove1_20_5()) { if (event.getDamager() instanceof Player player) { - BukkitServerPlayer serverPlayer = plugin.adapt(player); + BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); serverPlayer.setClientSideCanBreakBlock(true); } } @@ -65,7 +66,7 @@ public final class BlockEventListener implements Listener { @EventHandler(ignoreCancelled = true) public void onPlaceBlock(BlockPlaceEvent event) { Player player = event.getPlayer(); - BukkitServerPlayer serverPlayer = plugin.adapt(player); + BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); // send swing if player is clicking a replaceable block if (serverPlayer.shouldResendSwing()) { player.swingHand(event.getHand()); @@ -112,7 +113,7 @@ public final class BlockEventListener implements Listener { int stateId = BlockStateUtils.blockStateToId(blockState); Player player = event.getPlayer(); Location location = block.getLocation(); - BukkitServerPlayer serverPlayer = this.plugin.adapt(player); + BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); net.momirealms.craftengine.core.world.World world = new BukkitWorld(player.getWorld()); WorldPosition position = new WorldPosition(world, location.getBlockX() + 0.5, location.getBlockY() + 0.5, location.getBlockZ() + 0.5); Item itemInHand = serverPlayer.getItemInHand(InteractionHand.MAIN_HAND); @@ -246,7 +247,7 @@ public final class BlockEventListener implements Listener { Location location = player.getLocation(); ImmutableBlockState state = optionalCustomState.get(); Cancellable cancellable = Cancellable.of(event::isCancelled, event::setCancelled); - state.owner().value().execute(PlayerOptionalContext.of(this.plugin.adapt(player), ContextHolder.builder() + state.owner().value().execute(PlayerOptionalContext.of(BukkitAdaptors.adapt(player), ContextHolder.builder() .withParameter(DirectContextParameters.EVENT, cancellable) .withParameter(DirectContextParameters.POSITION, new WorldPosition(new BukkitWorld(event.getWorld()), LocationUtils.toVec3d(location))) .withParameter(DirectContextParameters.BLOCK, new BukkitBlockInWorld(block)) 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 798f5c105..d9fb9c01d 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 @@ -1,11 +1,13 @@ package net.momirealms.craftengine.bukkit.entity.furniture; +import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.entity.furniture.hitbox.InteractionHitBox; import net.momirealms.craftengine.bukkit.nms.CollisionEntity; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.network.handler.FurniturePacketHandler; 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; @@ -207,15 +209,16 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager { BukkitFurniture furniture = addNewFurniture(display, customFurniture); furniture.initializeColliders(); for (Player player : display.getTrackedPlayers()) { - this.plugin.adapt(player).entityPacketHandlers().computeIfAbsent(furniture.baseEntityId(), k -> new FurniturePacketHandler(furniture.fakeEntityIds())); - this.plugin.networkManager().sendPacket(this.plugin.adapt(player), furniture.spawnPacket(player)); + BukkitAdaptors.adapt(player).entityPacketHandlers().computeIfAbsent(furniture.baseEntityId(), k -> new FurniturePacketHandler(furniture.fakeEntityIds())); + this.plugin.networkManager().sendPacket(BukkitAdaptors.adapt(player), furniture.spawnPacket(player)); } } } else { BukkitFurniture furniture = addNewFurniture(display, customFurniture); for (Player player : display.getTrackedPlayers()) { - this.plugin.adapt(player).entityPacketHandlers().computeIfAbsent(furniture.baseEntityId(), k -> new FurniturePacketHandler(furniture.fakeEntityIds())); - this.plugin.networkManager().sendPacket(this.plugin.adapt(player), furniture.spawnPacket(player)); + BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); + serverPlayer.entityPacketHandlers().computeIfAbsent(furniture.baseEntityId(), k -> new FurniturePacketHandler(furniture.fakeEntityIds())); + this.plugin.networkManager().sendPacket(serverPlayer, furniture.spawnPacket(player)); } if (preventChange) { this.plugin.scheduler().sync().runLater(furniture::initializeColliders, 1, location.getWorld(), location.getBlockX() >> 4, location.getBlockZ() >> 4); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java index 794c0e81a..f6304a758 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java @@ -5,6 +5,7 @@ import com.google.gson.JsonObject; import io.papermc.paper.event.player.AsyncChatCommandDecorateEvent; import io.papermc.paper.event.player.AsyncChatDecorateEvent; import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.reflection.paper.PaperReflections; import net.momirealms.craftengine.bukkit.util.ComponentUtils; @@ -143,7 +144,7 @@ public class BukkitFontManager extends AbstractFontManager implements Listener { if (renameText == null || renameText.isEmpty()) return; Component itemName = Component.text(renameText); - EmojiComponentProcessResult replaceProcessResult = replaceComponentEmoji(itemName, this.plugin.adapt(player), renameText); + EmojiComponentProcessResult replaceProcessResult = replaceComponentEmoji(itemName, BukkitAdaptors.adapt(player), renameText); if (replaceProcessResult.changed()) { Item wrapped = this.plugin.itemManager().wrap(result); wrapped.customNameJson(AdventureHelper.componentToJson(replaceProcessResult.newText())); @@ -160,7 +161,7 @@ public class BukkitFontManager extends AbstractFontManager implements Listener { JsonElement json = ComponentUtils.paperAdventureToJsonElement(lines.get(i)); if (json == null) continue; Component line = AdventureHelper.jsonElementToComponent(json); - EmojiComponentProcessResult result = replaceComponentEmoji(line, plugin.adapt(player)); + EmojiComponentProcessResult result = replaceComponentEmoji(line, BukkitAdaptors.adapt(player)); if (result.changed()) { try { PaperReflections.method$SignChangeEvent$line.invoke(event, i, ComponentUtils.jsonElementToPaperAdventure(AdventureHelper.componentToJsonElement(result.newText()))); @@ -191,7 +192,7 @@ public class BukkitFontManager extends AbstractFontManager implements Listener { for (int i = 0; i < pages.size(); i++) { JsonElement json = ComponentUtils.paperAdventureToJsonElement(pages.get(i)); Component page = AdventureHelper.jsonElementToComponent(json); - EmojiComponentProcessResult result = replaceComponentEmoji(page, plugin.adapt(player)); + EmojiComponentProcessResult result = replaceComponentEmoji(page, BukkitAdaptors.adapt(player)); if (result.changed()) { changed = true; try { @@ -214,7 +215,7 @@ public class BukkitFontManager extends AbstractFontManager implements Listener { Object originalMessage = PaperReflections.field$AsyncChatDecorateEvent$originalMessage.get(event); String rawJsonMessage = ComponentUtils.paperAdventureToJson(originalMessage); if (Config.allowEmojiChat()) { - EmojiTextProcessResult processResult = replaceJsonEmoji(rawJsonMessage, this.plugin.adapt(player)); + EmojiTextProcessResult processResult = replaceJsonEmoji(rawJsonMessage, BukkitAdaptors.adapt(player)); boolean hasChanged = processResult.replaced(); if (!player.hasPermission(FontManager.BYPASS_CHAT)) { IllegalCharacterProcessResult result = processIllegalCharacters(processResult.text()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java index 26d9cb05a..8b8df50b4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/listener/DebugStickListener.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.bukkit.item.listener; import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.nms.FastNMS; @@ -49,7 +50,7 @@ public class DebugStickListener implements Listener { Material material = itemInHand.getType(); if (material != Material.DEBUG_STICK) return; Player bukkitPlayer = event.getPlayer(); - BukkitServerPlayer player = this.plugin.adapt(bukkitPlayer); + BukkitServerPlayer player = BukkitAdaptors.adapt(bukkitPlayer); if (!(player.canInstabuild() && player.hasPermission("minecraft.debugstick")) && !player.hasPermission("minecraft.debugstick.always")) { return; } 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 ab5660c90..76f05c35a 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 @@ -1,6 +1,7 @@ package net.momirealms.craftengine.bukkit.item.listener; import io.papermc.paper.event.block.CompostItemEvent; +import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.api.event.CustomBlockInteractEvent; import net.momirealms.craftengine.bukkit.item.BukkitCustomItem; import net.momirealms.craftengine.bukkit.nms.FastNMS; @@ -69,7 +70,7 @@ public class ItemEventListener implements Listener { public void onInteractEntity(PlayerInteractEntityEvent event) { Player player = event.getPlayer(); Entity entity = event.getRightClicked(); - BukkitServerPlayer serverPlayer = this.plugin.adapt(player); + BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); if (serverPlayer == null) return; InteractionHand hand = event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; @@ -107,7 +108,7 @@ public class ItemEventListener implements Listener { return; } - BukkitServerPlayer serverPlayer = this.plugin.adapt(player); + BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); if (serverPlayer == null) return; InteractionHand hand = event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; // 如果本tick内主手已被处理,则不处理副手 @@ -349,7 +350,7 @@ public class ItemEventListener implements Listener { if (action != Action.RIGHT_CLICK_AIR && action != Action.LEFT_CLICK_AIR) return; Player player = event.getPlayer(); - BukkitServerPlayer serverPlayer = this.plugin.adapt(player); + BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); if (serverPlayer.isSpectatorMode()) return; // Gets the item in hand @@ -411,7 +412,7 @@ public class ItemEventListener implements Listener { } Cancellable cancellable = Cancellable.of(event::isCancelled, event::setCancelled); CustomItem customItem = optionalCustomItem.get(); - PlayerOptionalContext context = PlayerOptionalContext.of(this.plugin.adapt(event.getPlayer()), ContextHolder.builder() + PlayerOptionalContext context = PlayerOptionalContext.of(BukkitAdaptors.adapt(event.getPlayer()), ContextHolder.builder() .withParameter(DirectContextParameters.ITEM_IN_HAND, wrapped) .withParameter(DirectContextParameters.EVENT, cancellable) .withParameter(DirectContextParameters.HAND, event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND) @@ -425,7 +426,7 @@ public class ItemEventListener implements Listener { if (replacement == null) { event.setReplacement(null); } else { - ItemStack replacementItem = this.plugin.itemManager().buildItemStack(replacement, this.plugin.adapt(event.getPlayer())); + ItemStack replacementItem = this.plugin.itemManager().buildItemStack(replacement, BukkitAdaptors.adapt(event.getPlayer())); event.setReplacement(replacementItem); } } @@ -516,7 +517,7 @@ public class ItemEventListener implements Listener { if (optionalCustomItem.isEmpty()) return; BukkitCustomItem customItem = (BukkitCustomItem) optionalCustomItem.get(); if (customItem.clientItem() == FastNMS.INSTANCE.method$ItemStack$getItem(wrapped.getLiteralObject())) return; - BukkitServerPlayer serverPlayer = this.plugin.adapt(player); + BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); if (serverPlayer == null) return; this.plugin.scheduler().sync().runDelayed(() -> { Object container = FastNMS.INSTANCE.field$Player$containerMenu(serverPlayer.serverPlayer()); 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 eb1004ba3..5b6359d3f 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 @@ -2,6 +2,7 @@ package net.momirealms.craftengine.bukkit.item.recipe; import com.destroystokyo.paper.event.inventory.PrepareResultEvent; import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.item.ComponentTypes; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; @@ -455,7 +456,7 @@ public class RecipeEventListener implements Listener { Player player = InventoryUtils.getPlayerFromInventoryEvent(event); - if (finalCost >= maxRepairCost && !plugin.adapt(player).canInstabuild()) { + if (finalCost >= maxRepairCost && !BukkitAdaptors.adapt(player).canInstabuild()) { hasResult = false; } @@ -548,7 +549,7 @@ public class RecipeEventListener implements Listener { return; } Player player = InventoryUtils.getPlayerFromInventoryEvent(event); - Item newItem = customItemOptional.get().buildItem(plugin.adapt(player)); + Item newItem = customItemOptional.get().buildItem(BukkitAdaptors.adapt(player)); newItem.maxDamage(max); newItem.damage(Math.max(max - finalDurability, 0)); inventory.setResult(newItem.getItem()); @@ -597,7 +598,7 @@ public class RecipeEventListener implements Listener { CraftingInput input = getCraftingInput(inventory); if (input == null) return; Player player = InventoryUtils.getPlayerFromInventoryEvent(event); - BukkitServerPlayer serverPlayer = this.plugin.adapt(player); + BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); inventory.setResult(craftingTableRecipe.assemble(input, new ItemBuildContext(serverPlayer, ContextHolder.EMPTY))); } @@ -650,7 +651,7 @@ public class RecipeEventListener implements Listener { SmithingInput input = getSmithingInput(inventory); if (smithingTrimRecipe.matches(input)) { Player player = InventoryUtils.getPlayerFromInventoryEvent(event); - ItemStack result = smithingTrimRecipe.assemble(getSmithingInput(inventory), new ItemBuildContext(this.plugin.adapt(player), ContextHolder.EMPTY)); + ItemStack result = smithingTrimRecipe.assemble(getSmithingInput(inventory), new ItemBuildContext(BukkitAdaptors.adapt(player), ContextHolder.EMPTY)); event.setResult(result); } else { event.setResult(null); @@ -674,7 +675,7 @@ public class RecipeEventListener implements Listener { SmithingInput input = getSmithingInput(inventory); if (smithingTransformRecipe.matches(input)) { Player player = InventoryUtils.getPlayerFromInventoryEvent(event); - ItemStack processed = smithingTransformRecipe.assemble(input, new ItemBuildContext(this.plugin.adapt(player), ContextHolder.EMPTY)); + ItemStack processed = smithingTransformRecipe.assemble(input, new ItemBuildContext(BukkitAdaptors.adapt(player), ContextHolder.EMPTY)); event.setResult(processed); } else { event.setResult(null); 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 3aeeb074b..9dc95e83b 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 @@ -1,5 +1,6 @@ package net.momirealms.craftengine.bukkit.loot; +import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBlocks; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; @@ -72,7 +73,7 @@ public class BukkitVanillaLootManager extends AbstractVanillaLootManager impleme BukkitServerPlayer optionalPlayer = null; if (VersionHelper.isOrAbove1_20_5()) { if (event.getDamageSource().getCausingEntity() instanceof Player player) { - optionalPlayer = this.plugin.adapt(player); + optionalPlayer = BukkitAdaptors.adapt(player); builder.withParameter(DirectContextParameters.PLAYER, optionalPlayer); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java index 0cea939f3..0ce69f22c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java @@ -1,5 +1,6 @@ package net.momirealms.craftengine.bukkit.pack; +import net.momirealms.craftengine.bukkit.api.BukkitAdaptors; import net.momirealms.craftengine.bukkit.api.event.AsyncResourcePackGenerateEvent; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.command.feature.ReloadCommand; @@ -43,7 +44,7 @@ public class BukkitPackManager extends AbstractPackManager implements Listener { @EventHandler(priority = EventPriority.LOW) public void onPlayerJoin(PlayerJoinEvent event) { if (Config.sendPackOnJoin() && !VersionHelper.isOrAbove1_20_2()) { - Player player = plugin.adapt(event.getPlayer()); + Player player = BukkitAdaptors.adapt(event.getPlayer()); this.sendResourcePack(player); } } 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 3c87fe07c..6c882875a 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 @@ -50,6 +50,7 @@ import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; import org.jspecify.annotations.Nullable; import java.io.*; @@ -58,7 +59,6 @@ import java.net.URLConnection; import java.nio.file.Path; import java.util.List; import java.util.Objects; -import java.util.Optional; @SuppressWarnings("unchecked") public class BukkitCraftEngine extends CraftEngine { @@ -363,11 +363,9 @@ public class BukkitCraftEngine extends CraftEngine { } } - public BukkitServerPlayer adapt(org.bukkit.entity.Player player) { - if (player == null) return null; - return Optional.ofNullable((BukkitServerPlayer) networkManager().getOnlineUser(player)).orElseGet( - () -> (BukkitServerPlayer) networkManager().getUser(player) - ); + public BukkitServerPlayer adapt(@NotNull org.bukkit.entity.Player player) { + Objects.requireNonNull(player, "player cannot be null"); + return (BukkitServerPlayer) networkManager().getOnlineUser(player); } public AntiGriefLib antiGriefProvider() { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GetItemCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GetItemCommand.java index 4005e7e5d..4c9143aab 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GetItemCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GetItemCommand.java @@ -4,7 +4,6 @@ import net.kyori.adventure.text.Component; import net.momirealms.craftengine.bukkit.api.CraftEngineItems; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; -import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.PlayerUtils; import net.momirealms.craftengine.core.item.CustomItem; import net.momirealms.craftengine.core.plugin.CraftEngine; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GiveItemCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GiveItemCommand.java index 430ee64be..6f546d394 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GiveItemCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GiveItemCommand.java @@ -28,7 +28,6 @@ import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.SuggestionProvider; import java.util.Collection; -import java.util.Optional; import java.util.concurrent.CompletableFuture; public class GiveItemCommand extends BukkitCommandFeature { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java index 161171c20..1f1a9d666 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java @@ -1,7 +1,6 @@ package net.momirealms.craftengine.bukkit.plugin.command.feature; import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; -import net.momirealms.craftengine.bukkit.plugin.network.BukkitNetworkManager; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; import org.bukkit.command.CommandSender; @@ -19,8 +18,6 @@ public class TestCommand extends BukkitCommandFeature { return builder .senderType(Player.class) .handler(context -> { - Player player = context.sender(); - player.sendMessage("客户端模组状态: " + BukkitNetworkManager.instance().getUser(player).clientModEnabled()); }); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index 7b3928905..e98de26d8 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -12,9 +12,11 @@ import net.momirealms.craftengine.bukkit.plugin.network.id.PacketIdFinder; import net.momirealms.craftengine.bukkit.plugin.network.id.PacketIds1_20; import net.momirealms.craftengine.bukkit.plugin.network.id.PacketIds1_20_5; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.LeavesReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.LibraryReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.bukkit.plugin.user.FakeBukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.context.CooldownData; @@ -142,6 +144,47 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } catch (ReflectiveOperationException e) { throw new RuntimeException("Failed to init server connection", e); } + // Inject Leaves bot list + if (VersionHelper.isLeaves()) { + this.injectLeavesBotList(); + } + } + + public static BukkitNetworkManager instance() { + return instance; + } + + public void addFakePlayer(Player player) { + FakeBukkitServerPlayer fakePlayer = new FakeBukkitServerPlayer(this.plugin); + fakePlayer.setPlayer(player); + this.onlineUsers.put(player.getUniqueId(), fakePlayer); + this.resetUserArray(); + } + + public boolean removeFakePlayer(Player player) { + BukkitServerPlayer fakePlayer = this.onlineUsers.get(player.getUniqueId()); + if (!(fakePlayer instanceof FakeBukkitServerPlayer)) { + return false; + } + this.onlineUsers.remove(player.getUniqueId()); + this.resetUserArray(); + this.saveCooldown(player, fakePlayer.cooldown()); + return true; + } + + @SuppressWarnings("unchecked") + private void injectLeavesBotList() { + try { + Object botList = LeavesReflections.field$BotList$INSTANCE.get(null); + List bots = (List) LeavesReflections.field$BotList$bots.get(botList); + ListMonitor monitor = new ListMonitor<>(bots, + (bot) -> addFakePlayer(FastNMS.INSTANCE.method$ServerPlayer$getBukkitEntity(bot)), + (bot) -> removeFakePlayer(FastNMS.INSTANCE.method$ServerPlayer$getBukkitEntity(bot)) + ); + LeavesReflections.field$BotList$bots.set(botList, monitor); + } catch (ReflectiveOperationException e) { + this.plugin.logger().severe("Failed to inject leaves bot list"); + } } private void registerPacketHandlers() { @@ -203,10 +246,6 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerC2SByteBufPacketConsumer(PacketConsumers.INTERACT_ENTITY, this.packetIds.serverboundInteractPacket()); } - public static BukkitNetworkManager instance() { - return instance; - } - @EventHandler(priority = EventPriority.LOWEST) public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); @@ -215,10 +254,10 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes user.setPlayer(player); this.onlineUsers.put(player.getUniqueId(), user); this.resetUserArray(); + // folia在此tick每个玩家 if (VersionHelper.isFolia()) { player.getScheduler().runAtFixedRate(plugin.javaPlugin(), (t) -> user.tick(), - () -> { - }, 1, 1); + () -> {}, 1, 1); } } } @@ -282,7 +321,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } @Override - public NetWorkUser getUser(Channel channel) { + public NetWorkUser getUser(@NotNull Channel channel) { ChannelPipeline pipeline = channel.pipeline(); return this.users.get(pipeline); } @@ -298,14 +337,18 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes return getChannel((Player) player.platformPlayer()); } + @Nullable public NetWorkUser getUser(Player player) { return getUser(getChannel(player)); } + @Nullable public NetWorkUser getOnlineUser(Player player) { return this.onlineUsers.get(player.getUniqueId()); } + // 当假人的时候channel为null + @NotNull public Channel getChannel(Player player) { return FastNMS.INSTANCE.field$Connection$channel( FastNMS.INSTANCE.field$ServerGamePacketListenerImpl$connection( @@ -318,6 +361,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes @Override public void sendPacket(@NotNull NetWorkUser player, Object packet, boolean immediately, Runnable sendListener) { + if (player.isFakePlayer()) return; if (immediately) { this.immediatePacketConsumer.accept(player.nettyChannel(), packet, sendListener); } else { @@ -327,6 +371,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes @Override public void sendPackets(@NotNull NetWorkUser player, List packet, boolean immediately, Runnable sendListener) { + if (player.isFakePlayer()) return; if (immediately) { this.immediatePacketsConsumer.accept(player.nettyChannel(), packet, sendListener); } else { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/LeavesReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/LeavesReflections.java new file mode 100644 index 000000000..b7b89995c --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/LeavesReflections.java @@ -0,0 +1,49 @@ +package net.momirealms.craftengine.bukkit.plugin.reflection.minecraft; + +//import net.momirealms.craftengine.core.util.MiscUtils; +//import net.momirealms.craftengine.core.util.ReflectionUtils; +//import net.momirealms.craftengine.core.util.VersionHelper; +//import org.bukkit.event.HandlerList; +// +//import java.lang.reflect.Field; +//import java.util.Optional; + +import net.momirealms.craftengine.core.util.ReflectionUtils; + +import java.lang.reflect.Field; +import java.util.List; + +// TODO API 太新了需要1.21.8,目前先采用其他方式解决假人问题 +public final class LeavesReflections { + private LeavesReflections() {} + +// public static final Class clazz$BotJoinEvent = MiscUtils.requireNonNullIf(ReflectionUtils.getClazz("org.leavesmc.leaves.event.bot.BotJoinEvent"), VersionHelper.isLeaves()); +// +// public static final Class clazz$BotRemoveEvent = MiscUtils.requireNonNullIf(ReflectionUtils.getClazz("org.leavesmc.leaves.event.bot.BotRemoveEvent"), VersionHelper.isLeaves()); +// +// public static final Class clazz$BotEvent = MiscUtils.requireNonNullIf(ReflectionUtils.getClazz("org.leavesmc.leaves.event.bot.BotEvent"), VersionHelper.isLeaves()); +// +// public static final Class clazz$Bot = MiscUtils.requireNonNullIf(ReflectionUtils.getClazz("org.leavesmc.leaves.entity.bot.Bot"), VersionHelper.isLeaves()); +// +// public static final Field field$BotEvent$bot = Optional.ofNullable(clazz$BotEvent) +// .map(it -> ReflectionUtils.getDeclaredField(it, clazz$Bot, 0)) +// .orElse(null); +// +// public static final Field field$BotJoinEvent$handlers = Optional.ofNullable(clazz$BotJoinEvent) +// .map(it -> ReflectionUtils.getDeclaredField(it, HandlerList.class, 0)) +// .orElse(null); +// +// public static final Field field$BotRemoveEvent$handlers = Optional.ofNullable(clazz$BotRemoveEvent) +// .map(it -> ReflectionUtils.getDeclaredField(it, HandlerList.class, 0)) +// .orElse(null); + + + public static final Class clazz$ServerBot = ReflectionUtils.getClazz("org.leavesmc.leaves.bot.ServerBot"); + + // 注入BotList来实现全版本的监听 + public static final Class clazz$BotList = ReflectionUtils.getClazz("org.leavesmc.leaves.bot.BotList"); + + public static final Field field$BotList$INSTANCE = ReflectionUtils.getDeclaredField(clazz$BotList, clazz$BotList, 0); + + public static final Field field$BotList$bots = ReflectionUtils.getDeclaredField(clazz$BotList, List.class, 0); +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 64f58fa0c..a56e78b01 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -112,14 +112,16 @@ public class BukkitServerPlayer extends Player { private final Map entityTypeView = new ConcurrentHashMap<>(); - public BukkitServerPlayer(BukkitCraftEngine plugin, Channel channel) { + public BukkitServerPlayer(BukkitCraftEngine plugin, @Nullable Channel channel) { this.channel = channel; this.plugin = plugin; - for (String name : channel.pipeline().names()) { - ChannelHandler handler = channel.pipeline().get(name); - if (NetworkReflections.clazz$Connection.isInstance(handler)) { - this.connection = handler; - break; + if (channel != null) { + for (String name : channel.pipeline().names()) { + ChannelHandler handler = channel.pipeline().get(name); + if (NetworkReflections.clazz$Connection.isInstance(handler)) { + this.connection = handler; + break; + } } } } @@ -328,22 +330,37 @@ public class BukkitServerPlayer extends Player { } @Override - public void sendCustomPayload(Key channel, byte[] data) { + public void sendPackets(List packet, boolean immediately) { + this.plugin.networkManager().sendPackets(this, packet, immediately); + } + + @Override + public void sendPackets(List packet, boolean immediately, Runnable sendListener) { + this.plugin.networkManager().sendPackets(this, packet, immediately, sendListener); + } + + @Override + public void simulatePacket(Object packet) { + this.plugin.networkManager().simulatePacket(this, packet); + } + + @Override + public void sendCustomPayload(Key channelId, byte[] data) { try { - Object channelKey = KeyUtils.toResourceLocation(channel); + Object channelResourceLocation = KeyUtils.toResourceLocation(channelId); Object responsePacket; if (VersionHelper.isOrAbove1_20_2()) { Object dataPayload; if (NetworkReflections.clazz$UnknownPayload != null) { - dataPayload = NetworkReflections.constructor$UnknownPayload.newInstance(channelKey, Unpooled.wrappedBuffer(data)); + dataPayload = NetworkReflections.constructor$UnknownPayload.newInstance(channelResourceLocation, Unpooled.wrappedBuffer(data)); } else if (DiscardedPayload.useNewMethod) { - dataPayload = NetworkReflections.constructor$DiscardedPayload.newInstance(channelKey, data); + dataPayload = NetworkReflections.constructor$DiscardedPayload.newInstance(channelResourceLocation, data); } else { - dataPayload = NetworkReflections.constructor$DiscardedPayload.newInstance(channelKey, Unpooled.wrappedBuffer(data)); + dataPayload = NetworkReflections.constructor$DiscardedPayload.newInstance(channelResourceLocation, Unpooled.wrappedBuffer(data)); } responsePacket = NetworkReflections.constructor$ClientboundCustomPayloadPacket.newInstance(dataPayload); } else { - responsePacket = NetworkReflections.constructor$ClientboundCustomPayloadPacket.newInstance(channelKey, FastNMS.INSTANCE.constructor$FriendlyByteBuf(Unpooled.wrappedBuffer(data))); + responsePacket = NetworkReflections.constructor$ClientboundCustomPayloadPacket.newInstance(channelResourceLocation, FastNMS.INSTANCE.constructor$FriendlyByteBuf(Unpooled.wrappedBuffer(data))); } this.sendPacket(responsePacket, true); } catch (Exception e) { @@ -365,21 +382,6 @@ public class BukkitServerPlayer extends Player { } } - @Override - public void sendPackets(List packet, boolean immediately) { - this.plugin.networkManager().sendPackets(this, packet, immediately); - } - - @Override - public void sendPackets(List packet, boolean immediately, Runnable sendListener) { - this.plugin.networkManager().sendPackets(this, packet, immediately, sendListener); - } - - @Override - public void simulatePacket(Object packet) { - this.plugin.networkManager().simulatePacket(this, packet); - } - @Override public ConnectionState decoderState() { return decoderState; @@ -861,6 +863,11 @@ public class BukkitServerPlayer extends Player { return this.connection; } + @Override + public boolean isFakePlayer() { + return false; + } + @Override public org.bukkit.entity.Player literalObject() { return platformPlayer(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java new file mode 100644 index 000000000..d4bef6ccf --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java @@ -0,0 +1,32 @@ +package net.momirealms.craftengine.bukkit.plugin.user; + +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandler; +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; + +public class FakeBukkitServerPlayer extends BukkitServerPlayer { + + public FakeBukkitServerPlayer(BukkitCraftEngine plugin) { + super(plugin, null); + } + + @Override + public Channel nettyChannel() { + return null; + } + + @Override + public ChannelHandler connection() { + return null; + } + + @Override + public void kick(Component message) { + } + + @Override + public boolean isFakePlayer() { + return true; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/AdventureModeUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/AdventureModeUtils.java index c22eacf48..7204ad9a4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/AdventureModeUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/AdventureModeUtils.java @@ -10,7 +10,7 @@ import org.bukkit.Location; import org.bukkit.inventory.ItemStack; @SuppressWarnings("DuplicatedCode") -public class AdventureModeUtils { +public final class AdventureModeUtils { private AdventureModeUtils() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java index 00c8dfc57..5728c14df 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java @@ -22,7 +22,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public class BlockStateUtils { +public final class BlockStateUtils { public static final IdentityHashMap CLIENT_SIDE_NOTE_BLOCKS = new IdentityHashMap<>(); private static int vanillaStateSize; private static boolean hasInit; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockTags.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockTags.java index a83a91c27..4514ebc54 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockTags.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockTags.java @@ -7,7 +7,7 @@ import net.momirealms.craftengine.core.util.Key; import java.util.HashMap; import java.util.Map; -public class BlockTags { +public final class BlockTags { private static final Map CACHE = new HashMap<>(); private BlockTags() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java index 471d8eda5..70c2eba7c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java @@ -6,7 +6,7 @@ import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.paper.PaperReflections; import net.momirealms.craftengine.core.util.AdventureHelper; -public class ComponentUtils { +public final class ComponentUtils { private ComponentUtils() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DamageCauseUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DamageCauseUtils.java index 0f0c1be64..4e7ca0542 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DamageCauseUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DamageCauseUtils.java @@ -3,7 +3,7 @@ package net.momirealms.craftengine.bukkit.util; import net.momirealms.craftengine.core.util.DamageSource; import org.bukkit.event.entity.EntityDamageEvent; -public class DamageCauseUtils { +public final class DamageCauseUtils { private DamageCauseUtils() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DirectionUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DirectionUtils.java index 341e88c9d..cf0ef5d0c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DirectionUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DirectionUtils.java @@ -4,7 +4,7 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflect import net.momirealms.craftengine.core.util.Direction; import org.bukkit.block.BlockFace; -public class DirectionUtils { +public final class DirectionUtils { private DirectionUtils() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DummyListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DummyListener.java new file mode 100644 index 000000000..842b5d99b --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DummyListener.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.bukkit.util; + +import org.bukkit.event.Listener; + +public class DummyListener implements Listener { +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EnchantmentUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EnchantmentUtils.java index 01bc7d699..6424b21f3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EnchantmentUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EnchantmentUtils.java @@ -5,7 +5,7 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflect import java.util.HashMap; import java.util.Map; -public class EnchantmentUtils { +public final class EnchantmentUtils { private EnchantmentUtils() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityDataUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityDataUtils.java index d2c342de1..f9eb22d2e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityDataUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityDataUtils.java @@ -2,7 +2,7 @@ package net.momirealms.craftengine.bukkit.util; import net.momirealms.craftengine.core.util.VersionHelper; -public class EntityDataUtils { +public final class EntityDataUtils { private EntityDataUtils() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java index a4b87cde2..41419ab9d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java @@ -15,7 +15,7 @@ import org.bukkit.event.entity.CreatureSpawnEvent; import java.util.function.Consumer; -public class EntityUtils { +public final class EntityUtils { private EntityUtils() { } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EventUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EventUtils.java index 2a09a636b..7be7e243f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EventUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EventUtils.java @@ -4,7 +4,7 @@ import org.bukkit.Bukkit; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; -public class EventUtils { +public final class EventUtils { private EventUtils() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ExplosionUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ExplosionUtils.java index 3d8de7149..3c45e46ab 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ExplosionUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ExplosionUtils.java @@ -5,7 +5,7 @@ import org.bukkit.event.block.BlockExplodeEvent; import org.bukkit.event.entity.EntityExplodeEvent; @SuppressWarnings("UnstableApiUsage") -public class ExplosionUtils { +public final class ExplosionUtils { public static boolean isDroppingItems(BlockExplodeEvent event) { return event.getExplosionResult() != ExplosionResult.KEEP && event.getExplosionResult() != ExplosionResult.TRIGGER_BLOCK; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/FeatureUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/FeatureUtils.java index 6b6f53ea5..c81be9337 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/FeatureUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/FeatureUtils.java @@ -4,7 +4,7 @@ import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistries; import net.momirealms.craftengine.core.util.Key; -public class FeatureUtils { +public final class FeatureUtils { private FeatureUtils() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/FluidUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/FluidUtils.java index 3af0cadc1..685d43961 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/FluidUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/FluidUtils.java @@ -3,7 +3,7 @@ package net.momirealms.craftengine.bukkit.util; import net.momirealms.craftengine.core.world.FluidCollisionRule; import org.bukkit.FluidCollisionMode; -public class FluidUtils { +public final class FluidUtils { private FluidUtils() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java index 34c7cf27e..d16537def 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java @@ -36,7 +36,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; -public class InteractUtils { +public final class InteractUtils { private static final Map, BlockData, BlockHitResult, Boolean>> INTERACTIONS = new HashMap<>(); private static final Map, BlockData, BlockHitResult, Boolean>> WILL_CONSUME = new HashMap<>(); private static final Map, Boolean>> ENTITY_INTERACTIONS = new HashMap<>(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InventoryUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InventoryUtils.java index 49192e90c..089f0b315 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InventoryUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InventoryUtils.java @@ -6,7 +6,7 @@ import org.bukkit.event.inventory.InventoryEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; -public class InventoryUtils { +public final class InventoryUtils { private InventoryUtils() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemTags.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemTags.java index e94bc4a32..55d2fa70c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemTags.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemTags.java @@ -7,7 +7,7 @@ import net.momirealms.craftengine.core.util.Key; import java.util.HashMap; import java.util.Map; -public class ItemTags { +public final class ItemTags { private static final Map CACHE = new HashMap<>(); public static final Key AXES = Key.of("minecraft:axes"); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LightUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LightUtils.java index 51e046ddf..636c5c1e3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LightUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LightUtils.java @@ -9,7 +9,7 @@ import java.util.BitSet; import java.util.List; import java.util.Map; -public class LightUtils { +public final class LightUtils { private LightUtils() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LocationUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LocationUtils.java index 5a103ac24..0d0688e1c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LocationUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LocationUtils.java @@ -9,7 +9,7 @@ import org.bukkit.Location; import org.bukkit.World; import org.jetbrains.annotations.NotNull; -public class LocationUtils { +public final class LocationUtils { private LocationUtils() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MaterialUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MaterialUtils.java index 0ef3c5caf..02db8aff7 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MaterialUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MaterialUtils.java @@ -10,7 +10,7 @@ import java.util.Locale; import java.util.Objects; import java.util.Optional; -public class MaterialUtils { +public final class MaterialUtils { public static Material MACE; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MirrorUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MirrorUtils.java index 32e08ada7..df2c71bbc 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MirrorUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MirrorUtils.java @@ -3,7 +3,7 @@ package net.momirealms.craftengine.bukkit.util; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.core.util.Mirror; -public class MirrorUtils { +public final class MirrorUtils { private MirrorUtils() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MobEffectUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MobEffectUtils.java index b944a8b39..c1a6e36af 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MobEffectUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MobEffectUtils.java @@ -2,7 +2,7 @@ package net.momirealms.craftengine.bukkit.util; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections; -public class MobEffectUtils { +public final class MobEffectUtils { private MobEffectUtils() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/NoteBlockChainUpdateUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/NoteBlockChainUpdateUtils.java index 3cb195fa0..b77fea1ba 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/NoteBlockChainUpdateUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/NoteBlockChainUpdateUtils.java @@ -2,7 +2,7 @@ package net.momirealms.craftengine.bukkit.util; import net.momirealms.craftengine.bukkit.nms.FastNMS; -public class NoteBlockChainUpdateUtils { +public final class NoteBlockChainUpdateUtils { private NoteBlockChainUpdateUtils() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/OptimizedReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/OptimizedReflections.java deleted file mode 100644 index 211da4037..000000000 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/OptimizedReflections.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.momirealms.craftengine.bukkit.util; - -public class OptimizedReflections { - - -} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RecipeUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RecipeUtils.java deleted file mode 100644 index ca67f6b6b..000000000 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RecipeUtils.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.momirealms.craftengine.bukkit.util; - -public class RecipeUtils { - - private RecipeUtils() {} - -} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RegistryUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RegistryUtils.java index 0e53d5748..155385d6f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RegistryUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RegistryUtils.java @@ -5,7 +5,7 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflect import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBuiltInRegistries; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistries; -public class RegistryUtils { +public final class RegistryUtils { private RegistryUtils() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RotationUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RotationUtils.java index 65f632d7a..3cda588f7 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RotationUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RotationUtils.java @@ -3,7 +3,7 @@ package net.momirealms.craftengine.bukkit.util; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.core.util.Rotation; -public class RotationUtils { +public final class RotationUtils { private RotationUtils() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/SoundUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/SoundUtils.java index 4f9ebf05b..9f21529df 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/SoundUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/SoundUtils.java @@ -6,7 +6,7 @@ import net.momirealms.craftengine.core.sound.SoundSource; import net.momirealms.craftengine.core.util.Key; import org.bukkit.SoundCategory; -public class SoundUtils { +public final class SoundUtils { private SoundUtils() {} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/StairsShapeUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/StairsShapeUtils.java index c06c548b5..dde8b33f7 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/StairsShapeUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/StairsShapeUtils.java @@ -3,7 +3,7 @@ package net.momirealms.craftengine.bukkit.util; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.core.block.state.properties.StairsShape; -public class StairsShapeUtils { +public final class StairsShapeUtils { private StairsShapeUtils() {} public static StairsShape fromNMSStairsShape(Object shape) { diff --git a/common-files/src/main/resources/mappings.yml b/common-files/src/main/resources/mappings.yml index daf22369a..d3f9f58f2 100644 --- a/common-files/src/main/resources/mappings.yml +++ b/common-files/src/main/resources/mappings.yml @@ -4323,7 +4323,7 @@ minecraft:heavy_weighted_pressure_plate[power=14]: minecraft:heavy_weighted_pres minecraft:heavy_weighted_pressure_plate[power=15]: minecraft:heavy_weighted_pressure_plate[power=1] #### Corals #### -# # Coral blocks are ideal for creating water blocks or wall-mounted blocks. But you have to sacrifice its dry appearance. +# Coral blocks are ideal for creating water blocks or wall-mounted blocks. But you have to sacrifice its dry appearance. # minecraft:dead_brain_coral[waterlogged=false]: minecraft:brain_coral[waterlogged=false] # minecraft:dead_brain_coral[waterlogged=true]: minecraft:brain_coral[waterlogged=true] # minecraft:dead_brain_coral_fan[waterlogged=false]: minecraft:brain_coral_fan[waterlogged=false] diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java index 042413ba9..453b8e055 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java @@ -6,6 +6,7 @@ import net.kyori.adventure.text.Component; import net.momirealms.craftengine.core.plugin.Plugin; import net.momirealms.craftengine.core.util.Key; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; import java.util.Map; import java.util.UUID; @@ -13,8 +14,16 @@ import java.util.UUID; public interface NetWorkUser { boolean isOnline(); + // 对假人来说会null + @Nullable Channel nettyChannel(); + // 对假人来说会null + @Nullable + ChannelHandler connection(); + + boolean isFakePlayer(); + Plugin plugin(); String name(); @@ -49,8 +58,6 @@ public interface NetWorkUser { Object platformPlayer(); - ChannelHandler connection(); - Map entityPacketHandlers(); boolean clientModEnabled(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java index 0c003a3eb..6b36f6bc3 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java @@ -16,7 +16,7 @@ public class VersionHelper { private static final boolean mojmap; private static final boolean folia; private static final boolean paper; - + private static final boolean leaves; private static final boolean v1_20; private static final boolean v1_20_1; private static final boolean v1_20_2; @@ -77,6 +77,7 @@ public class VersionHelper { mojmap = checkMojMap(); folia = checkFolia(); paper = checkPaper(); + leaves = checkLeaves(); } catch (Exception e) { throw new RuntimeException("Failed to init VersionHelper", e); } @@ -150,6 +151,15 @@ public class VersionHelper { return false; } + private static boolean checkLeaves() { + try { + Class.forName("org.leavesmc.leaves.bot.ServerBot"); + return true; + } catch (ClassNotFoundException ignored) { + } + return false; + } + public static boolean isFolia() { return folia; } @@ -158,6 +168,10 @@ public class VersionHelper { return paper; } + public static boolean isLeaves() { + return leaves; + } + public static boolean isMojmap() { return mojmap; } diff --git a/gradle.properties b/gradle.properties index 199f62c5e..4d209dd7a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.61.4 +project_version=0.0.61.5 config_version=43 lang_version=23 project_group=net.momirealms