mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2026-01-06 15:52:03 +00:00
0.0.64.8
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user