9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2026-01-06 15:52:03 +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);

View File

@@ -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<I> {
private final Optional<Key> parent;
private final Optional<AdvancementDisplay> displayInfo;
private final Optional<AdvancementDisplay<I>> displayInfo;
// 1.20-1.20.1
private final Map<String, Void> criteria;
@@ -19,7 +21,7 @@ public class Advancement {
private final AdvancementRequirements requirements;
private final boolean sendsTelemetryEvent;
public Advancement(Optional<Key> parent, Optional<AdvancementDisplay> displayInfo, AdvancementRequirements requirements, boolean sendsTelemetryEvent) {
public Advancement(Optional<Key> parent, Optional<AdvancementDisplay<I>> 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<Key> parent, Optional<AdvancementDisplay> displayInfo, Map<String, Void> criteria, AdvancementRequirements requirements, boolean sendsTelemetryEvent) {
public Advancement(Optional<Key> parent, Optional<AdvancementDisplay<I>> displayInfo, Map<String, Void> 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 <I> Advancement<I> read(FriendlyByteBuf buf, FriendlyByteBuf.Reader<Item<I>> reader) {
Optional<Key> parent = buf.readOptional(FriendlyByteBuf::readKey);
Optional<AdvancementDisplay> displayInfo = buf.readOptional(byteBuf -> AdvancementDisplay.read(buf));
Optional<AdvancementDisplay<I>> 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<String, Void> 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<Item<I>> 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<I>, Item<I>> function) {
this.displayInfo.ifPresent(info -> info.applyClientboundData(function));
}
public void replaceNetworkTags(Function<Component, Component> function) {
this.displayInfo.ifPresent(info -> info.replaceNetworkTags(function));
}
}

View File

@@ -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<I> {
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<Object> icon;
private Item<I> icon;
private Optional<Key> background;
private final AdvancementType type;
private final boolean showToast;
@@ -31,7 +25,7 @@ public class AdvancementDisplay {
public AdvancementDisplay(Component title,
Component description,
Item<Object> icon,
Item<I> icon,
Optional<Key> 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<String, ComponentProvider> tokens1 = CraftEngine.instance().fontManager().matchTags(AdventureHelper.componentToJson(this.title));
if (!tokens1.isEmpty()) {
this.title = AdventureHelper.replaceText(this.title, tokens1, NetworkTextReplaceContext.of(player));
}
Map<String, ComponentProvider> 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<I>, Item<I>> function) {
this.icon = function.apply(this.icon);
}
public void write(FriendlyByteBuf buf) {
public void replaceNetworkTags(Function<Component, Component> function) {
this.title = function.apply(this.title);
this.description = function.apply(this.description);
}
public void write(FriendlyByteBuf buf, FriendlyByteBuf.Writer<Item<I>> 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 <I> AdvancementDisplay<I> read(FriendlyByteBuf buf, FriendlyByteBuf.Reader<Item<I>> reader) {
Component title = buf.readComponent();
Component description = buf.readComponent();
Item<Object> icon = CraftEngine.instance().itemManager().decode(buf);
Item<I> 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);
}
}

View File

@@ -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<I>(Key id, Advancement<I> advancement) {
public static <I> AdvancementHolder<I> read(FriendlyByteBuf buf, FriendlyByteBuf.Reader<Item<I>> reader) {
Key key = buf.readKey();
Advancement ad = Advancement.read(buf);
return new AdvancementHolder(key, ad);
Advancement<I> ad = Advancement.read(buf, reader);
return new AdvancementHolder<>(key, ad);
}
public void write(FriendlyByteBuf buf) {
public void write(FriendlyByteBuf buf, FriendlyByteBuf.Writer<Item<I>> 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<I>, Item<I>> function) {
this.advancement.applyClientboundData(function);
}
public void replaceNetworkTags(Function<Component, Component> function) {
this.advancement.replaceNetworkTags(function);
}
}

View File

@@ -110,15 +110,9 @@ public interface ItemManager<T> extends Manageable, ModelGenerator {
boolean isVanillaItem(Key item);
Item<T> decode(FriendlyByteBuf byteBuf);
Optional<Item<T>> c2s(Item<T> item);
void encode(FriendlyByteBuf byteBuf, Item<T> item);
Item<T> s2c(Item<T> item, Player player);
Item<T> c2s(Item<T> item);
Optional<Item<T>> s2cNew(Item<T> item, Player player);
Optional<Item<T>> s2c(Item<T> item, Player player);
UniqueIdItem<T> uniqueEmptyItem();

View File

@@ -56,7 +56,7 @@ public class LegacyShapedRecipe<I> implements LegacyRecipe<I> {
for (int i = 0; i < size; i++) {
ingredients.add(LegacyIngredient.read(buf, reader));
}
Item<Object> result = CraftEngine.instance().itemManager().decode(buf);
Item<I> 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<I> implements LegacyRecipe<I> {
for (int i = 0; i < size; i++) {
ingredients.add(LegacyIngredient.read(buf, reader));
}
Item<Object> result = CraftEngine.instance().itemManager().decode(buf);
Item<I> result = reader.apply(buf);
boolean flag = buf.readBoolean();
return new LegacyShapedRecipe(width, height, ingredients, result, group, CraftingRecipeCategory.byId(category), flag);
}

View File

@@ -27,13 +27,12 @@ public class LegacyShapelessRecipe<I> implements LegacyRecipe<I> {
this.group = group;
}
@SuppressWarnings({"unchecked", "rawtypes"})
public static <I> LegacyShapelessRecipe<I> read(FriendlyByteBuf buf, FriendlyByteBuf.Reader<Item<I>> reader) {
String group = buf.readUtf();
CraftingRecipeCategory category = CraftingRecipeCategory.byId(buf.readVarInt());
List<LegacyIngredient<I>> ingredient = buf.readCollection(ArrayList::new, (byteBuffer) -> LegacyIngredient.read(byteBuffer, reader));
Item<Object> result = CraftEngine.instance().itemManager().decode(buf);
return new LegacyShapelessRecipe(ingredient, result, group, category);
Item<I> result = reader.apply(buf);
return new LegacyShapelessRecipe<>(ingredient, result, group, category);
}
@Override

View File

@@ -37,12 +37,11 @@ public class LegacySmithingTransformRecipe<I> implements LegacyRecipe<I> {
this.addition.applyClientboundData(function);
}
@SuppressWarnings({"unchecked", "rawtypes"})
public static <I> LegacySmithingTransformRecipe<I> read(FriendlyByteBuf buf, FriendlyByteBuf.Reader<Item<I>> reader) {
LegacyIngredient<I> template = LegacyIngredient.read(buf, reader);
LegacyIngredient<I> base = LegacyIngredient.read(buf, reader);
LegacyIngredient<I> addition = LegacyIngredient.read(buf, reader);
Item<Object> result = CraftEngine.instance().itemManager().decode(buf);
return new LegacySmithingTransformRecipe(template, base, addition, result);
Item<I> result = reader.apply(buf);
return new LegacySmithingTransformRecipe<>(template, base, addition, result);
}
}

View File

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