9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-19 15:09:15 +00:00

初步兼容leaves假人

This commit is contained in:
XiaoMoMi
2025-08-13 19:29:25 +08:00
parent dc376d2f36
commit 4126353a91
54 changed files with 267 additions and 125 deletions

View File

@@ -9,7 +9,7 @@ import io.lumine.mythic.api.skills.SkillCaster;
import io.lumine.mythic.bukkit.BukkitAdapter; import io.lumine.mythic.bukkit.BukkitAdapter;
import io.lumine.mythic.bukkit.adapters.BukkitItemStack; import io.lumine.mythic.bukkit.adapters.BukkitItemStack;
import io.lumine.mythic.core.drops.droppables.ItemDrop; 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.CustomItem;
import net.momirealms.craftengine.core.item.ItemBuildContext; import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.plugin.CraftEngine; 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) { if (caster != null && caster.getEntity() instanceof AbstractPlayer abstractPlayer) {
Entity bukkitEntity = abstractPlayer.getBukkitEntity(); Entity bukkitEntity = abstractPlayer.getBukkitEntity();
if (bukkitEntity instanceof Player bukkitPlayer) { if (bukkitEntity instanceof Player bukkitPlayer) {
var player = BukkitCraftEngine.instance().adapt(bukkitPlayer); var player = BukkitAdaptors.adapt(bukkitPlayer);
context = ItemBuildContext.of(player); context = ItemBuildContext.of(player);
} }
} }

View File

