3
0
Mirror von https://github.com/ViaVersion/ViaVersion.git synchronisiert 2024-11-19 14:30:16 +01:00

Handle books, among other things

Dieser Commit ist enthalten in:
Nassim Jahnke 2024-03-06 18:52:23 +01:00
Ursprung b4ee564aa2
Commit 0961de898d
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: EF6771C01F6EF02F
9 geänderte Dateien mit 333 neuen und 105 gelöschten Zeilen

Datei anzeigen

@ -35,6 +35,7 @@ import com.viaversion.viaversion.api.minecraft.item.data.Bee;
import com.viaversion.viaversion.api.minecraft.item.data.BlockStateProperties; import com.viaversion.viaversion.api.minecraft.item.data.BlockStateProperties;
import com.viaversion.viaversion.api.minecraft.item.data.DyedColor; import com.viaversion.viaversion.api.minecraft.item.data.DyedColor;
import com.viaversion.viaversion.api.minecraft.item.data.Enchantments; import com.viaversion.viaversion.api.minecraft.item.data.Enchantments;
import com.viaversion.viaversion.api.minecraft.item.data.FilterableString;
import com.viaversion.viaversion.api.minecraft.item.data.FireworkExplosion; import com.viaversion.viaversion.api.minecraft.item.data.FireworkExplosion;
import com.viaversion.viaversion.api.minecraft.item.data.Fireworks; import com.viaversion.viaversion.api.minecraft.item.data.Fireworks;
import com.viaversion.viaversion.api.minecraft.item.data.Instrument; import com.viaversion.viaversion.api.minecraft.item.data.Instrument;
@ -73,7 +74,7 @@ public final class StructuredDataKey<T> {
public static final StructuredDataKey<Item[]> BUNDLE_CONTENTS = new StructuredDataKey<>("bundle_contents", Types1_20_5.ITEM_ARRAY); public static final StructuredDataKey<Item[]> BUNDLE_CONTENTS = new StructuredDataKey<>("bundle_contents", Types1_20_5.ITEM_ARRAY);
public static final StructuredDataKey<PotionContents> POTION_CONTENTS = new StructuredDataKey<>("potion_contents", PotionContents.TYPE); public static final StructuredDataKey<PotionContents> POTION_CONTENTS = new StructuredDataKey<>("potion_contents", PotionContents.TYPE);
public static final StructuredDataKey<SuspiciousStewEffect[]> SUSPICIOUS_STEW_EFFECTS = new StructuredDataKey<>("suspicious_stew_effects", SuspiciousStewEffect.ARRAY_TYPE); public static final StructuredDataKey<SuspiciousStewEffect[]> SUSPICIOUS_STEW_EFFECTS = new StructuredDataKey<>("suspicious_stew_effects", SuspiciousStewEffect.ARRAY_TYPE);
public static final StructuredDataKey<String[]> WRITABLE_BOOK_CONTENT = new StructuredDataKey<>("writable_book_content", Type.STRING_ARRAY); public static final StructuredDataKey<FilterableString[]> WRITABLE_BOOK_CONTENT = new StructuredDataKey<>("writable_book_content", FilterableString.ARRAY_TYPE);
public static final StructuredDataKey<WrittenBook> WRITTEN_BOOK_CONTENT = new StructuredDataKey<>("written_book_content", WrittenBook.TYPE); public static final StructuredDataKey<WrittenBook> WRITTEN_BOOK_CONTENT = new StructuredDataKey<>("written_book_content", WrittenBook.TYPE);
public static final StructuredDataKey<ArmorTrim> TRIM = new StructuredDataKey<>("trim", ArmorTrim.TYPE); public static final StructuredDataKey<ArmorTrim> TRIM = new StructuredDataKey<>("trim", ArmorTrim.TYPE);
public static final StructuredDataKey<CompoundTag> DEBUG_STICK_STATE = new StructuredDataKey<>("debug_stick_state", Type.COMPOUND_TAG); public static final StructuredDataKey<CompoundTag> DEBUG_STICK_STATE = new StructuredDataKey<>("debug_stick_state", Type.COMPOUND_TAG);

Datei anzeigen

@ -0,0 +1,71 @@
/*
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
* Copyright (C) 2016-2024 ViaVersion and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package com.viaversion.viaversion.api.minecraft.item.data;
import com.viaversion.viaversion.api.type.Type;
import io.netty.buffer.ByteBuf;
import org.checkerframework.checker.nullness.qual.Nullable;
public abstract class Filterable<T> {
private final T raw;
private final T filtered;
protected Filterable(final T raw, @Nullable final T filtered) {
this.raw = raw;
this.filtered = filtered;
}
public T raw() {
return raw;
}
public T filtered() {
return filtered;
}
public abstract static class FilterableType<T, F extends Filterable<T>> extends Type<F> {
private final Type<T> elementType;
private final Type<T> optionalElementType;
protected FilterableType(final Type<T> elementType, final Type<T> optionalElementType) {
super(Filterable.class);
this.elementType = elementType;
this.optionalElementType = optionalElementType;
}
@Override
public F read(final ByteBuf buffer) throws Exception {
final T raw = elementType.read(buffer);
final T filtered = optionalElementType.read(buffer);
return create(raw, filtered);
}
@Override
public void write(final ByteBuf buffer, final F value) throws Exception {
elementType.write(buffer, value.raw());
optionalElementType.write(buffer, value.filtered());
}
protected abstract F create(T raw, T filtered);
}
}

Datei anzeigen

@ -0,0 +1,43 @@
/*
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
* Copyright (C) 2016-2024 ViaVersion and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package com.viaversion.viaversion.api.minecraft.item.data;
import com.github.steveice10.opennbt.tag.builtin.Tag;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.types.ArrayType;
import org.checkerframework.checker.nullness.qual.Nullable;
public final class FilterableComponent extends Filterable<Tag> {
public static final Type<FilterableComponent> TYPE = new FilterableType<Tag, FilterableComponent>(Type.TAG, Type.OPTIONAL_TAG) {
@Override
protected FilterableComponent create(final Tag raw, final Tag filtered) {
return new FilterableComponent(raw, filtered);
}
};
public static final Type<FilterableComponent[]> ARRAY_TYPE = new ArrayType<>(TYPE);
public FilterableComponent(final Tag raw, @Nullable final Tag filtered) {
super(raw, filtered);
}
}

Datei anzeigen

@ -0,0 +1,42 @@
/*
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
* Copyright (C) 2016-2024 ViaVersion and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package com.viaversion.viaversion.api.minecraft.item.data;
import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.types.ArrayType;
import org.checkerframework.checker.nullness.qual.Nullable;
public final class FilterableString extends Filterable<String> {
public static final Type<FilterableString> TYPE = new FilterableType<String, FilterableString>(Type.STRING, Type.OPTIONAL_STRING) {
@Override
protected FilterableString create(final String raw, final String filtered) {
return new FilterableString(raw, filtered);
}
};
public static final Type<FilterableString[]> ARRAY_TYPE = new ArrayType<>(TYPE);
public FilterableString(final String raw, @Nullable final String filtered) {
super(raw, filtered);
}
}

Datei anzeigen

@ -30,31 +30,31 @@ public final class WrittenBook {
public static final Type<WrittenBook> TYPE = new Type<WrittenBook>(WrittenBook.class) { public static final Type<WrittenBook> TYPE = new Type<WrittenBook>(WrittenBook.class) {
@Override @Override
public WrittenBook read(final ByteBuf buffer) throws Exception { public WrittenBook read(final ByteBuf buffer) throws Exception {
final String title = Type.STRING.read(buffer); final FilterableString title = FilterableString.TYPE.read(buffer);
final String author = Type.STRING.read(buffer); final String author = Type.STRING.read(buffer);
final int generation = Type.VAR_INT.readPrimitive(buffer); final int generation = Type.VAR_INT.readPrimitive(buffer);
final String[] pages = Type.STRING_ARRAY.read(buffer); final FilterableComponent[] pages = FilterableComponent.ARRAY_TYPE.read(buffer);
final boolean resolved = buffer.readBoolean(); final boolean resolved = buffer.readBoolean();
return new WrittenBook(title, author, generation, pages, resolved); return new WrittenBook(title, author, generation, pages, resolved);
} }
@Override @Override
public void write(final ByteBuf buffer, final WrittenBook value) throws Exception { public void write(final ByteBuf buffer, final WrittenBook value) throws Exception {
Type.STRING.write(buffer, value.title); FilterableString.TYPE.write(buffer, value.title);
Type.STRING.write(buffer, value.author); Type.STRING.write(buffer, value.author);
Type.VAR_INT.writePrimitive(buffer, value.generation); Type.VAR_INT.writePrimitive(buffer, value.generation);
Type.STRING_ARRAY.write(buffer, value.pages); FilterableComponent.ARRAY_TYPE.write(buffer, value.pages);
buffer.writeBoolean(value.resolved); buffer.writeBoolean(value.resolved);
} }
}; };
private final String title; private final FilterableString title;
private final String author; private final String author;
private final int generation; private final int generation;
private final String[] pages; private final FilterableComponent[] pages;
private final boolean resolved; private final boolean resolved;
public WrittenBook(final String title, final String author, final int generation, final String[] pages, final boolean resolved) { public WrittenBook(final FilterableString title, final String author, final int generation, final FilterableComponent[] pages, final boolean resolved) {
this.title = title; this.title = title;
this.author = author; this.author = author;
this.generation = generation; this.generation = generation;
@ -62,7 +62,7 @@ public final class WrittenBook {
this.resolved = resolved; this.resolved = resolved;
} }
public String title() { public FilterableString title() {
return title; return title;
} }
@ -74,7 +74,7 @@ public final class WrittenBook {
return generation; return generation;
} }
public String[] pages() { public FilterableComponent[] pages() {
return pages; return pages;
} }

Datei anzeigen

@ -147,7 +147,7 @@ public final class BlockItemPacketRewriter1_20_3 extends ItemRewriter<Clientboun
final CompoundTag tag = item.tag(); final CompoundTag tag = item.tag();
if (tag != null && item.identifier() == 1047) { // Written book if (tag != null && item.identifier() == 1047) { // Written book
updatePages(tag, "pages"); updatePages(tag, "pages");
updatePages(tag, "filtered_pages"); updatePages(tag, "filtered_pages"); // TODO This isn't a list
} }
return super.handleItemToClient(item); return super.handleItemToClient(item);
} }

Datei anzeigen

@ -116,53 +116,22 @@ public final class Protocol1_20_5To1_20_3 extends AbstractProtocol<ClientboundPa
.reader("sculk_charge", ParticleType.Readers.SCULK_CHARGE) .reader("sculk_charge", ParticleType.Readers.SCULK_CHARGE)
.reader("shriek", ParticleType.Readers.SHRIEK); .reader("shriek", ParticleType.Readers.SHRIEK);
Types1_20_5.STRUCTURED_DATA.filler(this) Types1_20_5.STRUCTURED_DATA.filler(this)
.add(StructuredDataKey.CUSTOM_DATA) .add(StructuredDataKey.CUSTOM_DATA).add(StructuredDataKey.DAMAGE).add(StructuredDataKey.UNBREAKABLE)
.add(StructuredDataKey.DAMAGE) .add(StructuredDataKey.CUSTOM_NAME).add(StructuredDataKey.LORE).add(StructuredDataKey.ENCHANTMENTS)
.add(StructuredDataKey.UNBREAKABLE) .add(StructuredDataKey.CAN_PLACE_ON).add(StructuredDataKey.CAN_BREAK).add(StructuredDataKey.ATTRIBUTE_MODIFIERS)
.add(StructuredDataKey.CUSTOM_NAME) .add(StructuredDataKey.CUSTOM_MODEL_DATA).add(StructuredDataKey.HIDE_ADDITIONAL_TOOLTIP).add(StructuredDataKey.REPAIR_COST)
.add(StructuredDataKey.LORE) .add(StructuredDataKey.CREATIVE_SLOT_LOCK).add(StructuredDataKey.ENCHANTMENT_GLINT_OVERRIDE).add(StructuredDataKey.INTANGIBLE_PROJECTILE)
.add(StructuredDataKey.ENCHANTMENTS) .add(StructuredDataKey.STORED_ENCHANTMENTS).add(StructuredDataKey.DYED_COLOR).add(StructuredDataKey.MAP_COLOR)
.add(StructuredDataKey.CAN_PLACE_ON) .add(StructuredDataKey.MAP_ID).add(StructuredDataKey.MAP_DECORATIONS).add(StructuredDataKey.MAP_POST_PROCESSING)
.add(StructuredDataKey.CAN_BREAK) .add(StructuredDataKey.CHARGED_PROJECTILES).add(StructuredDataKey.BUNDLE_CONTENTS).add(StructuredDataKey.POTION_CONTENTS)
.add(StructuredDataKey.ATTRIBUTE_MODIFIERS) .add(StructuredDataKey.SUSPICIOUS_STEW_EFFECTS).add(StructuredDataKey.WRITABLE_BOOK_CONTENT).add(StructuredDataKey.WRITTEN_BOOK_CONTENT)
.add(StructuredDataKey.CUSTOM_MODEL_DATA) .add(StructuredDataKey.TRIM).add(StructuredDataKey.DEBUG_STICK_STATE).add(StructuredDataKey.ENTITY_DATA)
.add(StructuredDataKey.HIDE_ADDITIONAL_TOOLTIP) .add(StructuredDataKey.BUCKET_ENTITY_DATA).add(StructuredDataKey.BLOCK_ENTITY_DATA).add(StructuredDataKey.INSTRUMENT)
.add(StructuredDataKey.REPAIR_COST) .add(StructuredDataKey.RECIPES).add(StructuredDataKey.LODESTONE_TRACKER).add(StructuredDataKey.FIREWORK_EXPLOSION)
.add(StructuredDataKey.CREATIVE_SLOT_LOCK) .add(StructuredDataKey.FIREWORKS).add(StructuredDataKey.PROFILE).add(StructuredDataKey.NOTE_BLOCK_SOUND)
.add(StructuredDataKey.ENCHANTMENT_GLINT_OVERRIDE) .add(StructuredDataKey.BANNER_PATTERNS).add(StructuredDataKey.BASE_COLOR).add(StructuredDataKey.POT_DECORATIONS)
.add(StructuredDataKey.INTANGIBLE_PROJECTILE) .add(StructuredDataKey.CONTAINER).add(StructuredDataKey.BLOCK_STATE).add(StructuredDataKey.BEES)
.add(StructuredDataKey.STORED_ENCHANTMENTS) .add(StructuredDataKey.LOCK).add(StructuredDataKey.CONTAINER_LOOT);
.add(StructuredDataKey.DYED_COLOR)
.add(StructuredDataKey.MAP_COLOR)
.add(StructuredDataKey.MAP_ID)
.add(StructuredDataKey.MAP_DECORATIONS)
.add(StructuredDataKey.MAP_POST_PROCESSING)
.add(StructuredDataKey.CHARGED_PROJECTILES)
.add(StructuredDataKey.BUNDLE_CONTENTS)
.add(StructuredDataKey.POTION_CONTENTS)
.add(StructuredDataKey.SUSPICIOUS_STEW_EFFECTS)
.add(StructuredDataKey.WRITABLE_BOOK_CONTENT)
.add(StructuredDataKey.WRITTEN_BOOK_CONTENT)
.add(StructuredDataKey.TRIM)
.add(StructuredDataKey.DEBUG_STICK_STATE)
.add(StructuredDataKey.ENTITY_DATA)
.add(StructuredDataKey.BUCKET_ENTITY_DATA)
.add(StructuredDataKey.BLOCK_ENTITY_DATA)
.add(StructuredDataKey.INSTRUMENT)
.add(StructuredDataKey.RECIPES)
.add(StructuredDataKey.LODESTONE_TRACKER)
.add(StructuredDataKey.FIREWORK_EXPLOSION)
.add(StructuredDataKey.FIREWORKS)
.add(StructuredDataKey.PROFILE)
.add(StructuredDataKey.NOTE_BLOCK_SOUND)
.add(StructuredDataKey.BANNER_PATTERNS)
.add(StructuredDataKey.BASE_COLOR)
.add(StructuredDataKey.POT_DECORATIONS)
.add(StructuredDataKey.CONTAINER)
.add(StructuredDataKey.BLOCK_STATE)
.add(StructuredDataKey.BEES)
.add(StructuredDataKey.LOCK)
.add(StructuredDataKey.CONTAINER_LOOT);
tagRewriter.addTag(RegistryType.ITEM, "minecraft:dyeable", 853, 854, 855, 856, 1120); tagRewriter.addTag(RegistryType.ITEM, "minecraft:dyeable", 853, 854, 855, 856, 1120);
} }

Datei anzeigen

@ -35,6 +35,10 @@ import com.viaversion.viaversion.api.minecraft.item.StructuredItem;
import com.viaversion.viaversion.api.minecraft.item.data.BlockStateProperties; import com.viaversion.viaversion.api.minecraft.item.data.BlockStateProperties;
import com.viaversion.viaversion.api.minecraft.item.data.DyedColor; import com.viaversion.viaversion.api.minecraft.item.data.DyedColor;
import com.viaversion.viaversion.api.minecraft.item.data.Enchantments; import com.viaversion.viaversion.api.minecraft.item.data.Enchantments;
import com.viaversion.viaversion.api.minecraft.item.data.FilterableComponent;
import com.viaversion.viaversion.api.minecraft.item.data.FilterableString;
import com.viaversion.viaversion.api.minecraft.item.data.FireworkExplosion;
import com.viaversion.viaversion.api.minecraft.item.data.WrittenBook;
import com.viaversion.viaversion.api.type.Type; import com.viaversion.viaversion.api.type.Type;
import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2; import com.viaversion.viaversion.api.type.types.chunk.ChunkType1_20_2;
import com.viaversion.viaversion.api.type.types.version.Types1_20_3; import com.viaversion.viaversion.api.type.types.version.Types1_20_3;
@ -62,6 +66,8 @@ import org.checkerframework.checker.nullness.qual.Nullable;
public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter<ClientboundPacket1_20_3, ServerboundPacket1_20_5, Protocol1_20_5To1_20_3> { public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter<ClientboundPacket1_20_3, ServerboundPacket1_20_5, Protocol1_20_5To1_20_3> {
private static final GameProfile.Property[] EMPTY_PROPERTIES = new GameProfile.Property[0];
public BlockItemPacketRewriter1_20_5(final Protocol1_20_5To1_20_3 protocol) { public BlockItemPacketRewriter1_20_5(final Protocol1_20_5To1_20_3 protocol) {
super(protocol, Type.ITEM1_20_2, Type.ITEM1_20_2_ARRAY, Types1_20_5.ITEM, Types1_20_5.ITEM_ARRAY); super(protocol, Type.ITEM1_20_2, Type.ITEM1_20_2_ARRAY, Types1_20_5.ITEM, Types1_20_5.ITEM_ARRAY);
} }
@ -183,7 +189,7 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter<Clientboun
if (item == null) return null; if (item == null) return null;
super.handleItemToClient(item); super.handleItemToClient(item);
return toStructuredItem(item); return toStructuredItem(item, true);
} }
@Override @Override
@ -203,7 +209,7 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter<Clientboun
final StructuredData<CompoundTag> customData = data.getNonEmpty(StructuredDataKey.CUSTOM_DATA); final StructuredData<CompoundTag> customData = data.getNonEmpty(StructuredDataKey.CUSTOM_DATA);
final CompoundTag tag = customData != null ? customData.value() : new CompoundTag(); final CompoundTag tag = customData != null ? customData.value() : new CompoundTag();
final DataItem dataItem = new DataItem(item.identifier(), (byte) item.amount(), (short) 0, tag); final DataItem dataItem = new DataItem(item.identifier(), (byte) item.amount(), (short) 0, tag);
if (customData != null && tag.remove(tagMarker) != null) { if (customData != null && tag.remove(nbtTagName()) != null) {
return dataItem; return dataItem;
} }
@ -212,7 +218,7 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter<Clientboun
return dataItem; return dataItem;
} }
public Item toStructuredItem(final Item old) { public Item toStructuredItem(final Item old, final boolean addMarker) {
final CompoundTag tag = old.tag(); final CompoundTag tag = old.tag();
final StructuredItem item = new StructuredItem(old.identifier(), (byte) old.amount(), new StructuredDataContainer()); final StructuredItem item = new StructuredItem(old.identifier(), (byte) old.amount(), new StructuredDataContainer());
final StructuredDataContainer data = item.structuredData(); final StructuredDataContainer data = item.structuredData();
@ -284,18 +290,29 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter<Clientboun
//data.set(StructuredDataKey.TRIM, armorTrim); //data.set(StructuredDataKey.TRIM, armorTrim);
} }
final ListTag chargedProjectiles = tag.getListTag("ChargedProjectiles"); final CompoundTag explosionTag = tag.getCompoundTag("Explosion");
if (chargedProjectiles != null) { if (explosionTag != null) {
final List<Item> items = new ArrayList<>(); final NumberTag shape = explosionTag.getNumberTag("Type");
for (final Tag chargedProjectile : chargedProjectiles) { final IntArrayTag colors = explosionTag.getIntArrayTag("Colors");
if (!(chargedProjectile instanceof CompoundTag)) { final IntArrayTag fadeColors = explosionTag.getIntArrayTag("FadeColors");
continue; final NumberTag trail = explosionTag.getNumberTag("Trail");
} final NumberTag flicker = explosionTag.getNumberTag("Flicker");
items.add(itemFromTag((CompoundTag) chargedProjectile)); final FireworkExplosion explosion = new FireworkExplosion(
} shape != null ? shape.asInt() : 0,
data.set(StructuredDataKey.CHARGED_PROJECTILES, items.toArray(new Item[0])); colors != null ? colors.getValue() : new int[0],
fadeColors != null ? fadeColors.getValue() : new int[0],
trail != null && trail.asBoolean(),
flicker != null && flicker.asBoolean()
);
data.set(StructuredDataKey.FIREWORK_EXPLOSION, explosion);
} }
updateWritableBookPages(data, tag);
updateWrittenBookPages(data, tag);
updateItemList(data, tag, "ChargedProjectiles", StructuredDataKey.CHARGED_PROJECTILES);
updateItemList(data, tag, "Items", StructuredDataKey.BUNDLE_CONTENTS);
updateEnchantments(data, tag, "Enchantments", StructuredDataKey.ENCHANTMENTS, (hideFlagsValue & 0x01) == 0); updateEnchantments(data, tag, "Enchantments", StructuredDataKey.ENCHANTMENTS, (hideFlagsValue & 0x01) == 0);
updateEnchantments(data, tag, "StoredEnchantments", StructuredDataKey.STORED_ENCHANTMENTS, (hideFlagsValue & 0x20) == 0); updateEnchantments(data, tag, "StoredEnchantments", StructuredDataKey.STORED_ENCHANTMENTS, (hideFlagsValue & 0x20) == 0);
@ -317,12 +334,8 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter<Clientboun
// StructuredDataKey.CREATIVE_SLOT_LOCK // StructuredDataKey.CREATIVE_SLOT_LOCK
// StructuredDataKey.INTANGIBLE_PROJECTILE // StructuredDataKey.INTANGIBLE_PROJECTILE
// StructuredDataKey.DYED_COLOR // StructuredDataKey.DYED_COLOR
// StructuredDataKey.CHARGED_PROJECTILES
// StructuredDataKey.BUNDLE_CONTENTS
// StructuredDataKey.POTION_CONTENTS // StructuredDataKey.POTION_CONTENTS
// StructuredDataKey.SUSPICIOUS_STEW_EFFECTS // StructuredDataKey.SUSPICIOUS_STEW_EFFECTS
// StructuredDataKey.WRITABLE_BOOK_CONTENT
// StructuredDataKey.WRITTEN_BOOK_CONTENT
// StructuredDataKey.TRIM // StructuredDataKey.TRIM
// StructuredDataKey.DEBUG_STICK_STATE // StructuredDataKey.DEBUG_STICK_STATE
// StructuredDataKey.BUCKET_ENTITY_DATA // StructuredDataKey.BUCKET_ENTITY_DATA
@ -330,7 +343,6 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter<Clientboun
// StructuredDataKey.INSTRUMENT // StructuredDataKey.INSTRUMENT
// StructuredDataKey.RECIPES // StructuredDataKey.RECIPES
// StructuredDataKey.LODESTONE_TARGET // StructuredDataKey.LODESTONE_TARGET
// StructuredDataKey.FIREWORK_EXPLOSION
// StructuredDataKey.FIREWORKS // StructuredDataKey.FIREWORKS
// StructuredDataKey.NOTE_BLOCK_SOUND // StructuredDataKey.NOTE_BLOCK_SOUND
// StructuredDataKey.BANNER_PATTERNS // StructuredDataKey.BANNER_PATTERNS
@ -342,11 +354,97 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter<Clientboun
// StructuredDataKey.CONTAINER_LOOT // StructuredDataKey.CONTAINER_LOOT
// Add the original as custom data, to be re-used for creative clients as well // Add the original as custom data, to be re-used for creative clients as well
if (addMarker) {
tag.putBoolean(nbtTagName(), true); tag.putBoolean(nbtTagName(), true);
}
data.set(StructuredDataKey.CUSTOM_DATA, tag); data.set(StructuredDataKey.CUSTOM_DATA, tag);
return item; return item;
} }
private void updateWritableBookPages(final StructuredDataContainer data, final CompoundTag tag) {
final ListTag pagesTag = tag.getListTag("pages");
final CompoundTag filteredPagesTag = tag.getCompoundTag("filtered_pages");
if (pagesTag == null) {
return;
}
final List<FilterableString> pages = new ArrayList<>();
for (int i = 0; i < pagesTag.size(); i++) {
final Tag page = pagesTag.get(i);
if (!(page instanceof StringTag)) {
continue;
}
String filtered = null;
if (filteredPagesTag != null) {
final StringTag filteredPage = filteredPagesTag.getStringTag(String.valueOf(i));
if (filteredPage != null) {
filtered = filteredPage.getValue();
}
}
pages.add(new FilterableString(((StringTag) page).getValue(), filtered));
}
data.set(StructuredDataKey.WRITABLE_BOOK_CONTENT, pages.toArray(new FilterableString[0]));
}
private void updateWrittenBookPages(final StructuredDataContainer data, final CompoundTag tag) {
final ListTag pagesTag = tag.getListTag("pages");
final CompoundTag filteredPagesTag = tag.getCompoundTag("filtered_pages");
if (pagesTag == null) {
return;
}
final List<FilterableComponent> pages = new ArrayList<>();
for (int i = 0; i < pagesTag.size(); i++) {
final Tag page = pagesTag.get(i);
if (!(page instanceof StringTag)) {
continue;
}
Tag filtered = null;
if (filteredPagesTag != null) {
final StringTag filteredPage = filteredPagesTag.getStringTag(String.valueOf(i));
if (filteredPage != null) {
filtered = ComponentUtil.jsonStringToTag(filteredPage.getValue());
}
}
final Tag parsedPage = ComponentUtil.jsonStringToTag(((StringTag) page).getValue());
pages.add(new FilterableComponent(parsedPage, filtered));
}
final StringTag title = tag.getStringTag("title");
final StringTag filteredTitle = tag.getStringTag("filtered_title");
final StringTag author = tag.getStringTag("author");
final NumberTag generation = tag.getNumberTag("generation");
final NumberTag resolved = tag.getNumberTag("resolved");
final WrittenBook writtenBook = new WrittenBook(
new FilterableString(title != null ? title.getValue() : "", filteredTitle != null ? filteredTitle.getValue() : null),
author != null ? author.getValue() : "",
generation != null ? generation.asInt() : 0,
pages.toArray(new FilterableComponent[0]),
resolved != null && resolved.asBoolean()
);
data.set(StructuredDataKey.WRITTEN_BOOK_CONTENT, writtenBook);
}
private void updateItemList(final StructuredDataContainer data, final CompoundTag tag, final String key, final StructuredDataKey<Item[]> dataKey) {
final ListTag chargedProjectiles = tag.getListTag(key);
if (chargedProjectiles == null) {
return;
}
final List<Item> items = new ArrayList<>();
for (final Tag item : chargedProjectiles) {
if (!(item instanceof CompoundTag)) {
continue;
}
items.add(itemFromTag((CompoundTag) item));
}
data.set(dataKey, items.toArray(new Item[0]));
}
private Item itemFromTag(final CompoundTag item) { private Item itemFromTag(final CompoundTag item) {
final StringTag id = item.getStringTag("id"); final StringTag id = item.getStringTag("id");
final NumberTag count = item.getNumberTag("Count"); final NumberTag count = item.getNumberTag("Count");
@ -388,23 +486,30 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter<Clientboun
} }
private void updateProfile(final StructuredDataContainer data, final Tag skullOwnerTag) { private void updateProfile(final StructuredDataContainer data, final Tag skullOwnerTag) {
final String name;
final List<GameProfile.Property> properties = new ArrayList<>(1); final List<GameProfile.Property> properties = new ArrayList<>(1);
UUID uuid = null;
if (skullOwnerTag instanceof StringTag) { if (skullOwnerTag instanceof StringTag) {
name = ((StringTag) skullOwnerTag).getValue(); final String name = ((StringTag) skullOwnerTag).getValue();
data.set(StructuredDataKey.PROFILE, new GameProfile(name, null, EMPTY_PROPERTIES));
} else if (skullOwnerTag instanceof CompoundTag) { } else if (skullOwnerTag instanceof CompoundTag) {
final CompoundTag skullOwner = (CompoundTag) skullOwnerTag; final CompoundTag skullOwner = (CompoundTag) skullOwnerTag;
final StringTag nameTag = skullOwner.getStringTag("Name"); final StringTag nameTag = skullOwner.getStringTag("Name");
name = nameTag != null ? nameTag.getValue() : ""; final String name = nameTag != null ? nameTag.getValue() : "";
final IntArrayTag idTag = skullOwner.getIntArrayTag("Id"); final IntArrayTag idTag = skullOwner.getIntArrayTag("Id");
UUID uuid = null;
if (idTag != null) { if (idTag != null) {
uuid = UUIDUtil.fromIntArray(idTag.getValue()); uuid = UUIDUtil.fromIntArray(idTag.getValue());
} }
final CompoundTag propertiesTag = skullOwner.getCompoundTag("Properties"); final CompoundTag propertiesTag = skullOwner.getCompoundTag("Properties");
if (propertiesTag != null) { if (propertiesTag != null) {
updateProperties(propertiesTag, properties);
}
data.set(StructuredDataKey.PROFILE, new GameProfile(name, uuid, properties.toArray(EMPTY_PROPERTIES)));
}
}
private void updateProperties(final CompoundTag propertiesTag, final List<GameProfile.Property> properties) {
for (final Map.Entry<String, Tag> entry : propertiesTag.entrySet()) { for (final Map.Entry<String, Tag> entry : propertiesTag.entrySet()) {
if (!(entry.getValue() instanceof ListTag)) { if (!(entry.getValue() instanceof ListTag)) {
continue; continue;
@ -426,12 +531,6 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter<Clientboun
} }
} }
} }
} else {
return;
}
data.set(StructuredDataKey.PROFILE, new GameProfile(name, uuid, properties.toArray(new GameProfile.Property[0])));
}
private void updateMapDecorations(final StructuredDataContainer data, final ListTag<CompoundTag> decorationsTag) { private void updateMapDecorations(final StructuredDataContainer data, final ListTag<CompoundTag> decorationsTag) {
if (decorationsTag == null) { if (decorationsTag == null) {

Datei anzeigen

@ -192,7 +192,10 @@ public final class EntityPacketRewriter1_20_5 extends EntityRewriter<Clientbound
protected void registerRewrites() { protected void registerRewrites() {
filter().mapMetaType(typeId -> { filter().mapMetaType(typeId -> {
int id = typeId; int id = typeId;
if (id >= Types1_20_5.META_TYPES.armadilloState.typeId()) { if (typeId >= Types1_20_5.META_TYPES.armadilloState.typeId()) {
id++;
}
if (typeId >= Types1_20_5.META_TYPES.wolfVariantType.typeId()) {
id++; id++;
} }
return Types1_20_5.META_TYPES.byId(id); return Types1_20_5.META_TYPES.byId(id);