diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java index bab28d61b..1bc0a1983 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java @@ -102,17 +102,6 @@ public class BukkitItemManager extends AbstractItemManager { Bukkit.getPluginManager().registerEvents(this.armorEventListener, this.plugin.javaPlugin()); } - @Override - public Item 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 item) { - FastNMS.INSTANCE.method$FriendlyByteBuf$writeItem(FastNMS.INSTANCE.constructor$FriendlyByteBuf(byteBuf), item.getItem()); - } - @Override public NetworkItemHandler networkItemHandler() { return this.networkItemHandler; @@ -123,20 +112,15 @@ public class BukkitItemManager extends AbstractItemManager { } @Override - public Item s2c(Item item, Player player) { - if (item.isEmpty()) return item; - return this.networkItemHandler.s2c(item, player).orElse(item); - } - - @Override - public Optional> s2cNew(Item item, Player player) { + public Optional> s2c(Item item, Player player) { + if (item.isEmpty()) return Optional.empty(); return this.networkItemHandler.s2c(item, player); } @Override - public Item c2s(Item item) { - if (item.isEmpty()) return item; - return this.networkItemHandler.c2s(item).orElse(item); + public Optional> c2s(Item item) { + if (item.isEmpty()) return Optional.empty(); + return this.networkItemHandler.c2s(item); } public Optional s2c(ItemStack item, Player player) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyItemWrapper.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyItemWrapper.java index fbb73a8cc..43fd07c84 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyItemWrapper.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyItemWrapper.java @@ -21,11 +21,12 @@ public class LegacyItemWrapper implements ItemWrapper { 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 { 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; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java index b02cb2e84..e3649d0ff 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java @@ -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> c2s(Item wrapped) { boolean forceReturn = false; + // 处理收纳袋 + Object bundleContents = wrapped.getExactTag("Items"); + if (bundleContents != null) { + List newItems = new ArrayList<>(); + boolean changed = false; + for (Object tag : (Iterable) bundleContents) { + Object previousItem = FastNMS.INSTANCE.method$ItemStack$of(tag); + Optional 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> newItems = new ArrayList<>(); + for (Object tag : (Iterable) itemTags) { + Object previousItem = FastNMS.INSTANCE.method$ItemStack$of(tag); + Optional 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 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> optionalCustomItem = wrapped.getCustomItem(); if (optionalCustomItem.isPresent()) { BukkitCustomItem customItem = (BukkitCustomItem) optionalCustomItem.get(); @@ -57,15 +115,69 @@ public final class LegacyNetworkItemHandler implements NetworkItemHandler> s2c(Item wrapped, Player player) { boolean forceReturn = false; - // todo 处理bundle - // todo 处理container + // 处理收纳袋 + Object bundleContents = wrapped.getExactTag("Items"); + if (bundleContents != null) { + List newItems = new ArrayList<>(); + boolean changed = false; + for (Object tag : (Iterable) bundleContents) { + Object previousItem = FastNMS.INSTANCE.method$ItemStack$of(tag); + Optional 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> newItems = new ArrayList<>(); + for (Object tag : (Iterable) itemTags) { + Object previousItem = FastNMS.INSTANCE.method$ItemStack$of(tag); + Optional 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 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 diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index 198a07975..2c7e830bf 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -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 wrap = this.plugin.itemManager().wrap(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(nmsItemStack)); - Item clientBoundItem = this.plugin.itemManager().s2c(wrap, player); - if (clientBoundItem.isEmpty()) { + Optional> remapped = this.plugin.itemManager().s2c(wrap, player); + if (remapped.isEmpty()) { return showItem; } + + Item 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> entries = buf.readCollection(ArrayList::new, byteBuf -> { RecipeBookEntry entry = RecipeBookEntry.read(byteBuf, __ -> itemManager.wrap(FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf))); entry.applyClientboundData(item -> { - Optional> remapped = itemManager.s2cNew(item, player); + Optional> 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 display = RecipeDisplay.read(buf, __ -> itemManager.wrap(FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf))); display.applyClientboundData(item -> { - Optional> remapped = itemManager.s2cNew(item, player); + Optional> remapped = itemManager.s2c(item, player); if (remapped.isEmpty()) { return item; } @@ -3082,7 +3084,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes List> holders = buf.readCollection(ArrayList::new, byteBuf -> { LegacyRecipeHolder holder = LegacyRecipeHolder.read(byteBuf, __ -> itemManager.wrap(FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf))); holder.recipe().applyClientboundData(item -> { - Optional> remapped = itemManager.s2cNew(item, player); + Optional> 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 added = buf.readCollection(ArrayList::new, byteBuf -> { - AdvancementHolder holder = AdvancementHolder.read(byteBuf); - holder.applyClientboundData(serverPlayer); + List> added = buf.readCollection(ArrayList::new, byteBuf -> { + AdvancementHolder holder = AdvancementHolder.read(byteBuf, __ -> itemManager.wrap(FastNMS.INSTANCE.method$FriendlyByteBuf$readItem(friendlyBuf))); + if (!Config.disableItemOperations()) { + holder.applyClientboundData(item -> { + Optional> remapped = itemManager.s2c(item, player); + if (remapped.isEmpty()) { + return item; + } + changed.set(true); + return remapped.get(); + }); + } + if (Config.interceptAdvancement()) { + holder.replaceNetworkTags(component -> { + Map 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 removed = buf.readCollection(Sets::newLinkedHashSetWithExpectedSize, FriendlyByteBuf::readKey); - Map progress = buf.readMap(FriendlyByteBuf::readKey, AdvancementProgress::read); - boolean showAdvancement = false; - if (VersionHelper.isOrAbove1_21_5()) { - showAdvancement = buf.readBoolean(); - } + if (changed.booleanValue()) { + Set removed = buf.readCollection(Sets::newLinkedHashSetWithExpectedSize, FriendlyByteBuf::readKey); + Map 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 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 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> 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 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> 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 offer : merchantOffers) { - offer.applyClientboundData(item -> manager.s2c(item, serverPlayer)); + offer.applyClientboundData(item -> { + Optional> 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> 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 cost2 = ((Optional) 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 offer : merchantOffers) { - offer.applyClientboundData(item -> manager.s2c(item, serverPlayer)); + offer.applyClientboundData(item -> { + Optional> 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) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ProjectilePacketHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ProjectilePacketHandler.java index f83158411..81ad7c893 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ProjectilePacketHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/handler/ProjectilePacketHandler.java @@ -113,7 +113,8 @@ public class ProjectilePacketHandler implements EntityPacketHandler { ProjectileMeta meta = this.projectile.metadata(); Item displayedItem = customItem.get().buildItem(ItemBuildContext.empty()); // 我们应当使用新的展示物品的组件覆盖原物品的组件,以完成附魔,附魔光效等组件的继承 - displayedItem = BukkitItemManager.instance().s2c(this.projectile.item().mergeCopy(displayedItem), player); + Item 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); diff --git a/core/src/main/java/net/momirealms/craftengine/core/advancement/network/Advancement.java b/core/src/main/java/net/momirealms/craftengine/core/advancement/network/Advancement.java index c58194ae9..a3d8dd0ed 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/advancement/network/Advancement.java +++ b/core/src/main/java/net/momirealms/craftengine/core/advancement/network/Advancement.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.core.advancement.network; -import net.momirealms.craftengine.core.entity.player.Player; +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.util.FriendlyByteBuf; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.VersionHelper; @@ -8,10 +9,11 @@ import org.jetbrains.annotations.ApiStatus; import java.util.Map; import java.util.Optional; +import java.util.function.Function; -public class Advancement { +public class Advancement { private final Optional parent; - private final Optional displayInfo; + private final Optional> displayInfo; // 1.20-1.20.1 private final Map criteria; @@ -19,7 +21,7 @@ public class Advancement { private final AdvancementRequirements requirements; private final boolean sendsTelemetryEvent; - public Advancement(Optional parent, Optional displayInfo, AdvancementRequirements requirements, boolean sendsTelemetryEvent) { + public Advancement(Optional parent, Optional> displayInfo, AdvancementRequirements requirements, boolean sendsTelemetryEvent) { this.criteria = null; this.displayInfo = displayInfo; this.parent = parent; @@ -28,7 +30,7 @@ public class Advancement { } @ApiStatus.Obsolete - public Advancement(Optional parent, Optional displayInfo, Map criteria, AdvancementRequirements requirements, boolean sendsTelemetryEvent) { + public Advancement(Optional parent, Optional> displayInfo, Map criteria, AdvancementRequirements requirements, boolean sendsTelemetryEvent) { this.criteria = criteria; this.displayInfo = displayInfo; this.parent = parent; @@ -36,24 +38,24 @@ public class Advancement { this.sendsTelemetryEvent = sendsTelemetryEvent; } - public static Advancement read(FriendlyByteBuf buf) { + public static Advancement read(FriendlyByteBuf buf, FriendlyByteBuf.Reader> reader) { Optional parent = buf.readOptional(FriendlyByteBuf::readKey); - Optional displayInfo = buf.readOptional(byteBuf -> AdvancementDisplay.read(buf)); + Optional> displayInfo = buf.readOptional(byteBuf -> AdvancementDisplay.read(buf, reader)); if (VersionHelper.isOrAbove1_20_2()) { AdvancementRequirements requirements = AdvancementRequirements.read(buf); boolean sendsTelemetryEvent = buf.readBoolean(); - return new Advancement(parent, displayInfo, requirements, sendsTelemetryEvent); + return new Advancement<>(parent, displayInfo, requirements, sendsTelemetryEvent); } else { Map criteria = buf.readMap(FriendlyByteBuf::readUtf, (byteBuf -> null)); AdvancementRequirements requirements = AdvancementRequirements.read(buf); boolean sendsTelemetryEvent = buf.readBoolean(); - return new Advancement(parent, displayInfo, criteria, requirements, sendsTelemetryEvent); + return new Advancement<>(parent, displayInfo, criteria, requirements, sendsTelemetryEvent); } } - public void write(FriendlyByteBuf buf) { + public void write(FriendlyByteBuf buf, FriendlyByteBuf.Writer> writer) { buf.writeOptional(this.parent, FriendlyByteBuf::writeKey); - buf.writeOptional(this.displayInfo, (byteBuf, info) -> info.write(buf)); + buf.writeOptional(this.displayInfo, (byteBuf, info) -> info.write(buf, writer)); if (!VersionHelper.isOrAbove1_20_2()) { buf.writeMap(this.criteria, FriendlyByteBuf::writeUtf, ((byteBuf, unused) -> {})); } @@ -61,7 +63,11 @@ public class Advancement { buf.writeBoolean(this.sendsTelemetryEvent); } - public void applyClientboundData(Player player) { - this.displayInfo.ifPresent(info -> info.applyClientboundData(player)); + public void applyClientboundData(Function, Item> function) { + this.displayInfo.ifPresent(info -> info.applyClientboundData(function)); + } + + public void replaceNetworkTags(Function function) { + this.displayInfo.ifPresent(info -> info.replaceNetworkTags(function)); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/advancement/network/AdvancementDisplay.java b/core/src/main/java/net/momirealms/craftengine/core/advancement/network/AdvancementDisplay.java index b2e22857d..d09b5f599 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/advancement/network/AdvancementDisplay.java +++ b/core/src/main/java/net/momirealms/craftengine/core/advancement/network/AdvancementDisplay.java @@ -2,26 +2,20 @@ package net.momirealms.craftengine.core.advancement.network; import net.kyori.adventure.text.Component; import net.momirealms.craftengine.core.advancement.AdvancementType; -import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.plugin.CraftEngine; -import net.momirealms.craftengine.core.plugin.config.Config; -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.FriendlyByteBuf; import net.momirealms.craftengine.core.util.Key; -import java.util.Map; import java.util.Optional; +import java.util.function.Function; -public class AdvancementDisplay { +public class AdvancementDisplay { public static final int FLAG_BACKGROUND = 0b001; public static final int FLAG_SHOW_TOAST = 0b010; public static final int FLAG_HIDDEN = 0b100; private Component title; private Component description; - private Item icon; + private Item icon; private Optional background; private final AdvancementType type; private final boolean showToast; @@ -31,7 +25,7 @@ public class AdvancementDisplay { public AdvancementDisplay(Component title, Component description, - Item icon, + Item icon, Optional background, AdvancementType type, boolean showToast, @@ -49,24 +43,19 @@ public class AdvancementDisplay { this.y = y; } - public void applyClientboundData(Player player) { - this.icon = CraftEngine.instance().itemManager().s2c(this.icon, player); - if (Config.interceptAdvancement()) { - Map tokens1 = CraftEngine.instance().fontManager().matchTags(AdventureHelper.componentToJson(this.title)); - if (!tokens1.isEmpty()) { - this.title = AdventureHelper.replaceText(this.title, tokens1, NetworkTextReplaceContext.of(player)); - } - Map tokens2 = CraftEngine.instance().fontManager().matchTags(AdventureHelper.componentToJson(this.description)); - if (!tokens2.isEmpty()) { - this.description = AdventureHelper.replaceText(this.description, tokens2, NetworkTextReplaceContext.of(player)); - } - } + public void applyClientboundData(Function, Item> function) { + this.icon = function.apply(this.icon); } - public void write(FriendlyByteBuf buf) { + public void replaceNetworkTags(Function function) { + this.title = function.apply(this.title); + this.description = function.apply(this.description); + } + + public void write(FriendlyByteBuf buf, FriendlyByteBuf.Writer> writer) { buf.writeComponent(this.title); buf.writeComponent(this.description); - CraftEngine.instance().itemManager().encode(buf, this.icon); + writer.accept(buf, this.icon); buf.writeVarInt(this.type.ordinal()); int flags = 0; if (this.background.isPresent()) { @@ -84,10 +73,10 @@ public class AdvancementDisplay { buf.writeFloat(this.y); } - public static AdvancementDisplay read(FriendlyByteBuf buf) { + public static AdvancementDisplay read(FriendlyByteBuf buf, FriendlyByteBuf.Reader> reader) { Component title = buf.readComponent(); Component description = buf.readComponent(); - Item icon = CraftEngine.instance().itemManager().decode(buf); + Item icon = reader.apply(buf); AdvancementType type = AdvancementType.byId(buf.readVarInt()); int flags = buf.readInt(); boolean hasBackground = (flags & 1) != 0; @@ -96,6 +85,6 @@ public class AdvancementDisplay { boolean hidden = (flags & 4) != 0; float x = buf.readFloat(); float y = buf.readFloat(); - return new AdvancementDisplay(title, description, icon, background, type, showToast, hidden, x, y); + return new AdvancementDisplay<>(title, description, icon, background, type, showToast, hidden, x, y); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/advancement/network/AdvancementHolder.java b/core/src/main/java/net/momirealms/craftengine/core/advancement/network/AdvancementHolder.java index 9e4ed5d7e..e33e22955 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/advancement/network/AdvancementHolder.java +++ b/core/src/main/java/net/momirealms/craftengine/core/advancement/network/AdvancementHolder.java @@ -1,23 +1,30 @@ package net.momirealms.craftengine.core.advancement.network; -import net.momirealms.craftengine.core.entity.player.Player; +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.util.FriendlyByteBuf; import net.momirealms.craftengine.core.util.Key; -public record AdvancementHolder(Key id, Advancement advancement) { +import java.util.function.Function; - public static AdvancementHolder read(FriendlyByteBuf buf) { +public record AdvancementHolder(Key id, Advancement advancement) { + + public static AdvancementHolder read(FriendlyByteBuf buf, FriendlyByteBuf.Reader> reader) { Key key = buf.readKey(); - Advancement ad = Advancement.read(buf); - return new AdvancementHolder(key, ad); + Advancement ad = Advancement.read(buf, reader); + return new AdvancementHolder<>(key, ad); } - public void write(FriendlyByteBuf buf) { + public void write(FriendlyByteBuf buf, FriendlyByteBuf.Writer> writer) { buf.writeKey(this.id); - this.advancement.write(buf); + this.advancement.write(buf, writer); } - public void applyClientboundData(Player player) { - this.advancement.applyClientboundData(player); + public void applyClientboundData(Function, Item> function) { + this.advancement.applyClientboundData(function); + } + + public void replaceNetworkTags(Function function) { + this.advancement.replaceNetworkTags(function); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java index d35797f64..d3a86d4f2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java @@ -110,15 +110,9 @@ public interface ItemManager extends Manageable, ModelGenerator { boolean isVanillaItem(Key item); - Item decode(FriendlyByteBuf byteBuf); + Optional> c2s(Item item); - void encode(FriendlyByteBuf byteBuf, Item item); - - Item s2c(Item item, Player player); - - Item c2s(Item item); - - Optional> s2cNew(Item item, Player player); + Optional> s2c(Item item, Player player); UniqueIdItem uniqueEmptyItem(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyShapedRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyShapedRecipe.java index 45ea3bedd..9f4ee26b1 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyShapedRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyShapedRecipe.java @@ -56,7 +56,7 @@ public class LegacyShapedRecipe implements LegacyRecipe { for (int i = 0; i < size; i++) { ingredients.add(LegacyIngredient.read(buf, reader)); } - Item result = CraftEngine.instance().itemManager().decode(buf); + Item result = reader.apply(buf); boolean flag = buf.readBoolean(); return new LegacyShapedRecipe(width, height, ingredients, result, group, CraftingRecipeCategory.byId(category), flag); } else { @@ -69,7 +69,7 @@ public class LegacyShapedRecipe implements LegacyRecipe { for (int i = 0; i < size; i++) { ingredients.add(LegacyIngredient.read(buf, reader)); } - Item result = CraftEngine.instance().itemManager().decode(buf); + Item result = reader.apply(buf); boolean flag = buf.readBoolean(); return new LegacyShapedRecipe(width, height, ingredients, result, group, CraftingRecipeCategory.byId(category), flag); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyShapelessRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyShapelessRecipe.java index f54c887a6..24000bd85 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyShapelessRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacyShapelessRecipe.java @@ -27,13 +27,12 @@ public class LegacyShapelessRecipe implements LegacyRecipe { this.group = group; } - @SuppressWarnings({"unchecked", "rawtypes"}) public static LegacyShapelessRecipe read(FriendlyByteBuf buf, FriendlyByteBuf.Reader> reader) { String group = buf.readUtf(); CraftingRecipeCategory category = CraftingRecipeCategory.byId(buf.readVarInt()); List> ingredient = buf.readCollection(ArrayList::new, (byteBuffer) -> LegacyIngredient.read(byteBuffer, reader)); - Item result = CraftEngine.instance().itemManager().decode(buf); - return new LegacyShapelessRecipe(ingredient, result, group, category); + Item result = reader.apply(buf); + return new LegacyShapelessRecipe<>(ingredient, result, group, category); } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacySmithingTransformRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacySmithingTransformRecipe.java index 51ff9e58b..b763db11b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacySmithingTransformRecipe.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/network/legacy/LegacySmithingTransformRecipe.java @@ -37,12 +37,11 @@ public class LegacySmithingTransformRecipe implements LegacyRecipe { this.addition.applyClientboundData(function); } - @SuppressWarnings({"unchecked", "rawtypes"}) public static LegacySmithingTransformRecipe read(FriendlyByteBuf buf, FriendlyByteBuf.Reader> reader) { LegacyIngredient template = LegacyIngredient.read(buf, reader); LegacyIngredient base = LegacyIngredient.read(buf, reader); LegacyIngredient addition = LegacyIngredient.read(buf, reader); - Item result = CraftEngine.instance().itemManager().decode(buf); - return new LegacySmithingTransformRecipe(template, base, addition, result); + Item result = reader.apply(buf); + return new LegacySmithingTransformRecipe<>(template, base, addition, result); } } diff --git a/gradle.properties b/gradle.properties index b36f41ba2..fdc8dc7de 100644 --- a/gradle.properties +++ b/gradle.properties @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.5 anti_grief_version=1.0.2 -nms_helper_version=1.0.112 +nms_helper_version=1.0.113 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.34.5