@@ -12,8 +12,6 @@ import org.bukkit.entity.Entity;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.function.Predicate;
public class CondIsFurniture extends Condition { public class CondIsFurniture extends Condition {
public static void register() { public static void register() {

View File

@@ -10,8 +10,6 @@ import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.registrations.EventValues; import ch.njol.skript.registrations.EventValues;
import net.momirealms.craftengine.bukkit.api.event.CustomBlockBreakEvent; import net.momirealms.craftengine.bukkit.api.event.CustomBlockBreakEvent;
import net.momirealms.craftengine.bukkit.api.event.CustomBlockPlaceEvent; 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.bukkit.util.BlockStateUtils;
import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.block.ImmutableBlockState;
import net.momirealms.craftengine.core.block.UnsafeBlockStateMatcher; 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.Location;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;

View File

@@ -11,7 +11,6 @@ import ch.njol.skript.lang.SkriptEvent;
import ch.njol.skript.lang.SkriptParser; import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.registrations.EventValues; import ch.njol.skript.registrations.EventValues;
import net.momirealms.craftengine.bukkit.api.event.CustomBlockInteractEvent; 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.bukkit.api.event.FurnitureInteractEvent;
import net.momirealms.craftengine.core.block.ImmutableBlockState; import net.momirealms.craftengine.core.block.ImmutableBlockState;
import net.momirealms.craftengine.core.block.UnsafeBlockStateMatcher; import net.momirealms.craftengine.core.block.UnsafeBlockStateMatcher;

View File

@@ -8,8 +8,6 @@ import ch.njol.skript.lang.Literal;
import ch.njol.skript.lang.SkriptEvent; import ch.njol.skript.lang.SkriptEvent;
import ch.njol.skript.lang.SkriptParser; import ch.njol.skript.lang.SkriptParser;
import ch.njol.skript.registrations.EventValues; 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.FurnitureBreakEvent;
import net.momirealms.craftengine.bukkit.api.event.FurniturePlaceEvent; import net.momirealms.craftengine.bukkit.api.event.FurniturePlaceEvent;
import org.bukkit.Location; import org.bukkit.Location;

View File

@@ -1,6 +1,7 @@
package net.momirealms.craftengine.bukkit.block; package net.momirealms.craftengine.bukkit.block;
import io.papermc.paper.event.block.BlockBreakBlockEvent; 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.api.event.CustomBlockBreakEvent;
import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
@@ -56,7 +57,7 @@ public final class BlockEventListener implements Listener {
public void onPlayerAttack(EntityDamageByEntityEvent event) { public void onPlayerAttack(EntityDamageByEntityEvent event) {
if (!VersionHelper.isOrAbove1_20_5()) { if (!VersionHelper.isOrAbove1_20_5()) {
if (event.getDamager() instanceof Player player) { if (event.getDamager() instanceof Player player) {
BukkitServerPlayer serverPlayer = plugin.adapt(player); BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player);
serverPlayer.setClientSideCanBreakBlock(true); serverPlayer.setClientSideCanBreakBlock(true);
} }
} }
@@ -65,7 +66,7 @@ public final class BlockEventListener implements Listener {
@EventHandler(ignoreCancelled = true) @EventHandler(ignoreCancelled = true)
public void onPlaceBlock(BlockPlaceEvent event) { public void onPlaceBlock(BlockPlaceEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
BukkitServerPlayer serverPlayer = plugin.adapt(player); BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player);
// send swing if player is clicking a replaceable block // send swing if player is clicking a replaceable block
if (serverPlayer.shouldResendSwing()) { if (serverPlayer.shouldResendSwing()) {
player.swingHand(event.getHand()); player.swingHand(event.getHand());
@@ -112,7 +113,7 @@ public final class BlockEventListener implements Listener {
int stateId = BlockStateUtils.blockStateToId(blockState); int stateId = BlockStateUtils.blockStateToId(blockState);
Player player = event.getPlayer(); Player player = event.getPlayer();
Location location = block.getLocation(); 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()); 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); WorldPosition position = new WorldPosition(world, location.getBlockX() + 0.5, location.getBlockY() + 0.5, location.getBlockZ() + 0.5);
Item<ItemStack> itemInHand = serverPlayer.getItemInHand(InteractionHand.MAIN_HAND); Item<ItemStack> itemInHand = serverPlayer.getItemInHand(InteractionHand.MAIN_HAND);
@@ -246,7 +247,7 @@ public final class BlockEventListener implements Listener {
Location location = player.getLocation(); Location location = player.getLocation();
ImmutableBlockState state = optionalCustomState.get(); ImmutableBlockState state = optionalCustomState.get();
Cancellable cancellable = Cancellable.of(event::isCancelled, event::setCancelled); 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.EVENT, cancellable)
.withParameter(DirectContextParameters.POSITION, new WorldPosition(new BukkitWorld(event.getWorld()), LocationUtils.toVec3d(location))) .withParameter(DirectContextParameters.POSITION, new WorldPosition(new BukkitWorld(event.getWorld()), LocationUtils.toVec3d(location)))
.withParameter(DirectContextParameters.BLOCK, new BukkitBlockInWorld(block)) .withParameter(DirectContextParameters.BLOCK, new BukkitBlockInWorld(block))

View File

@@ -1,11 +1,13 @@
package net.momirealms.craftengine.bukkit.entity.furniture; 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.entity.furniture.hitbox.InteractionHitBox;
import net.momirealms.craftengine.bukkit.nms.CollisionEntity; import net.momirealms.craftengine.bukkit.nms.CollisionEntity;
import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.network.handler.FurniturePacketHandler; import net.momirealms.craftengine.bukkit.plugin.network.handler.FurniturePacketHandler;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MEntityTypes; 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.EntityUtils;
import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.bukkit.util.KeyUtils;
import net.momirealms.craftengine.bukkit.util.LocationUtils; import net.momirealms.craftengine.bukkit.util.LocationUtils;
@@ -207,15 +209,16 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager {
BukkitFurniture furniture = addNewFurniture(display, customFurniture); BukkitFurniture furniture = addNewFurniture(display, customFurniture);
furniture.initializeColliders(); furniture.initializeColliders();
for (Player player : display.getTrackedPlayers()) { for (Player player : display.getTrackedPlayers()) {
this.plugin.adapt(player).entityPacketHandlers().computeIfAbsent(furniture.baseEntityId(), k -> new FurniturePacketHandler(furniture.fakeEntityIds())); BukkitAdaptors.adapt(player).entityPacketHandlers().computeIfAbsent(furniture.baseEntityId(), k -> new FurniturePacketHandler(furniture.fakeEntityIds()));
this.plugin.networkManager().sendPacket(this.plugin.adapt(player), furniture.spawnPacket(player)); this.plugin.networkManager().sendPacket(BukkitAdaptors.adapt(player), furniture.spawnPacket(player));
} }
} }
} else { } else {
BukkitFurniture furniture = addNewFurniture(display, customFurniture); BukkitFurniture furniture = addNewFurniture(display, customFurniture);
for (Player player : display.getTrackedPlayers()) { for (Player player : display.getTrackedPlayers()) {
this.plugin.adapt(player).entityPacketHandlers().computeIfAbsent(furniture.baseEntityId(), k -> new FurniturePacketHandler(furniture.fakeEntityIds())); BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player);
this.plugin.networkManager().sendPacket(this.plugin.adapt(player), furniture.spawnPacket(player)); serverPlayer.entityPacketHandlers().computeIfAbsent(furniture.baseEntityId(), k -> new FurniturePacketHandler(furniture.fakeEntityIds()));
this.plugin.networkManager().sendPacket(serverPlayer, furniture.spawnPacket(player));
} }
if (preventChange) { if (preventChange) {
this.plugin.scheduler().sync().runLater(furniture::initializeColliders, 1, location.getWorld(), location.getBlockX() >> 4, location.getBlockZ() >> 4); this.plugin.scheduler().sync().runLater(furniture::initializeColliders, 1, location.getWorld(), location.getBlockX() >> 4, location.getBlockZ() >> 4);

View File

@@ -5,6 +5,7 @@ import com.google.gson.JsonObject;
import io.papermc.paper.event.player.AsyncChatCommandDecorateEvent; import io.papermc.paper.event.player.AsyncChatCommandDecorateEvent;
import io.papermc.paper.event.player.AsyncChatDecorateEvent; import io.papermc.paper.event.player.AsyncChatDecorateEvent;
import net.kyori.adventure.text.Component; 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.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.reflection.paper.PaperReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.paper.PaperReflections;
import net.momirealms.craftengine.bukkit.util.ComponentUtils; import net.momirealms.craftengine.bukkit.util.ComponentUtils;
@@ -143,7 +144,7 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
if (renameText == null || renameText.isEmpty()) return; if (renameText == null || renameText.isEmpty()) return;
Component itemName = Component.text(renameText); 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()) { if (replaceProcessResult.changed()) {
Item<ItemStack> wrapped = this.plugin.itemManager().wrap(result); Item<ItemStack> wrapped = this.plugin.itemManager().wrap(result);
wrapped.customNameJson(AdventureHelper.componentToJson(replaceProcessResult.newText())); wrapped.customNameJson(AdventureHelper.componentToJson(replaceProcessResult.newText()));
@@ -160,7 +161,7 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
JsonElement json = ComponentUtils.paperAdventureToJsonElement(lines.get(i)); JsonElement json = ComponentUtils.paperAdventureToJsonElement(lines.get(i));
if (json == null) continue; if (json == null) continue;
Component line = AdventureHelper.jsonElementToComponent(json); Component line = AdventureHelper.jsonElementToComponent(json);
EmojiComponentProcessResult result = replaceComponentEmoji(line, plugin.adapt(player)); EmojiComponentProcessResult result = replaceComponentEmoji(line, BukkitAdaptors.adapt(player));
if (result.changed()) { if (result.changed()) {
try { try {
PaperReflections.method$SignChangeEvent$line.invoke(event, i, ComponentUtils.jsonElementToPaperAdventure(AdventureHelper.componentToJsonElement(result.newText()))); 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++) { for (int i = 0; i < pages.size(); i++) {
JsonElement json = ComponentUtils.paperAdventureToJsonElement(pages.get(i)); JsonElement json = ComponentUtils.paperAdventureToJsonElement(pages.get(i));
Component page = AdventureHelper.jsonElementToComponent(json); Component page = AdventureHelper.jsonElementToComponent(json);
EmojiComponentProcessResult result = replaceComponentEmoji(page, plugin.adapt(player)); EmojiComponentProcessResult result = replaceComponentEmoji(page, BukkitAdaptors.adapt(player));
if (result.changed()) { if (result.changed()) {
changed = true; changed = true;
try { try {
@@ -214,7 +215,7 @@ public class BukkitFontManager extends AbstractFontManager implements Listener {
Object originalMessage = PaperReflections.field$AsyncChatDecorateEvent$originalMessage.get(event); Object originalMessage = PaperReflections.field$AsyncChatDecorateEvent$originalMessage.get(event);
String rawJsonMessage = ComponentUtils.paperAdventureToJson(originalMessage); String rawJsonMessage = ComponentUtils.paperAdventureToJson(originalMessage);
if (Config.allowEmojiChat()) { if (Config.allowEmojiChat()) {
EmojiTextProcessResult processResult = replaceJsonEmoji(rawJsonMessage, this.plugin.adapt(player)); EmojiTextProcessResult processResult = replaceJsonEmoji(rawJsonMessage, BukkitAdaptors.adapt(player));
boolean hasChanged = processResult.replaced(); boolean hasChanged = processResult.replaced();
if (!player.hasPermission(FontManager.BYPASS_CHAT)) { if (!player.hasPermission(FontManager.BYPASS_CHAT)) {
IllegalCharacterProcessResult result = processIllegalCharacters(processResult.text()); IllegalCharacterProcessResult result = processIllegalCharacters(processResult.text());

View File

@@ -1,6 +1,7 @@
package net.momirealms.craftengine.bukkit.item.listener; package net.momirealms.craftengine.bukkit.item.listener;
import net.kyori.adventure.text.Component; 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.api.CraftEngineBlocks;
import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.item.BukkitItemManager;
import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.nms.FastNMS;
@@ -49,7 +50,7 @@ public class DebugStickListener implements Listener {
Material material = itemInHand.getType(); Material material = itemInHand.getType();
if (material != Material.DEBUG_STICK) return; if (material != Material.DEBUG_STICK) return;
Player bukkitPlayer = event.getPlayer(); 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")) { if (!(player.canInstabuild() && player.hasPermission("minecraft.debugstick")) && !player.hasPermission("minecraft.debugstick.always")) {
return; return;
} }

View File

@@ -1,6 +1,7 @@
package net.momirealms.craftengine.bukkit.item.listener; package net.momirealms.craftengine.bukkit.item.listener;
import io.papermc.paper.event.block.CompostItemEvent; 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.api.event.CustomBlockInteractEvent;
import net.momirealms.craftengine.bukkit.item.BukkitCustomItem; import net.momirealms.craftengine.bukkit.item.BukkitCustomItem;
import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.nms.FastNMS;
@@ -69,7 +70,7 @@ public class ItemEventListener implements Listener {
public void onInteractEntity(PlayerInteractEntityEvent event) { public void onInteractEntity(PlayerInteractEntityEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
Entity entity = event.getRightClicked(); Entity entity = event.getRightClicked();
BukkitServerPlayer serverPlayer = this.plugin.adapt(player); BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player);
if (serverPlayer == null) return; if (serverPlayer == null) return;
InteractionHand hand = event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; InteractionHand hand = event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND;
@@ -107,7 +108,7 @@ public class ItemEventListener implements Listener {
return; return;
} }
BukkitServerPlayer serverPlayer = this.plugin.adapt(player); BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player);
if (serverPlayer == null) return; if (serverPlayer == null) return;
InteractionHand hand = event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; InteractionHand hand = event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND;
// 如果本tick内主手已被处理则不处理副手 // 如果本tick内主手已被处理则不处理副手
@@ -349,7 +350,7 @@ public class ItemEventListener implements Listener {
if (action != Action.RIGHT_CLICK_AIR && action != Action.LEFT_CLICK_AIR) if (action != Action.RIGHT_CLICK_AIR && action != Action.LEFT_CLICK_AIR)
return; return;
Player player = event.getPlayer(); Player player = event.getPlayer();
BukkitServerPlayer serverPlayer = this.plugin.adapt(player); BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player);
if (serverPlayer.isSpectatorMode()) if (serverPlayer.isSpectatorMode())
return; return;
// Gets the item in hand // Gets the item in hand
@@ -411,7 +412,7 @@ public class ItemEventListener implements Listener {
} }
Cancellable cancellable = Cancellable.of(event::isCancelled, event::setCancelled); Cancellable cancellable = Cancellable.of(event::isCancelled, event::setCancelled);
CustomItem<ItemStack> customItem = optionalCustomItem.get(); CustomItem<ItemStack> 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.ITEM_IN_HAND, wrapped)
.withParameter(DirectContextParameters.EVENT, cancellable) .withParameter(DirectContextParameters.EVENT, cancellable)
.withParameter(DirectContextParameters.HAND, event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND) .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) { if (replacement == null) {
event.setReplacement(null); event.setReplacement(null);
} else { } 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); event.setReplacement(replacementItem);
} }
} }
@@ -516,7 +517,7 @@ public class ItemEventListener implements Listener {
if (optionalCustomItem.isEmpty()) return; if (optionalCustomItem.isEmpty()) return;
BukkitCustomItem customItem = (BukkitCustomItem) optionalCustomItem.get(); BukkitCustomItem customItem = (BukkitCustomItem) optionalCustomItem.get();
if (customItem.clientItem() == FastNMS.INSTANCE.method$ItemStack$getItem(wrapped.getLiteralObject())) return; 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; if (serverPlayer == null) return;
this.plugin.scheduler().sync().runDelayed(() -> { this.plugin.scheduler().sync().runDelayed(() -> {
Object container = FastNMS.INSTANCE.field$Player$containerMenu(serverPlayer.serverPlayer()); Object container = FastNMS.INSTANCE.field$Player$containerMenu(serverPlayer.serverPlayer());

View File

@@ -2,6 +2,7 @@ package net.momirealms.craftengine.bukkit.item.recipe;
import com.destroystokyo.paper.event.inventory.PrepareResultEvent; import com.destroystokyo.paper.event.inventory.PrepareResultEvent;
import net.kyori.adventure.text.Component; 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.BukkitItemManager;
import net.momirealms.craftengine.bukkit.item.ComponentTypes; import net.momirealms.craftengine.bukkit.item.ComponentTypes;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
@@ -455,7 +456,7 @@ public class RecipeEventListener implements Listener {
Player player = InventoryUtils.getPlayerFromInventoryEvent(event); Player player = InventoryUtils.getPlayerFromInventoryEvent(event);
if (finalCost >= maxRepairCost && !plugin.adapt(player).canInstabuild()) { if (finalCost >= maxRepairCost && !BukkitAdaptors.adapt(player).canInstabuild()) {
hasResult = false; hasResult = false;
} }
@@ -548,7 +549,7 @@ public class RecipeEventListener implements Listener {
return; return;
} }
Player player = InventoryUtils.getPlayerFromInventoryEvent(event); Player player = InventoryUtils.getPlayerFromInventoryEvent(event);
Item<ItemStack> newItem = customItemOptional.get().buildItem(plugin.adapt(player)); Item<ItemStack> newItem = customItemOptional.get().buildItem(BukkitAdaptors.adapt(player));
newItem.maxDamage(max); newItem.maxDamage(max);
newItem.damage(Math.max(max - finalDurability, 0)); newItem.damage(Math.max(max - finalDurability, 0));
inventory.setResult(newItem.getItem()); inventory.setResult(newItem.getItem());
@@ -597,7 +598,7 @@ public class RecipeEventListener implements Listener {
CraftingInput<ItemStack> input = getCraftingInput(inventory); CraftingInput<ItemStack> input = getCraftingInput(inventory);
if (input == null) return; if (input == null) return;
Player player = InventoryUtils.getPlayerFromInventoryEvent(event); 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))); inventory.setResult(craftingTableRecipe.assemble(input, new ItemBuildContext(serverPlayer, ContextHolder.EMPTY)));
} }
@@ -650,7 +651,7 @@ public class RecipeEventListener implements Listener {
SmithingInput<ItemStack> input = getSmithingInput(inventory); SmithingInput<ItemStack> input = getSmithingInput(inventory);
if (smithingTrimRecipe.matches(input)) { if (smithingTrimRecipe.matches(input)) {
Player player = InventoryUtils.getPlayerFromInventoryEvent(event); 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); event.setResult(result);
} else { } else {
event.setResult(null); event.setResult(null);
@@ -674,7 +675,7 @@ public class RecipeEventListener implements Listener {
SmithingInput<ItemStack> input = getSmithingInput(inventory); SmithingInput<ItemStack> input = getSmithingInput(inventory);
if (smithingTransformRecipe.matches(input)) { if (smithingTransformRecipe.matches(input)) {
Player player = InventoryUtils.getPlayerFromInventoryEvent(event); 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); event.setResult(processed);
} else { } else {
event.setResult(null); event.setResult(null);

View File

@@ -1,5 +1,6 @@
package net.momirealms.craftengine.bukkit.loot; 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.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBlocks; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBlocks;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer;
@@ -72,7 +73,7 @@ public class BukkitVanillaLootManager extends AbstractVanillaLootManager impleme
BukkitServerPlayer optionalPlayer = null; BukkitServerPlayer optionalPlayer = null;
if (VersionHelper.isOrAbove1_20_5()) { if (VersionHelper.isOrAbove1_20_5()) {
if (event.getDamageSource().getCausingEntity() instanceof Player player) { if (event.getDamageSource().getCausingEntity() instanceof Player player) {
optionalPlayer = this.plugin.adapt(player); optionalPlayer = BukkitAdaptors.adapt(player);
builder.withParameter(DirectContextParameters.PLAYER, optionalPlayer); builder.withParameter(DirectContextParameters.PLAYER, optionalPlayer);
} }
} }

View File

@@ -1,5 +1,6 @@
package net.momirealms.craftengine.bukkit.pack; 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.api.event.AsyncResourcePackGenerateEvent;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.command.feature.ReloadCommand; import net.momirealms.craftengine.bukkit.plugin.command.feature.ReloadCommand;
@@ -43,7 +44,7 @@ public class BukkitPackManager extends AbstractPackManager implements Listener {
@EventHandler(priority = EventPriority.LOW) @EventHandler(priority = EventPriority.LOW)
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerJoin(PlayerJoinEvent event) {
if (Config.sendPackOnJoin() && !VersionHelper.isOrAbove1_20_2()) { if (Config.sendPackOnJoin() && !VersionHelper.isOrAbove1_20_2()) {
Player player = plugin.adapt(event.getPlayer()); Player player = BukkitAdaptors.adapt(event.getPlayer());
this.sendResourcePack(player); this.sendResourcePack(player);
} }
} }

View File

@@ -50,6 +50,7 @@ import org.bukkit.World;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import org.jspecify.annotations.Nullable; import org.jspecify.annotations.Nullable;
import java.io.*; import java.io.*;
@@ -58,7 +59,6 @@ import java.net.URLConnection;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public class BukkitCraftEngine extends CraftEngine { public class BukkitCraftEngine extends CraftEngine {
@@ -363,11 +363,9 @@ public class BukkitCraftEngine extends CraftEngine {
} }
} }
public BukkitServerPlayer adapt(org.bukkit.entity.Player player) { public BukkitServerPlayer adapt(@NotNull org.bukkit.entity.Player player) {
if (player == null) return null; Objects.requireNonNull(player, "player cannot be null");
return Optional.ofNullable((BukkitServerPlayer) networkManager().getOnlineUser(player)).orElseGet( return (BukkitServerPlayer) networkManager().getOnlineUser(player);
() -> (BukkitServerPlayer) networkManager().getUser(player)
);
} }
public AntiGriefLib antiGriefProvider() { public AntiGriefLib antiGriefProvider() {

View File

@@ -4,7 +4,6 @@ import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.bukkit.api.CraftEngineItems; import net.momirealms.craftengine.bukkit.api.CraftEngineItems;
import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.item.BukkitItemManager;
import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; 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.bukkit.util.PlayerUtils;
import net.momirealms.craftengine.core.item.CustomItem; import net.momirealms.craftengine.core.item.CustomItem;
import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.CraftEngine;

View File

@@ -28,7 +28,6 @@ import org.incendo.cloud.suggestion.Suggestion;
import org.incendo.cloud.suggestion.SuggestionProvider; import org.incendo.cloud.suggestion.SuggestionProvider;
import java.util.Collection; import java.util.Collection;
import java.util.Optional;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
public class GiveItemCommand extends BukkitCommandFeature<CommandSender> { public class GiveItemCommand extends BukkitCommandFeature<CommandSender> {

View File

@@ -1,7 +1,6 @@
package net.momirealms.craftengine.bukkit.plugin.command.feature; package net.momirealms.craftengine.bukkit.plugin.command.feature;
import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; 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.CraftEngine;
import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@@ -19,8 +18,6 @@ public class TestCommand extends BukkitCommandFeature<CommandSender> {
return builder return builder
.senderType(Player.class) .senderType(Player.class)
.handler(context -> { .handler(context -> {
Player player = context.sender();
player.sendMessage("客户端模组状态: " + BukkitNetworkManager.instance().getUser(player).clientModEnabled());
}); });
} }

View File

@@ -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;
import net.momirealms.craftengine.bukkit.plugin.network.id.PacketIds1_20_5; 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.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.LibraryReflections;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; 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.bukkit.util.KeyUtils;
import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.context.CooldownData; import net.momirealms.craftengine.core.plugin.context.CooldownData;
@@ -142,6 +144,47 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
} catch (ReflectiveOperationException e) { } catch (ReflectiveOperationException e) {
throw new RuntimeException("Failed to init server connection", 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<Object> bots = (List<Object>) LeavesReflections.field$BotList$bots.get(botList);
ListMonitor<Object> 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() { private void registerPacketHandlers() {
@@ -203,10 +246,6 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
registerC2SByteBufPacketConsumer(PacketConsumers.INTERACT_ENTITY, this.packetIds.serverboundInteractPacket()); registerC2SByteBufPacketConsumer(PacketConsumers.INTERACT_ENTITY, this.packetIds.serverboundInteractPacket());
} }
public static BukkitNetworkManager instance() {
return instance;
}
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
@@ -215,10 +254,10 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
user.setPlayer(player); user.setPlayer(player);
this.onlineUsers.put(player.getUniqueId(), user); this.onlineUsers.put(player.getUniqueId(), user);
this.resetUserArray(); this.resetUserArray();
// folia在此tick每个玩家
if (VersionHelper.isFolia()) { if (VersionHelper.isFolia()) {
player.getScheduler().runAtFixedRate(plugin.javaPlugin(), (t) -> user.tick(), player.getScheduler().runAtFixedRate(plugin.javaPlugin(), (t) -> user.tick(),
() -> { () -> {}, 1, 1);
}, 1, 1);
} }
} }
} }
@@ -282,7 +321,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
} }
@Override @Override
public NetWorkUser getUser(Channel channel) { public NetWorkUser getUser(@NotNull Channel channel) {
ChannelPipeline pipeline = channel.pipeline(); ChannelPipeline pipeline = channel.pipeline();
return this.users.get(pipeline); return this.users.get(pipeline);
} }
@@ -298,14 +337,18 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
return getChannel((Player) player.platformPlayer()); return getChannel((Player) player.platformPlayer());
} }
@Nullable
public NetWorkUser getUser(Player player) { public NetWorkUser getUser(Player player) {
return getUser(getChannel(player)); return getUser(getChannel(player));
} }
@Nullable
public NetWorkUser getOnlineUser(Player player) { public NetWorkUser getOnlineUser(Player player) {
return this.onlineUsers.get(player.getUniqueId()); return this.onlineUsers.get(player.getUniqueId());
} }
// 当假人的时候channel为null
@NotNull
public Channel getChannel(Player player) { public Channel getChannel(Player player) {
return FastNMS.INSTANCE.field$Connection$channel( return FastNMS.INSTANCE.field$Connection$channel(
FastNMS.INSTANCE.field$ServerGamePacketListenerImpl$connection( FastNMS.INSTANCE.field$ServerGamePacketListenerImpl$connection(
@@ -318,6 +361,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
@Override @Override
public void sendPacket(@NotNull NetWorkUser player, Object packet, boolean immediately, Runnable sendListener) { public void sendPacket(@NotNull NetWorkUser player, Object packet, boolean immediately, Runnable sendListener) {
if (player.isFakePlayer()) return;
if (immediately) { if (immediately) {
this.immediatePacketConsumer.accept(player.nettyChannel(), packet, sendListener); this.immediatePacketConsumer.accept(player.nettyChannel(), packet, sendListener);
} else { } else {
@@ -327,6 +371,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
@Override @Override
public void sendPackets(@NotNull NetWorkUser player, List<Object> packet, boolean immediately, Runnable sendListener) { public void sendPackets(@NotNull NetWorkUser player, List<Object> packet, boolean immediately, Runnable sendListener) {
if (player.isFakePlayer()) return;
if (immediately) { if (immediately) {
this.immediatePacketsConsumer.accept(player.nettyChannel(), packet, sendListener); this.immediatePacketsConsumer.accept(player.nettyChannel(), packet, sendListener);
} else { } else {

View File

@@ -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);
}

View File

@@ -112,14 +112,16 @@ public class BukkitServerPlayer extends Player {
private final Map<Integer, EntityPacketHandler> entityTypeView = new ConcurrentHashMap<>(); private final Map<Integer, EntityPacketHandler> entityTypeView = new ConcurrentHashMap<>();
public BukkitServerPlayer(BukkitCraftEngine plugin, Channel channel) { public BukkitServerPlayer(BukkitCraftEngine plugin, @Nullable Channel channel) {
this.channel = channel; this.channel = channel;
this.plugin = plugin; this.plugin = plugin;
for (String name : channel.pipeline().names()) { if (channel != null) {
ChannelHandler handler = channel.pipeline().get(name); for (String name : channel.pipeline().names()) {
if (NetworkReflections.clazz$Connection.isInstance(handler)) { ChannelHandler handler = channel.pipeline().get(name);
this.connection = handler; if (NetworkReflections.clazz$Connection.isInstance(handler)) {
break; this.connection = handler;
break;
}
} }
} }
} }
@@ -328,22 +330,37 @@ public class BukkitServerPlayer extends Player {
} }
@Override @Override
public void sendCustomPayload(Key channel, byte[] data) { public void sendPackets(List<Object> packet, boolean immediately) {
this.plugin.networkManager().sendPackets(this, packet, immediately);
}
@Override
public void sendPackets(List<Object> 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 { try {
Object channelKey = KeyUtils.toResourceLocation(channel); Object channelResourceLocation = KeyUtils.toResourceLocation(channelId);
Object responsePacket; Object responsePacket;
if (VersionHelper.isOrAbove1_20_2()) { if (VersionHelper.isOrAbove1_20_2()) {
Object dataPayload; Object dataPayload;
if (NetworkReflections.clazz$UnknownPayload != null) { 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) { } else if (DiscardedPayload.useNewMethod) {
dataPayload = NetworkReflections.constructor$DiscardedPayload.newInstance(channelKey, data); dataPayload = NetworkReflections.constructor$DiscardedPayload.newInstance(channelResourceLocation, data);
} else { } 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); responsePacket = NetworkReflections.constructor$ClientboundCustomPayloadPacket.newInstance(dataPayload);
} else { } 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); this.sendPacket(responsePacket, true);
} catch (Exception e) { } catch (Exception e) {
@@ -365,21 +382,6 @@ public class BukkitServerPlayer extends Player {
} }
} }
@Override
public void sendPackets(List<Object> packet, boolean immediately) {
this.plugin.networkManager().sendPackets(this, packet, immediately);
}
@Override
public void sendPackets(List<Object> 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 @Override
public ConnectionState decoderState() { public ConnectionState decoderState() {
return decoderState; return decoderState;
@@ -861,6 +863,11 @@ public class BukkitServerPlayer extends Player {
return this.connection; return this.connection;
} }
@Override
public boolean isFakePlayer() {
return false;
}
@Override @Override
public org.bukkit.entity.Player literalObject() { public org.bukkit.entity.Player literalObject() {
return platformPlayer(); return platformPlayer();

View File

@@ -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;
}
}

View File

@@ -10,7 +10,7 @@ import org.bukkit.Location;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@SuppressWarnings("DuplicatedCode") @SuppressWarnings("DuplicatedCode")
public class AdventureModeUtils { public final class AdventureModeUtils {
private AdventureModeUtils() {} private AdventureModeUtils() {}

View File

@@ -22,7 +22,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
public class BlockStateUtils { public final class BlockStateUtils {
public static final IdentityHashMap<Object, Object> CLIENT_SIDE_NOTE_BLOCKS = new IdentityHashMap<>(); public static final IdentityHashMap<Object, Object> CLIENT_SIDE_NOTE_BLOCKS = new IdentityHashMap<>();
private static int vanillaStateSize; private static int vanillaStateSize;
private static boolean hasInit; private static boolean hasInit;

View File

@@ -7,7 +7,7 @@ import net.momirealms.craftengine.core.util.Key;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
public class BlockTags { public final class BlockTags {
private static final Map<Key, Object> CACHE = new HashMap<>(); private static final Map<Key, Object> CACHE = new HashMap<>();
private BlockTags() {} private BlockTags() {}

View File

@@ -6,7 +6,7 @@ import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.reflection.paper.PaperReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.paper.PaperReflections;
import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.AdventureHelper;
public class ComponentUtils { public final class ComponentUtils {
private ComponentUtils() {} private ComponentUtils() {}

View File

@@ -3,7 +3,7 @@ package net.momirealms.craftengine.bukkit.util;
import net.momirealms.craftengine.core.util.DamageSource; import net.momirealms.craftengine.core.util.DamageSource;
import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent;
public class DamageCauseUtils { public final class DamageCauseUtils {
private DamageCauseUtils() {} private DamageCauseUtils() {}

View File

@@ -4,7 +4,7 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflect
import net.momirealms.craftengine.core.util.Direction; import net.momirealms.craftengine.core.util.Direction;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
public class DirectionUtils { public final class DirectionUtils {
private DirectionUtils() {} private DirectionUtils() {}

View File

@@ -0,0 +1,6 @@
package net.momirealms.craftengine.bukkit.util;
import org.bukkit.event.Listener;
public class DummyListener implements Listener {
}

View File

@@ -5,7 +5,7 @@ import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflect
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
public class EnchantmentUtils { public final class EnchantmentUtils {
private EnchantmentUtils() {} private EnchantmentUtils() {}

View File

@@ -2,7 +2,7 @@ package net.momirealms.craftengine.bukkit.util;
import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.util.VersionHelper;
public class EntityDataUtils { public final class EntityDataUtils {
private EntityDataUtils() {} private EntityDataUtils() {}

View File

@@ -15,7 +15,7 @@ import org.bukkit.event.entity.CreatureSpawnEvent;
import java.util.function.Consumer; import java.util.function.Consumer;
public class EntityUtils { public final class EntityUtils {
private EntityUtils() { private EntityUtils() {
} }

View File

@@ -4,7 +4,7 @@ import org.bukkit.Bukkit;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.bukkit.event.Event; import org.bukkit.event.Event;
public class EventUtils { public final class EventUtils {
private EventUtils() {} private EventUtils() {}

View File

@@ -5,7 +5,7 @@ import org.bukkit.event.block.BlockExplodeEvent;
import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityExplodeEvent;
@SuppressWarnings("UnstableApiUsage") @SuppressWarnings("UnstableApiUsage")
public class ExplosionUtils { public final class ExplosionUtils {
public static boolean isDroppingItems(BlockExplodeEvent event) { public static boolean isDroppingItems(BlockExplodeEvent event) {
return event.getExplosionResult() != ExplosionResult.KEEP && event.getExplosionResult() != ExplosionResult.TRIGGER_BLOCK; return event.getExplosionResult() != ExplosionResult.KEEP && event.getExplosionResult() != ExplosionResult.TRIGGER_BLOCK;

View File

@@ -4,7 +4,7 @@ import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistries; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistries;
import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.Key;
public class FeatureUtils { public final class FeatureUtils {
private FeatureUtils() {} private FeatureUtils() {}

View File

@@ -3,7 +3,7 @@ package net.momirealms.craftengine.bukkit.util;
import net.momirealms.craftengine.core.world.FluidCollisionRule; import net.momirealms.craftengine.core.world.FluidCollisionRule;
import org.bukkit.FluidCollisionMode; import org.bukkit.FluidCollisionMode;
public class FluidUtils { public final class FluidUtils {
private FluidUtils() {} private FluidUtils() {}

View File

@@ -36,7 +36,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
public class InteractUtils { public final class InteractUtils {
private static final Map<Key, QuadFunction<Player, Item<ItemStack>, BlockData, BlockHitResult, Boolean>> INTERACTIONS = new HashMap<>(); private static final Map<Key, QuadFunction<Player, Item<ItemStack>, BlockData, BlockHitResult, Boolean>> INTERACTIONS = new HashMap<>();
private static final Map<Key, QuadFunction<Player, Item<ItemStack>, BlockData, BlockHitResult, Boolean>> WILL_CONSUME = new HashMap<>(); private static final Map<Key, QuadFunction<Player, Item<ItemStack>, BlockData, BlockHitResult, Boolean>> WILL_CONSUME = new HashMap<>();
private static final Map<Key, TriFunction<Player, Entity, @Nullable Item<ItemStack>, Boolean>> ENTITY_INTERACTIONS = new HashMap<>(); private static final Map<Key, TriFunction<Player, Entity, @Nullable Item<ItemStack>, Boolean>> ENTITY_INTERACTIONS = new HashMap<>();

View File

@@ -6,7 +6,7 @@ import org.bukkit.event.inventory.InventoryEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.PlayerInventory;
public class InventoryUtils { public final class InventoryUtils {
private InventoryUtils() {} private InventoryUtils() {}

View File

@@ -7,7 +7,7 @@ import net.momirealms.craftengine.core.util.Key;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
public class ItemTags { public final class ItemTags {
private static final Map<Key, Object> CACHE = new HashMap<>(); private static final Map<Key, Object> CACHE = new HashMap<>();
public static final Key AXES = Key.of("minecraft:axes"); public static final Key AXES = Key.of("minecraft:axes");

View File

@@ -9,7 +9,7 @@ import java.util.BitSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
public class LightUtils { public final class LightUtils {
private LightUtils() {} private LightUtils() {}

View File

@@ -9,7 +9,7 @@ import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class LocationUtils { public final class LocationUtils {
private LocationUtils() {} private LocationUtils() {}

View File

@@ -10,7 +10,7 @@ import java.util.Locale;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
public class MaterialUtils { public final class MaterialUtils {
public static Material MACE; public static Material MACE;

View File

@@ -3,7 +3,7 @@ package net.momirealms.craftengine.bukkit.util;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections;
import net.momirealms.craftengine.core.util.Mirror; import net.momirealms.craftengine.core.util.Mirror;
public class MirrorUtils { public final class MirrorUtils {
private MirrorUtils() {} private MirrorUtils() {}

View File

@@ -2,7 +2,7 @@ package net.momirealms.craftengine.bukkit.util;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.NetworkReflections;
public class MobEffectUtils { public final class MobEffectUtils {
private MobEffectUtils() {} private MobEffectUtils() {}

View File

@@ -2,7 +2,7 @@ package net.momirealms.craftengine.bukkit.util;
import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.nms.FastNMS;
public class NoteBlockChainUpdateUtils { public final class NoteBlockChainUpdateUtils {
private NoteBlockChainUpdateUtils() {} private NoteBlockChainUpdateUtils() {}

View File

@@ -1,6 +0,0 @@
package net.momirealms.craftengine.bukkit.util;
public class OptimizedReflections {
}

View File

@@ -1,7 +0,0 @@
package net.momirealms.craftengine.bukkit.util;
public class RecipeUtils {
private RecipeUtils() {}
}

View File

@@ -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.MBuiltInRegistries;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistries; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistries;
public class RegistryUtils { public final class RegistryUtils {
private RegistryUtils() {} private RegistryUtils() {}

View File

@@ -3,7 +3,7 @@ package net.momirealms.craftengine.bukkit.util;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections;
import net.momirealms.craftengine.core.util.Rotation; import net.momirealms.craftengine.core.util.Rotation;
public class RotationUtils { public final class RotationUtils {
private RotationUtils() {} private RotationUtils() {}

View File

@@ -6,7 +6,7 @@ import net.momirealms.craftengine.core.sound.SoundSource;
import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.Key;
import org.bukkit.SoundCategory; import org.bukkit.SoundCategory;
public class SoundUtils { public final class SoundUtils {
private SoundUtils() {} private SoundUtils() {}

View File

@@ -3,7 +3,7 @@ package net.momirealms.craftengine.bukkit.util;
import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections;
import net.momirealms.craftengine.core.block.state.properties.StairsShape; import net.momirealms.craftengine.core.block.state.properties.StairsShape;
public class StairsShapeUtils { public final class StairsShapeUtils {
private StairsShapeUtils() {} private StairsShapeUtils() {}
public static StairsShape fromNMSStairsShape(Object shape) { public static StairsShape fromNMSStairsShape(Object shape) {

View File

@@ -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] minecraft:heavy_weighted_pressure_plate[power=15]: minecraft:heavy_weighted_pressure_plate[power=1]
#### Corals #### #### 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=false]: minecraft:brain_coral[waterlogged=false]
# minecraft:dead_brain_coral[waterlogged=true]: minecraft:brain_coral[waterlogged=true] # minecraft:dead_brain_coral[waterlogged=true]: minecraft:brain_coral[waterlogged=true]
# minecraft:dead_brain_coral_fan[waterlogged=false]: minecraft:brain_coral_fan[waterlogged=false] # minecraft:dead_brain_coral_fan[waterlogged=false]: minecraft:brain_coral_fan[waterlogged=false]

View File

@@ -6,6 +6,7 @@ import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.core.plugin.Plugin; import net.momirealms.craftengine.core.plugin.Plugin;
import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.Key;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nullable;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
@@ -13,8 +14,16 @@ import java.util.UUID;
public interface NetWorkUser { public interface NetWorkUser {
boolean isOnline(); boolean isOnline();
// 对假人来说会null
@Nullable
Channel nettyChannel(); Channel nettyChannel();
// 对假人来说会null
@Nullable
ChannelHandler connection();
boolean isFakePlayer();
Plugin plugin(); Plugin plugin();
String name(); String name();
@@ -49,8 +58,6 @@ public interface NetWorkUser {
Object platformPlayer(); Object platformPlayer();
ChannelHandler connection();
Map<Integer, EntityPacketHandler> entityPacketHandlers(); Map<Integer, EntityPacketHandler> entityPacketHandlers();
boolean clientModEnabled(); boolean clientModEnabled();

View File

@@ -16,7 +16,7 @@ public class VersionHelper {
private static final boolean mojmap; private static final boolean mojmap;
private static final boolean folia; private static final boolean folia;
private static final boolean paper; private static final boolean paper;
private static final boolean leaves;
private static final boolean v1_20; private static final boolean v1_20;
private static final boolean v1_20_1; private static final boolean v1_20_1;
private static final boolean v1_20_2; private static final boolean v1_20_2;
@@ -77,6 +77,7 @@ public class VersionHelper {
mojmap = checkMojMap(); mojmap = checkMojMap();
folia = checkFolia(); folia = checkFolia();
paper = checkPaper(); paper = checkPaper();
leaves = checkLeaves();
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException("Failed to init VersionHelper", e); throw new RuntimeException("Failed to init VersionHelper", e);
} }
@@ -150,6 +151,15 @@ public class VersionHelper {
return false; 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() { public static boolean isFolia() {
return folia; return folia;
} }
@@ -158,6 +168,10 @@ public class VersionHelper {
return paper; return paper;
} }
public static boolean isLeaves() {
return leaves;
}
public static boolean isMojmap() { public static boolean isMojmap() {
return mojmap; return mojmap;
} }

View File

@@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G
# Project settings # Project settings
# Rule: [major update].[feature update].[bug fix] # Rule: [major update].[feature update].[bug fix]
project_version=0.0.61.4 project_version=0.0.61.5
config_version=43 config_version=43
lang_version=23 lang_version=23
project_group=net.momirealms project_group=net.momirealms