9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-30 20:39:10 +00:00

添加elytra配置

This commit is contained in:
XiaoMoMi
2025-05-31 02:31:15 +08:00
parent 48895697e8
commit b82e1a9fa7
29 changed files with 228 additions and 134 deletions

View File

@@ -366,7 +366,7 @@ public class BukkitBlockManager extends AbstractBlockManager {
private void parseCustomBlock(Pack pack, Path path, Key id, Map<String, Object> section) {
// read block settings
BlockSettings settings = BlockSettings.fromMap(MiscUtils.castToMap(section.get("settings"), true));
BlockSettings settings = BlockSettings.fromMap(id, MiscUtils.castToMap(section.get("settings"), true));
// read states
Map<String, Property<?>> properties;
Map<String, Integer> appearances;

View File

@@ -79,11 +79,11 @@ public class BukkitItemManager extends AbstractItemManager<ItemStack> {
return instance;
}
public Optional<ItemStack> s2c(ItemStack itemStack, ItemBuildContext context) {
public Optional<ItemStack> s2c(ItemStack itemStack, Player player) {
try {
Item<ItemStack> wrapped = wrap(itemStack);
if (wrapped == null) return Optional.empty();
return this.networkItemHandler.s2c(wrapped, context).map(Item::load);
return this.networkItemHandler.s2c(wrapped, player).map(Item::load);
} catch (Throwable e) {
if (Config.debug()) {
this.plugin.logger().warn("Failed to handle s2c items.", e);
@@ -92,11 +92,11 @@ public class BukkitItemManager extends AbstractItemManager<ItemStack> {
}
}
public Optional<ItemStack> c2s(ItemStack itemStack, ItemBuildContext context) {
public Optional<ItemStack> c2s(ItemStack itemStack) {
try {
Item<ItemStack> wrapped = wrap(itemStack);
if (wrapped == null) return Optional.empty();
return this.networkItemHandler.c2s(wrapped, context).map(Item::load);
return this.networkItemHandler.c2s(wrapped).map(Item::load);
} catch (Throwable e) {
if (Config.debug()) {
this.plugin.logger().warn("Failed to handle c2s items.", e);

View File

@@ -1,20 +1,11 @@
package net.momirealms.craftengine.bukkit.item;
import com.saicone.rtag.RtagItem;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.util.Reflections;
import net.momirealms.craftengine.core.item.ItemWrapper;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.util.VersionHelper;
import net.momirealms.sparrow.nbt.NBT;
import net.momirealms.sparrow.nbt.Tag;
import org.bukkit.inventory.ItemStack;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.Arrays;
public class LegacyItemWrapper implements ItemWrapper<ItemStack> {
private final RtagItem rtagItem;
private int count;

View File

@@ -1,13 +1,17 @@
package net.momirealms.craftengine.bukkit.item;
import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.item.CustomItem;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.NetworkItemHandler;
import net.momirealms.craftengine.core.item.modifier.ArgumentModifier;
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.plugin.context.ContextHolder;
import net.momirealms.craftengine.core.plugin.context.ContextKey;
import net.momirealms.craftengine.core.util.AdventureHelper;
import net.momirealms.sparrow.nbt.CompoundTag;
import net.momirealms.sparrow.nbt.ListTag;
@@ -24,7 +28,7 @@ import java.util.function.BiConsumer;
public class LegacyNetworkItemHandler implements NetworkItemHandler<ItemStack> {
@Override
public Optional<Item<ItemStack>> c2s(Item<ItemStack> wrapped, ItemBuildContext context) {
public Optional<Item<ItemStack>> c2s(Item<ItemStack> wrapped) {
if (!wrapped.hasTag(NETWORK_ITEM_TAG)) return Optional.empty();
CompoundTag networkData = (CompoundTag) wrapped.getNBTTag(NETWORK_ITEM_TAG);
if (networkData == null) return Optional.empty();
@@ -38,7 +42,7 @@ public class LegacyNetworkItemHandler implements NetworkItemHandler<ItemStack> {
}
@Override
public Optional<Item<ItemStack>> s2c(Item<ItemStack> wrapped, ItemBuildContext context) {
public Optional<Item<ItemStack>> s2c(Item<ItemStack> wrapped, Player player) {
Optional<CustomItem<ItemStack>> optionalCustomItem = wrapped.getCustomItem();
if (optionalCustomItem.isEmpty()) {
if (!Config.interceptItem()) return Optional.empty();
@@ -50,6 +54,17 @@ public class LegacyNetworkItemHandler implements NetworkItemHandler<ItemStack> {
return new OtherItem(wrapped).process();
} else {
CompoundTag tag = new CompoundTag();
Tag argumentTag = wrapped.getNBTTag(ArgumentModifier.ARGUMENTS_TAG);
ItemBuildContext context;
if (argumentTag instanceof CompoundTag arguments) {
ContextHolder.Builder builder = ContextHolder.builder();
for (Map.Entry<String, Tag> entry : arguments.entrySet()) {
builder.withParameter(ContextKey.direct(entry.getKey()), entry.getValue().getAsString());
}
context = ItemBuildContext.of(player, builder);
} else {
context = ItemBuildContext.of(player);
}
for (ItemDataModifier<ItemStack> modifier : customItem.clientBoundDataModifiers()) {
modifier.prepareNetworkItem(wrapped, context, tag);
modifier.apply(wrapped, context);

View File

@@ -1,10 +1,14 @@
package net.momirealms.craftengine.bukkit.item;
import net.kyori.adventure.text.Component;
import net.momirealms.craftengine.core.entity.player.Player;
import net.momirealms.craftengine.core.item.*;
import net.momirealms.craftengine.core.item.modifier.ArgumentModifier;
import net.momirealms.craftengine.core.item.modifier.ItemDataModifier;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.plugin.context.ContextHolder;
import net.momirealms.craftengine.core.plugin.context.ContextKey;
import net.momirealms.craftengine.core.util.AdventureHelper;
import net.momirealms.craftengine.core.util.VersionHelper;
import net.momirealms.sparrow.nbt.CompoundTag;
@@ -23,7 +27,7 @@ import java.util.function.Supplier;
public final class ModernNetworkItemHandler implements NetworkItemHandler<ItemStack> {
@Override
public Optional<Item<ItemStack>> c2s(Item<ItemStack> wrapped, ItemBuildContext context) {
public Optional<Item<ItemStack>> c2s(Item<ItemStack> wrapped) {
Tag customData = wrapped.getNBTComponent(ComponentTypes.CUSTOM_DATA);
if (!(customData instanceof CompoundTag compoundTag)) return Optional.empty();
CompoundTag networkData = compoundTag.getCompound(NETWORK_ITEM_TAG);
@@ -34,14 +38,13 @@ public final class ModernNetworkItemHandler implements NetworkItemHandler<ItemSt
NetworkItemHandler.apply(entry.getKey(), tag, wrapped);
}
}
// todo 可能会是 !custom_data吗不可能绝对不可能
if (compoundTag.isEmpty()) wrapped.resetComponent(ComponentTypes.CUSTOM_DATA);
else wrapped.setNBTComponent(ComponentTypes.CUSTOM_DATA, compoundTag);
return Optional.of(wrapped);
}
@Override
public Optional<Item<ItemStack>> s2c(Item<ItemStack> wrapped, ItemBuildContext context) {
public Optional<Item<ItemStack>> s2c(Item<ItemStack> wrapped, Player player) {
Optional<CustomItem<ItemStack>> optionalCustomItem = wrapped.getCustomItem();
if (optionalCustomItem.isEmpty()) {
if (!Config.interceptItem()) return Optional.empty();
@@ -53,6 +56,17 @@ public final class ModernNetworkItemHandler implements NetworkItemHandler<ItemSt
return new OtherItem(wrapped).process();
} else {
CompoundTag customData = Optional.ofNullable(wrapped.getNBTComponent(ComponentTypes.CUSTOM_DATA)).map(CompoundTag.class::cast).orElse(new CompoundTag());
CompoundTag arguments = customData.getCompound(ArgumentModifier.ARGUMENTS_TAG);
ItemBuildContext context;
if (arguments == null) {
context = ItemBuildContext.of(player);
} else {
ContextHolder.Builder builder = ContextHolder.builder();
for (Map.Entry<String, Tag> entry : arguments.entrySet()) {
builder.withParameter(ContextKey.direct(entry.getKey()), entry.getValue().getAsString());
}
context = ItemBuildContext.of(player, builder);
}
CompoundTag tag = new CompoundTag();
for (ItemDataModifier<ItemStack> modifier : customItem.clientBoundDataModifiers()) {
modifier.prepareNetworkItem(wrapped, context, tag);

View File

@@ -34,7 +34,6 @@ import net.momirealms.craftengine.core.font.FontManager;
import net.momirealms.craftengine.core.font.IllegalCharacterProcessResult;
import net.momirealms.craftengine.core.item.CustomItem;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.behavior.ItemBehavior;
import net.momirealms.craftengine.core.item.context.UseOnContext;
import net.momirealms.craftengine.core.pack.host.ResourcePackDownloadData;
@@ -1954,17 +1953,17 @@ public class PacketConsumers {
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> CONTAINER_SET_CONTENT = (user, event) -> {
try {
if (!(user instanceof BukkitServerPlayer serverPlayer)) return;
FriendlyByteBuf buf = event.getBuffer();
int containerId = buf.readContainerId();
int stateId = buf.readVarInt();
int listSize = buf.readVarInt();
ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user);
List<ItemStack> items = new ArrayList<>(listSize);
boolean changed = false;
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
for (int i = 0; i < listSize; i++) {
ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
Optional<ItemStack> optional = BukkitItemManager.instance().s2c(itemStack, context);
Optional<ItemStack> optional = BukkitItemManager.instance().s2c(itemStack, serverPlayer);
if (optional.isPresent()) {
items.add(optional.get());
changed = true;
@@ -1974,7 +1973,7 @@ public class PacketConsumers {
}
ItemStack carriedItem = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
ItemStack newCarriedItem = carriedItem;
Optional<ItemStack> optional = BukkitItemManager.instance().s2c(carriedItem, context);
Optional<ItemStack> optional = BukkitItemManager.instance().s2c(carriedItem, serverPlayer);
if (optional.isPresent()) {
changed = true;
newCarriedItem = optional.get();
@@ -1998,14 +1997,14 @@ public class PacketConsumers {
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> CONTAINER_SET_SLOT = (user, event) -> {
try {
if (!(user instanceof BukkitServerPlayer serverPlayer)) return;
FriendlyByteBuf buf = event.getBuffer();
ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user);
int containerId = buf.readContainerId();
int stateId = buf.readVarInt();
int slot = buf.readShort();
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
BukkitItemManager.instance().s2c(itemStack, context).ifPresent((newItemStack) -> {
BukkitItemManager.instance().s2c(itemStack, serverPlayer).ifPresent((newItemStack) -> {
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
@@ -2022,11 +2021,11 @@ public class PacketConsumers {
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_CURSOR_ITEM = (user, event) -> {
try {
if (!(user instanceof BukkitServerPlayer serverPlayer)) return;
FriendlyByteBuf buf = event.getBuffer();
ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user);
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
BukkitItemManager.instance().s2c(itemStack, context).ifPresent((newItemStack) -> {
BukkitItemManager.instance().s2c(itemStack, serverPlayer).ifPresent((newItemStack) -> {
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
@@ -2040,9 +2039,9 @@ public class PacketConsumers {
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_EQUIPMENT = (user, event) -> {
try {
if (!(user instanceof BukkitServerPlayer serverPlayer)) return;
FriendlyByteBuf buf = event.getBuffer();
boolean changed = false;
ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user);
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
int entity = buf.readVarInt();
List<com.mojang.datafixers.util.Pair<Object, ItemStack>> slots = Lists.newArrayList();
@@ -2051,7 +2050,7 @@ public class PacketConsumers {
slotMask = buf.readByte();
Object equipmentSlot = Reflections.instance$EquipmentSlot$values[slotMask & 127];
ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
Optional<ItemStack> optional = BukkitItemManager.instance().s2c(itemStack, context);
Optional<ItemStack> optional = BukkitItemManager.instance().s2c(itemStack, serverPlayer);
if (optional.isPresent()) {
changed = true;
itemStack = optional.get();
@@ -2081,12 +2080,12 @@ public class PacketConsumers {
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_PLAYER_INVENTORY_1_21_2 = (user, event) -> {
try {
if (!(user instanceof BukkitServerPlayer serverPlayer)) return;
FriendlyByteBuf buf = event.getBuffer();
ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user);
int slot = buf.readVarInt();
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
BukkitItemManager.instance().s2c(itemStack, context).ifPresent((newItemStack) -> {
BukkitItemManager.instance().s2c(itemStack, serverPlayer).ifPresent((newItemStack) -> {
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
@@ -2101,13 +2100,13 @@ public class PacketConsumers {
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> SET_CREATIVE_MODE_SLOT = (user, event) -> {
try {
if (!(user instanceof BukkitServerPlayer serverPlayer)) return;
FriendlyByteBuf buf = event.getBuffer();
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
short slotNum = buf.readShort();
ItemStack itemStack = VersionHelper.isOrAbove1_20_5() ?
FastNMS.INSTANCE.method$FriendlyByteBuf$readUntrustedItem(friendlyBuf) : FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user);
BukkitItemManager.instance().c2s(itemStack, context).ifPresent((newItemStack) -> {
BukkitItemManager.instance().c2s(itemStack).ifPresent((newItemStack) -> {
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
@@ -2127,9 +2126,9 @@ public class PacketConsumers {
public static final BiConsumer<NetWorkUser, ByteBufPacketEvent> CONTAINER_CLICK_1_20 = (user, event) -> {
try {
if (VersionHelper.isOrAbove1_21_5()) return; // 1.21.5+需要其他办法解决同步问题
if (!(user instanceof BukkitServerPlayer serverPlayer)) return;
FriendlyByteBuf buf = event.getBuffer();
boolean changed = false;
ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user);
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
int containerId = buf.readContainerId();
int stateId = buf.readVarInt();
@@ -2141,7 +2140,7 @@ public class PacketConsumers {
for (int j = 0; j < i; ++j) {
int k = buf.readShort();
ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
Optional<ItemStack> optional = BukkitItemManager.instance().c2s(itemStack, context);
Optional<ItemStack> optional = BukkitItemManager.instance().c2s(itemStack);
if (optional.isPresent()) {
changed = true;
itemStack = optional.get();
@@ -2149,7 +2148,7 @@ public class PacketConsumers {
changedSlots.put(k, itemStack);
}
ItemStack carriedItem = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
Optional<ItemStack> optional = BukkitItemManager.instance().c2s(carriedItem, context);
Optional<ItemStack> optional = BukkitItemManager.instance().c2s(carriedItem);
if (optional.isPresent()) {
changed = true;
carriedItem = optional.get();

View File

@@ -4,7 +4,6 @@ import net.momirealms.craftengine.bukkit.item.BukkitItemManager;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer;
import net.momirealms.craftengine.bukkit.util.EntityDataUtils;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent;
import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler;
import net.momirealms.craftengine.core.plugin.network.NetWorkUser;
@@ -20,7 +19,6 @@ public class CommonItemPacketHandler implements EntityPacketHandler {
@Override
public void handleSetEntityData(NetWorkUser user, ByteBufPacketEvent event) {
FriendlyByteBuf buf = event.getBuffer();
ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user);
int id = buf.readVarInt();
boolean isChanged = false;
List<Object> packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf);
@@ -30,7 +28,7 @@ public class CommonItemPacketHandler implements EntityPacketHandler {
if (entityDataId == EntityDataUtils.ITEM_DATA_ID) {
Object nmsItemStack = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem);
ItemStack itemStack = FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(nmsItemStack);
Optional<ItemStack> optional = BukkitItemManager.instance().s2c(itemStack, context);
Optional<ItemStack> optional = BukkitItemManager.instance().s2c(itemStack, (BukkitServerPlayer) user);
if (optional.isPresent()) {
isChanged = true;
itemStack = optional.get();

View File

@@ -4,7 +4,6 @@ import net.momirealms.craftengine.bukkit.item.BukkitItemManager;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer;
import net.momirealms.craftengine.bukkit.util.EntityDataUtils;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.plugin.network.ByteBufPacketEvent;
import net.momirealms.craftengine.core.plugin.network.EntityPacketHandler;
import net.momirealms.craftengine.core.plugin.network.NetWorkUser;
@@ -20,7 +19,6 @@ public class ItemDisplayPacketHandler implements EntityPacketHandler {
@Override
public void handleSetEntityData(NetWorkUser user, ByteBufPacketEvent event) {
FriendlyByteBuf buf = event.getBuffer();
ItemBuildContext context = ItemBuildContext.of((BukkitServerPlayer) user);
int id = buf.readVarInt();
boolean isChanged = false;
List<Object> packedItems = FastNMS.INSTANCE.method$ClientboundSetEntityDataPacket$unpack(buf);
@@ -30,7 +28,7 @@ public class ItemDisplayPacketHandler implements EntityPacketHandler {
if (entityDataId == EntityDataUtils.DISPLAYED_ITEM_DATA_ID) {
Object nmsItemStack = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem);
ItemStack itemStack = FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(nmsItemStack);
Optional<ItemStack> optional = BukkitItemManager.instance().s2c(itemStack, context);
Optional<ItemStack> optional = BukkitItemManager.instance().s2c(itemStack, (BukkitServerPlayer) user);
if (optional.isPresent()) {
isChanged = true;
itemStack = optional.get();

View File

@@ -16,7 +16,6 @@ import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
import java.sql.Ref;
import java.util.ArrayList;
import java.util.List;