minecraft-src/net/minecraft/world/level/block/entity/BannerBlockEntity.java
2025-09-18 12:27:44 +00:00

112 lines
3.7 KiB
Java

package net.minecraft.world.level.block.entity;
import net.minecraft.core.BlockPos;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.component.DataComponentGetter;
import net.minecraft.core.component.DataComponentMap;
import net.minecraft.core.component.DataComponents;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.ComponentSerialization;
import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;
import net.minecraft.world.Nameable;
import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.AbstractBannerBlock;
import net.minecraft.world.level.block.BannerBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.storage.ValueInput;
import net.minecraft.world.level.storage.ValueOutput;
import org.jetbrains.annotations.Nullable;
public class BannerBlockEntity extends BlockEntity implements Nameable {
public static final int MAX_PATTERNS = 6;
private static final String TAG_PATTERNS = "patterns";
@Nullable
private Component name;
private final DyeColor baseColor;
/**
* A list of all patterns stored on this banner.
*/
private BannerPatternLayers patterns = BannerPatternLayers.EMPTY;
public BannerBlockEntity(BlockPos pos, BlockState blockState) {
this(pos, blockState, ((AbstractBannerBlock)blockState.getBlock()).getColor());
}
public BannerBlockEntity(BlockPos pos, BlockState blockState, DyeColor baseColor) {
super(BlockEntityType.BANNER, pos, blockState);
this.baseColor = baseColor;
}
@Override
public Component getName() {
return (Component)(this.name != null ? this.name : Component.translatable("block.minecraft.banner"));
}
@Nullable
@Override
public Component getCustomName() {
return this.name;
}
@Override
protected void saveAdditional(ValueOutput output) {
super.saveAdditional(output);
if (!this.patterns.equals(BannerPatternLayers.EMPTY)) {
output.store("patterns", BannerPatternLayers.CODEC, this.patterns);
}
output.storeNullable("CustomName", ComponentSerialization.CODEC, this.name);
}
@Override
protected void loadAdditional(ValueInput input) {
super.loadAdditional(input);
this.name = parseCustomNameSafe(input, "CustomName");
this.patterns = (BannerPatternLayers)input.read("patterns", BannerPatternLayers.CODEC).orElse(BannerPatternLayers.EMPTY);
}
public ClientboundBlockEntityDataPacket getUpdatePacket() {
return ClientboundBlockEntityDataPacket.create(this);
}
@Override
public CompoundTag getUpdateTag(HolderLookup.Provider registries) {
return this.saveWithoutMetadata(registries);
}
public BannerPatternLayers getPatterns() {
return this.patterns;
}
public ItemStack getItem() {
ItemStack itemStack = new ItemStack(BannerBlock.byColor(this.baseColor));
itemStack.applyComponents(this.collectComponents());
return itemStack;
}
public DyeColor getBaseColor() {
return this.baseColor;
}
@Override
protected void applyImplicitComponents(DataComponentGetter componentGetter) {
super.applyImplicitComponents(componentGetter);
this.patterns = componentGetter.getOrDefault(DataComponents.BANNER_PATTERNS, BannerPatternLayers.EMPTY);
this.name = componentGetter.get(DataComponents.CUSTOM_NAME);
}
@Override
protected void collectImplicitComponents(DataComponentMap.Builder components) {
super.collectImplicitComponents(components);
components.set(DataComponents.BANNER_PATTERNS, this.patterns);
components.set(DataComponents.CUSTOM_NAME, this.name);
}
@Override
public void removeComponentsFromTag(ValueOutput output) {
output.discard("patterns");
output.discard("CustomName");
}
}