9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2026-01-04 15:41:38 +00:00
This commit is contained in:
XiaoMoMi
2025-10-13 05:02:40 +08:00
parent e9a526c0ae
commit 884e7cd4e4
13 changed files with 337 additions and 201 deletions

View File

@@ -102,17 +102,6 @@ public class BukkitItemManager extends AbstractItemManager<ItemStack> {
Bukkit.getPluginManager().registerEvents(this.armorEventListener, this.plugin.javaPlugin());
}
@Override
public Item<ItemStack> decode(FriendlyByteBuf byteBuf) {
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(byteBuf);
return this.wrap(FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf));
}
@Override
public void encode(FriendlyByteBuf byteBuf, Item<ItemStack> item) {
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(FastNMS.INSTANCE.constructor$FriendlyByteBuf(byteBuf), item.getItem());
}
@Override
public NetworkItemHandler<ItemStack> networkItemHandler() {
return this.networkItemHandler;
@@ -123,20 +112,15 @@ public class BukkitItemManager extends AbstractItemManager<ItemStack> {
}
@Override
public Item<ItemStack> s2c(Item<ItemStack> item, Player player) {
if (item.isEmpty()) return item;
return this.networkItemHandler.s2c(item, player).orElse(item);
}
@Override
public Optional<Item<ItemStack>> s2cNew(Item<ItemStack> item, Player player) {
public Optional<Item<ItemStack>> s2c(Item<ItemStack> item, Player player) {
if (item.isEmpty()) return Optional.empty();
return this.networkItemHandler.s2c(item, player);
}
@Override
public Item<ItemStack> c2s(Item<ItemStack> item) {
if (item.isEmpty()) return item;
return this.networkItemHandler.c2s(item).orElse(item);
public Optional<Item<ItemStack>> c2s(Item<ItemStack> item) {
if (item.isEmpty()) return Optional.empty();
return this.networkItemHandler.c2s(item);
}
public Optional<ItemStack> s2c(ItemStack item, Player player) {

View File

@@ -21,11 +21,12 @@ public class LegacyItemWrapper implements ItemWrapper<ItemStack> {
Object finalNMSTag;
if (value instanceof Tag tag) {
finalNMSTag = MRegistryOps.SPARROW_NBT.convertTo(MRegistryOps.NBT, tag);
} else if (CoreReflections.clazz$Tag.isInstance(value)) {
finalNMSTag = value;
} else {
finalNMSTag = MRegistryOps.JAVA.convertTo(MRegistryOps.NBT, value);
}
Object currentTag = FastNMS.INSTANCE.field$ItemStack$getOrCreateTag(this.nmsStack);
if (path == null || path.length == 0) {
if (CoreReflections.clazz$CompoundTag.isInstance(finalNMSTag)) {
FastNMS.INSTANCE.method$ItemStack$setTag(this.nmsStack, finalNMSTag);
@@ -34,6 +35,8 @@ public class LegacyItemWrapper implements ItemWrapper<ItemStack> {
return false;
}
Object currentTag = FastNMS.INSTANCE.field$ItemStack$getOrCreateTag(this.nmsStack);
for (int i = 0; i < path.length - 1; i++) {
Object pathSegment = path[i];
if (pathSegment == null) return false;

View File

@@ -16,6 +16,7 @@ import net.momirealms.craftengine.core.plugin.context.ContextKey;
import net.momirealms.craftengine.core.plugin.context.NetworkTextReplaceContext;
import net.momirealms.craftengine.core.plugin.text.component.ComponentProvider;
import net.momirealms.craftengine.core.util.AdventureHelper;
import net.momirealms.craftengine.core.util.Pair;
import net.momirealms.sparrow.nbt.CompoundTag;
import net.momirealms.sparrow.nbt.ListTag;
import net.momirealms.sparrow.nbt.StringTag;
@@ -35,6 +36,63 @@ public final class LegacyNetworkItemHandler implements NetworkItemHandler<ItemSt
public Optional<Item<ItemStack>> c2s(Item<ItemStack> wrapped) {
boolean forceReturn = false;
// 处理收纳袋
Object bundleContents = wrapped.getExactTag("Items");
if (bundleContents != null) {
List<Object> newItems = new ArrayList<>();
boolean changed = false;
for (Object tag : (Iterable<?>) bundleContents) {
Object previousItem = FastNMS.INSTANCE.method$ItemStack$of(tag);
Optional<ItemStack> itemStack = BukkitItemManager.instance().c2s(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(previousItem));
if (itemStack.isPresent()) {
newItems.add(FastNMS.INSTANCE.field$CraftItemStack$handle(itemStack.get()));
changed = true;
} else {
newItems.add(previousItem);
}
}
if (changed) {
Object listTag = FastNMS.INSTANCE.constructor$ListTag();
for (Object newItem : newItems) {
FastNMS.INSTANCE.method$ListTag$add(listTag, 0, FastNMS.INSTANCE.method$itemStack$save(newItem, FastNMS.INSTANCE.constructor$CompoundTag()));
}
wrapped.setTag(listTag, "Items");
forceReturn = true;
}
}
// 处理container
Object containerContents = wrapped.getExactTag("BlockEntityTag");
if (containerContents != null) {
Object itemTags = FastNMS.INSTANCE.method$CompoundTag$get(containerContents, "Items");
if (itemTags != null) {
boolean changed = false;
List<Pair<Byte, Object>> newItems = new ArrayList<>();
for (Object tag : (Iterable<?>) itemTags) {
Object previousItem = FastNMS.INSTANCE.method$ItemStack$of(tag);
Optional<ItemStack> itemStack = BukkitItemManager.instance().c2s(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(previousItem));
byte slot = FastNMS.INSTANCE.method$ByteTag$value(FastNMS.INSTANCE.method$CompoundTag$get(tag, "Slot"));
if (itemStack.isPresent()) {
newItems.add(Pair.of(slot, FastNMS.INSTANCE.field$CraftItemStack$handle(itemStack.get())));
changed = true;
} else {
newItems.add(Pair.of(slot, previousItem));
}
}
if (changed) {
Object listTag = FastNMS.INSTANCE.constructor$ListTag();
for (Pair<Byte, Object> newItem : newItems) {
Object newTag = FastNMS.INSTANCE.method$itemStack$save(newItem.right(), FastNMS.INSTANCE.constructor$CompoundTag());
Object slotTag = FastNMS.INSTANCE.constructor$ByteTag(newItem.left());
FastNMS.INSTANCE.method$CompoundTag$put(newTag, "Slot", slotTag);
FastNMS.INSTANCE.method$ListTag$add(listTag, 0, newTag);
}
wrapped.setTag(listTag, "BlockEntityTag", "Items");
forceReturn = true;
}
}
}
Optional<CustomItem<ItemStack>> optionalCustomItem = wrapped.getCustomItem();
if (optionalCustomItem.isPresent()) {
BukkitCustomItem customItem = (BukkitCustomItem) optionalCustomItem.get();
@@ -57,15 +115,69 @@ public final class LegacyNetworkItemHandler implements NetworkItemHandler<ItemSt
}
}
return forceReturn ? Optional.empty() : Optional.of(wrapped);
return forceReturn ? Optional.of(wrapped) : Optional.empty();
}
@Override
public Optional<Item<ItemStack>> s2c(Item<ItemStack> wrapped, Player player) {
boolean forceReturn = false;
// todo 处理bundle
// todo 处理container
// 处理收纳袋
Object bundleContents = wrapped.getExactTag("Items");
if (bundleContents != null) {
List<Object> newItems = new ArrayList<>();
boolean changed = false;
for (Object tag : (Iterable<?>) bundleContents) {
Object previousItem = FastNMS.INSTANCE.method$ItemStack$of(tag);
Optional<ItemStack> itemStack = BukkitItemManager.instance().s2c(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(previousItem), player);
if (itemStack.isPresent()) {
newItems.add(FastNMS.INSTANCE.field$CraftItemStack$handle(itemStack.get()));
changed = true;
} else {
newItems.add(previousItem);
}
}
if (changed) {
Object listTag = FastNMS.INSTANCE.constructor$ListTag();
for (Object newItem : newItems) {
FastNMS.INSTANCE.method$ListTag$add(listTag, 0, FastNMS.INSTANCE.method$itemStack$save(newItem, FastNMS.INSTANCE.constructor$CompoundTag()));
}
wrapped.setTag(listTag, "Items");
forceReturn = true;
}
}
// 处理container
Object containerContents = wrapped.getExactTag("BlockEntityTag");
if (containerContents != null) {
Object itemTags = FastNMS.INSTANCE.method$CompoundTag$get(containerContents, "Items");
if (itemTags != null) {
boolean changed = false;
List<Pair<Byte, Object>> newItems = new ArrayList<>();
for (Object tag : (Iterable<?>) itemTags) {
Object previousItem = FastNMS.INSTANCE.method$ItemStack$of(tag);
Optional<ItemStack> itemStack = BukkitItemManager.instance().s2c(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(previousItem), player);
byte slot = FastNMS.INSTANCE.method$ByteTag$value(FastNMS.INSTANCE.method$CompoundTag$get(tag, "Slot"));
if (itemStack.isPresent()) {
newItems.add(Pair.of(slot, FastNMS.INSTANCE.field$CraftItemStack$handle(itemStack.get())));
changed = true;
} else {
newItems.add(Pair.of(slot, previousItem));
}
}
if (changed) {
Object listTag = FastNMS.INSTANCE.constructor$ListTag();
for (Pair<Byte, Object> newItem : newItems) {
Object newTag = FastNMS.INSTANCE.method$itemStack$save(newItem.right(), FastNMS.INSTANCE.constructor$CompoundTag());
Object slotTag = FastNMS.INSTANCE.constructor$ByteTag(newItem.left());
FastNMS.INSTANCE.method$CompoundTag$put(newTag, "Slot", slotTag);
FastNMS.INSTANCE.method$ListTag$add(listTag, 0, newTag);
}
wrapped.setTag(listTag, "BlockEntityTag", "Items");
forceReturn = true;
}
}
}
// todo 处理book

View File

@@ -2174,7 +2174,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
float zDist = buf.readFloat();
float maxSpeed = buf.readFloat();
int count = buf.readInt();
Object option = FastNMS.INSTANCE.method$StreamDecoder$decode(NetworkReflections.instance$ParticleTypes$STREAM_CODEC, FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf));
Object option = FastNMS.INSTANCE.method$StreamDecoder$decode(NetworkReflections.instance$ParticleTypes$STREAM_CODEC, FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf.source()));
if (option == null) return;
if (!CoreReflections.clazz$BlockParticleOption.isInstance(option)) return;
Object blockState = FastNMS.INSTANCE.field$BlockParticleOption$blockState(option);
@@ -2196,7 +2196,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
buf.writeFloat(zDist);
buf.writeFloat(maxSpeed);
buf.writeInt(count);
FastNMS.INSTANCE.method$StreamEncoder$encode(NetworkReflections.instance$ParticleTypes$STREAM_CODEC, FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf), remappedOption);
FastNMS.INSTANCE.method$StreamEncoder$encode(NetworkReflections.instance$ParticleTypes$STREAM_CODEC, FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf.source()), remappedOption);
}
}
@@ -2221,7 +2221,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
float zDist = buf.readFloat();
float maxSpeed = buf.readFloat();
int count = buf.readInt();
Object option = FastNMS.INSTANCE.method$StreamDecoder$decode(NetworkReflections.instance$ParticleTypes$STREAM_CODEC, FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf));
Object option = FastNMS.INSTANCE.method$StreamDecoder$decode(NetworkReflections.instance$ParticleTypes$STREAM_CODEC, FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf.source()));
if (option == null) return;
if (!CoreReflections.clazz$BlockParticleOption.isInstance(option)) return;
Object blockState = FastNMS.INSTANCE.field$BlockParticleOption$blockState(option);
@@ -2242,7 +2242,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
buf.writeFloat(zDist);
buf.writeFloat(maxSpeed);
buf.writeInt(count);
FastNMS.INSTANCE.method$StreamEncoder$encode(NetworkReflections.instance$ParticleTypes$STREAM_CODEC, FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf), remappedOption);
FastNMS.INSTANCE.method$StreamEncoder$encode(NetworkReflections.instance$ParticleTypes$STREAM_CODEC, FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf.source()), remappedOption);
}
}
@@ -2433,10 +2433,12 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
}
Item<ItemStack> wrap = this.plugin.itemManager().wrap(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(nmsItemStack));
Item<ItemStack> clientBoundItem = this.plugin.itemManager().s2c(wrap, player);
if (clientBoundItem.isEmpty()) {
Optional<Item<ItemStack>> remapped = this.plugin.itemManager().s2c(wrap, player);
if (remapped.isEmpty()) {
return showItem;
}
Item<ItemStack> clientBoundItem = remapped.get();
net.kyori.adventure.key.Key id = KeyUtils.toAdventureKey(clientBoundItem.vanillaId());
int count = clientBoundItem.count();
if (VersionHelper.COMPONENT_RELEASE) {
@@ -3015,7 +3017,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
List<RecipeBookEntry<ItemStack>> entries = buf.readCollection(ArrayList::new, byteBuf -> {
RecipeBookEntry<ItemStack> entry = RecipeBookEntry.read(byteBuf, __ -> itemManager.wrap(FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf)));
entry.applyClientboundData(item -> {
Optional<Item<ItemStack>> remapped = itemManager.s2cNew(item, player);
Optional<Item<ItemStack>> remapped = itemManager.s2c(item, player);
if (remapped.isEmpty()) {
return item;
}
@@ -3050,7 +3052,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
int containerId = buf.readContainerId();
RecipeDisplay<ItemStack> display = RecipeDisplay.read(buf, __ -> itemManager.wrap(FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf)));
display.applyClientboundData(item -> {
Optional<Item<ItemStack>> remapped = itemManager.s2cNew(item, player);
Optional<Item<ItemStack>> remapped = itemManager.s2c(item, player);
if (remapped.isEmpty()) {
return item;
}
@@ -3082,7 +3084,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
List<LegacyRecipeHolder<ItemStack>> holders = buf.readCollection(ArrayList::new, byteBuf -> {
LegacyRecipeHolder<ItemStack> holder = LegacyRecipeHolder.read(byteBuf, __ -> itemManager.wrap(FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf)));
holder.recipe().applyClientboundData(item -> {
Optional<Item<ItemStack>> remapped = itemManager.s2cNew(item, player);
Optional<Item<ItemStack>> remapped = itemManager.s2c(item, player);
if (remapped.isEmpty()) {
return item;
}
@@ -3106,32 +3108,57 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
@Override
public void onPacketSend(NetWorkUser user, ByteBufPacketEvent event) {
if (!(user instanceof BukkitServerPlayer serverPlayer)) return;
if (Config.disableItemOperations() && !Config.interceptAdvancement()) return;
MutableBoolean changed = new MutableBoolean(false);
FriendlyByteBuf buf = event.getBuffer();
BukkitItemManager itemManager = BukkitItemManager.instance();
BukkitServerPlayer player = (BukkitServerPlayer) user;
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf.source());
boolean reset = buf.readBoolean();
List<AdvancementHolder> added = buf.readCollection(ArrayList::new, byteBuf -> {
AdvancementHolder holder = AdvancementHolder.read(byteBuf);
holder.applyClientboundData(serverPlayer);
List<AdvancementHolder<ItemStack>> added = buf.readCollection(ArrayList::new, byteBuf -> {
AdvancementHolder<ItemStack> holder = AdvancementHolder.read(byteBuf, __ -> itemManager.wrap(FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf)));
if (!Config.disableItemOperations()) {
holder.applyClientboundData(item -> {
Optional<Item<ItemStack>> remapped = itemManager.s2c(item, player);
if (remapped.isEmpty()) {
return item;
}
changed.set(true);
return remapped.get();
});
}
if (Config.interceptAdvancement()) {
holder.replaceNetworkTags(component -> {
Map<String, ComponentProvider> tokens = CraftEngine.instance().fontManager().matchTags(AdventureHelper.componentToJson(component));
if (tokens.isEmpty()) return component;
changed.set(true);
return AdventureHelper.replaceText(component, tokens, NetworkTextReplaceContext.of(player));
});
}
return holder;
});
Set<Key> removed = buf.readCollection(Sets::newLinkedHashSetWithExpectedSize, FriendlyByteBuf::readKey);
Map<Key, AdvancementProgress> progress = buf.readMap(FriendlyByteBuf::readKey, AdvancementProgress::read);
boolean showAdvancement = false;
if (VersionHelper.isOrAbove1_21_5()) {
showAdvancement = buf.readBoolean();
}
if (changed.booleanValue()) {
Set<Key> removed = buf.readCollection(Sets::newLinkedHashSetWithExpectedSize, FriendlyByteBuf::readKey);
Map<Key, AdvancementProgress> progress = buf.readMap(FriendlyByteBuf::readKey, AdvancementProgress::read);
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
boolean showAdvancement = false;
if (VersionHelper.isOrAbove1_21_5()) {
showAdvancement = buf.readBoolean();
}
buf.writeBoolean(reset);
buf.writeCollection(added, (byteBuf, advancementHolder) -> advancementHolder.write(byteBuf));
buf.writeCollection(removed, FriendlyByteBuf::writeKey);
buf.writeMap(progress, FriendlyByteBuf::writeKey, (byteBuf, advancementProgress) -> advancementProgress.write(byteBuf));
if (VersionHelper.isOrAbove1_21_5()) {
buf.writeBoolean(showAdvancement);
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeBoolean(reset);
buf.writeCollection(added, (byteBuf, advancementHolder) -> advancementHolder.write(byteBuf,
(__, item) -> FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(friendlyBuf, item.getItem())));
buf.writeCollection(removed, FriendlyByteBuf::writeKey);
buf.writeMap(progress, FriendlyByteBuf::writeKey, (byteBuf, advancementProgress) -> advancementProgress.write(byteBuf));
if (VersionHelper.isOrAbove1_21_5()) {
buf.writeBoolean(showAdvancement);
}
}
}
}
@@ -3141,16 +3168,16 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
@Override
public void onPacketSend(NetWorkUser user, ByteBufPacketEvent event) {
FriendlyByteBuf buf = event.getBuffer();
boolean isChange = false;
boolean changed = false;
IntList intList = buf.readIntIdList();
for (int i = 0, size = intList.size(); i < size; i++) {
int entityId = intList.getInt(i);
EntityPacketHandler handler = user.entityPacketHandlers().remove(entityId);
if (handler != null && handler.handleEntitiesRemove(intList)) {
isChange = true;
changed = true;
}
}
if (isChange) {
if (changed) {
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
@@ -3244,7 +3271,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
int listSize = buf.readVarInt();
List<ItemStack> items = new ArrayList<>(listSize);
boolean changed = false;
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf.source());
for (int i = 0; i < listSize; i++) {
ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
Optional<ItemStack> optional = BukkitItemManager.instance().s2c(itemStack, serverPlayer);
@@ -3269,11 +3296,10 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
buf.writeContainerId(containerId);
buf.writeVarInt(stateId);
buf.writeVarInt(listSize);
Object newFriendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
for (ItemStack itemStack : items) {
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(newFriendlyBuf, itemStack);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(friendlyBuf, itemStack);
}
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(newFriendlyBuf, newCarriedItem);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(friendlyBuf, newCarriedItem);
}
}
@@ -3287,7 +3313,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
int containerId = buf.readContainerId();
int stateId = buf.readVarInt();
int slot = buf.readShort();
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf.source());
ItemStack itemStack;
try {
itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
@@ -3302,8 +3328,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
buf.writeContainerId(containerId);
buf.writeVarInt(stateId);
buf.writeShort(slot);
Object newFriendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(newFriendlyBuf, newItemStack);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(friendlyBuf, newItemStack);
});
}
}
@@ -3315,14 +3340,13 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
if (Config.disableItemOperations()) return;
if (!(user instanceof BukkitServerPlayer serverPlayer)) return;
FriendlyByteBuf buf = event.getBuffer();
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf.source());
ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
BukkitItemManager.instance().s2c(itemStack, serverPlayer).ifPresent((newItemStack) -> {
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
Object newFriendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(newFriendlyBuf, newItemStack);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(friendlyBuf, newItemStack);
});
}
}
@@ -3335,7 +3359,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
if (!(user instanceof BukkitServerPlayer serverPlayer)) return;
FriendlyByteBuf buf = event.getBuffer();
boolean changed = false;
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf.source());
int entity = buf.readVarInt();
List<com.mojang.datafixers.util.Pair<Object, ItemStack>> slots = Lists.newArrayList();
int slotMask;
@@ -3356,14 +3380,13 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
buf.writeVarInt(event.packetID());
buf.writeVarInt(entity);
int i = slots.size();
Object newFriendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
for (int j = 0; j < i; ++j) {
com.mojang.datafixers.util.Pair<Object, ItemStack> pair = slots.get(j);
Enum<?> equipmentSlot = (Enum<?>) pair.getFirst();
boolean bl = j != i - 1;
int k = equipmentSlot.ordinal();
buf.writeByte(bl ? k | -128 : k);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(newFriendlyBuf, pair.getSecond());
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(friendlyBuf, pair.getSecond());
}
}
}
@@ -3377,15 +3400,14 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
if (!(user instanceof BukkitServerPlayer serverPlayer)) return;
FriendlyByteBuf buf = event.getBuffer();
int slot = buf.readVarInt();
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf.source());
ItemStack itemStack = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
BukkitItemManager.instance().s2c(itemStack, serverPlayer).ifPresent((newItemStack) -> {
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeVarInt(slot);
Object newFriendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(newFriendlyBuf, newItemStack);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(friendlyBuf, newItemStack);
});
}
}
@@ -3398,7 +3420,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
if (!(user instanceof BukkitServerPlayer serverPlayer)) return;
if (!serverPlayer.isCreativeMode()) return;
FriendlyByteBuf buf = event.getBuffer();
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf.source());
short slotNum = buf.readShort();
ItemStack itemStack;
try {
@@ -3412,11 +3434,10 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeShort(slotNum);
Object newFriendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
if (VersionHelper.isOrAbove1_20_5()) {
FastNMS.INSTANCE.method$FriendlyByteBuf$writeUntrustedItem(newFriendlyBuf, newItemStack);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeUntrustedItem(friendlyBuf, newItemStack);
} else {
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(newFriendlyBuf, newItemStack);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(friendlyBuf, newItemStack);
}
});
}
@@ -3429,7 +3450,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
if (Config.disableItemOperations()) return;
FriendlyByteBuf buf = event.getBuffer();
boolean changed = false;
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf.source());
int containerId = buf.readContainerId();
int stateId = buf.readVarInt();
short slotNum = buf.readShort();
@@ -3463,12 +3484,11 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
buf.writeByte(buttonNum);
buf.writeVarInt(clickType);
buf.writeVarInt(changedSlots.size());
Object newFriendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf);
changedSlots.forEach((k, v) -> {
buf.writeShort(k);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(newFriendlyBuf, v);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(friendlyBuf, v);
});
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(newFriendlyBuf, carriedItem);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(friendlyBuf, carriedItem);
}
}
}
@@ -3879,8 +3899,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
FriendlyByteBuf buf = event.getBuffer();
int containerId = buf.readContainerId();
BukkitItemManager manager = BukkitItemManager.instance();
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf.source());
List<MerchantOffer<ItemStack>> merchantOffers = buf.readCollection(ArrayList::new, byteBuf -> {
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(byteBuf);
ItemStack cost1 = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
ItemStack result = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
ItemStack cost2 = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
@@ -3893,36 +3913,47 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
int demand = byteBuf.readInt();
return new MerchantOffer<>(manager.wrap(cost1), Optional.of(manager.wrap(cost2)), manager.wrap(result), outOfStock, uses, maxUses, xp, specialPrice, priceMultiplier, demand);
});
MutableBoolean changed = new MutableBoolean(false);
for (MerchantOffer<ItemStack> offer : merchantOffers) {
offer.applyClientboundData(item -> manager.s2c(item, serverPlayer));
offer.applyClientboundData(item -> {
Optional<Item<ItemStack>> remapped = manager.s2c(item, serverPlayer);
if (remapped.isEmpty()) {
return item;
}
changed.set(true);
return remapped.get();
});
}
int villagerLevel = buf.readVarInt();
int villagerXp = buf.readVarInt();
boolean showProgress = buf.readBoolean();
boolean canRestock = buf.readBoolean();
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeContainerId(containerId);
buf.writeCollection(merchantOffers, (byteBuf, offer) -> {
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(byteBuf);
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(friendlyBuf, offer.cost1().getItem());
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(friendlyBuf, offer.result().getItem());
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(friendlyBuf, offer.cost2().get().getItem());
byteBuf.writeBoolean(offer.outOfStock());
byteBuf.writeInt(offer.uses());
byteBuf.writeInt(offer.maxUses());
byteBuf.writeInt(offer.xp());
byteBuf.writeInt(offer.specialPrice());
byteBuf.writeFloat(offer.priceMultiplier());
byteBuf.writeInt(offer.demand());
});
if (changed.booleanValue()) {
int villagerLevel = buf.readVarInt();
int villagerXp = buf.readVarInt();
boolean showProgress = buf.readBoolean();
boolean canRestock = buf.readBoolean();
buf.writeVarInt(villagerLevel);
buf.writeVarInt(villagerXp);
buf.writeBoolean(showProgress);
buf.writeBoolean(canRestock);
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeContainerId(containerId);
buf.writeCollection(merchantOffers, (byteBuf, offer) -> {
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(friendlyBuf, offer.cost1().getItem());
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(friendlyBuf, offer.result().getItem());
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(friendlyBuf, offer.cost2().get().getItem());
byteBuf.writeBoolean(offer.outOfStock());
byteBuf.writeInt(offer.uses());
byteBuf.writeInt(offer.maxUses());
byteBuf.writeInt(offer.xp());
byteBuf.writeInt(offer.specialPrice());
byteBuf.writeFloat(offer.priceMultiplier());
byteBuf.writeInt(offer.demand());
});
buf.writeVarInt(villagerLevel);
buf.writeVarInt(villagerXp);
buf.writeBoolean(showProgress);
buf.writeBoolean(canRestock);
}
}
}
@@ -3936,8 +3967,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
FriendlyByteBuf buf = event.getBuffer();
int containerId = buf.readContainerId();
BukkitItemManager manager = BukkitItemManager.instance();
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf.source());
List<MerchantOffer<ItemStack>> merchantOffers = buf.readCollection(ArrayList::new, byteBuf -> {
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(byteBuf);
ItemStack cost1 = FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(FastNMS.INSTANCE.field$ItemCost$itemStack(FastNMS.INSTANCE.method$StreamDecoder$decode(NetworkReflections.instance$ItemCost$STREAM_CODEC, friendlyBuf)));
ItemStack result = FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf);
Optional<ItemStack> cost2 = ((Optional<Object>) FastNMS.INSTANCE.method$StreamDecoder$decode(NetworkReflections.instance$ItemCost$OPTIONAL_STREAM_CODEC, friendlyBuf))
@@ -3951,36 +3982,47 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
int demand = byteBuf.readInt();
return new MerchantOffer<>(manager.wrap(cost1), cost2.map(manager::wrap), manager.wrap(result), outOfStock, uses, maxUses, xp, specialPrice, priceMultiplier, demand);
});
MutableBoolean changed = new MutableBoolean(false);
for (MerchantOffer<ItemStack> offer : merchantOffers) {
offer.applyClientboundData(item -> manager.s2c(item, serverPlayer));
offer.applyClientboundData(item -> {
Optional<Item<ItemStack>> remapped = manager.s2c(item, serverPlayer);
if (remapped.isEmpty()) {
return item;
}
changed.set(true);
return remapped.get();
});
}
int villagerLevel = buf.readVarInt();
int villagerXp = buf.readVarInt();
boolean showProgress = buf.readBoolean();
boolean canRestock = buf.readBoolean();
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeContainerId(containerId);
buf.writeCollection(merchantOffers, (byteBuf, offer) -> {
Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(byteBuf);
FastNMS.INSTANCE.method$StreamEncoder$encode(NetworkReflections.instance$ItemCost$STREAM_CODEC, friendlyBuf, itemStackToItemCost(offer.cost1().getLiteralObject(), offer.cost1().count()));
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(friendlyBuf, offer.result().getItem());
FastNMS.INSTANCE.method$StreamEncoder$encode(NetworkReflections.instance$ItemCost$OPTIONAL_STREAM_CODEC, friendlyBuf, offer.cost2().map(it -> itemStackToItemCost(it.getLiteralObject(), it.count())));
byteBuf.writeBoolean(offer.outOfStock());
byteBuf.writeInt(offer.uses());
byteBuf.writeInt(offer.maxUses());
byteBuf.writeInt(offer.xp());
byteBuf.writeInt(offer.specialPrice());
byteBuf.writeFloat(offer.priceMultiplier());
byteBuf.writeInt(offer.demand());
});
if (changed.booleanValue()) {
int villagerLevel = buf.readVarInt();
int villagerXp = buf.readVarInt();
boolean showProgress = buf.readBoolean();
boolean canRestock = buf.readBoolean();
buf.writeVarInt(villagerLevel);
buf.writeVarInt(villagerXp);
buf.writeBoolean(showProgress);
buf.writeBoolean(canRestock);
event.setChanged(true);
buf.clear();
buf.writeVarInt(event.packetID());
buf.writeContainerId(containerId);
buf.writeCollection(merchantOffers, (byteBuf, offer) -> {
FastNMS.INSTANCE.method$StreamEncoder$encode(NetworkReflections.instance$ItemCost$STREAM_CODEC, friendlyBuf, itemStackToItemCost(offer.cost1().getLiteralObject(), offer.cost1().count()));
FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(friendlyBuf, offer.result().getItem());
FastNMS.INSTANCE.method$StreamEncoder$encode(NetworkReflections.instance$ItemCost$OPTIONAL_STREAM_CODEC, friendlyBuf, offer.cost2().map(it -> itemStackToItemCost(it.getLiteralObject(), it.count())));
byteBuf.writeBoolean(offer.outOfStock());
byteBuf.writeInt(offer.uses());
byteBuf.writeInt(offer.maxUses());
byteBuf.writeInt(offer.xp());
byteBuf.writeInt(offer.specialPrice());
byteBuf.writeFloat(offer.priceMultiplier());
byteBuf.writeInt(offer.demand());
});
buf.writeVarInt(villagerLevel);
buf.writeVarInt(villagerXp);
buf.writeBoolean(showProgress);
buf.writeBoolean(canRestock);
}
}
private Object itemStackToItemCost(Object itemStack, int count) {

View File

@@ -113,7 +113,8 @@ public class ProjectilePacketHandler implements EntityPacketHandler {
ProjectileMeta meta = this.projectile.metadata();
Item<ItemStack> displayedItem = customItem.get().buildItem(ItemBuildContext.empty());
// 我们应当使用新的展示物品的组件覆盖原物品的组件,以完成附魔,附魔光效等组件的继承
displayedItem = BukkitItemManager.instance().s2c(this.projectile.item().mergeCopy(displayedItem), player);
Item<ItemStack> item = this.projectile.item().mergeCopy(displayedItem);
displayedItem = BukkitItemManager.instance().s2c(item, player).orElse(item);
ItemDisplayEntityData.InterpolationDelay.addEntityDataIfNotDefaultValue(-1, itemDisplayValues);
ItemDisplayEntityData.Translation.addEntityDataIfNotDefaultValue(meta.translation(), itemDisplayValues);
ItemDisplayEntityData.Scale.addEntityDataIfNotDefaultValue(meta.scale(), itemDisplayValues);