/* * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion * Copyright (C) 2016-2021 ViaVersion and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package com.viaversion.viaversion.protocols.protocol1_13to1_12_2.providers.blockentities; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import com.github.steveice10.opennbt.tag.builtin.IntTag; import com.github.steveice10.opennbt.tag.builtin.ListTag; import com.github.steveice10.opennbt.tag.builtin.NumberTag; import com.github.steveice10.opennbt.tag.builtin.StringTag; import com.github.steveice10.opennbt.tag.builtin.Tag; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.minecraft.Position; import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.ChatRewriter; import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.providers.BlockEntityProvider; import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.storage.BlockStorage; public class BannerHandler implements BlockEntityProvider.BlockEntityHandler { private static final int WALL_BANNER_START = 7110; // 4 each private static final int WALL_BANNER_STOP = 7173; private static final int BANNER_START = 6854; // 16 each private static final int BANNER_STOP = 7109; @Override public int transform(UserConnection user, CompoundTag tag) { BlockStorage storage = user.get(BlockStorage.class); Position position = new Position((int) getLong(tag.get("x")), (short) getLong(tag.get("y")), (int) getLong(tag.get("z"))); if (!storage.contains(position)) { Via.getPlatform().getLogger().warning("Received an banner color update packet, but there is no banner! O_o " + tag); return -1; } int blockId = storage.get(position).getOriginal(); Tag base = tag.get("Base"); int color = 0; if (base != null) { color = ((NumberTag) tag.get("Base")).asInt(); } // Standing banner if (blockId >= BANNER_START && blockId <= BANNER_STOP) { blockId += ((15 - color) * 16); // Wall banner } else if (blockId >= WALL_BANNER_START && blockId <= WALL_BANNER_STOP) { blockId += ((15 - color) * 4); } else { Via.getPlatform().getLogger().warning("Why does this block have the banner block entity? :(" + tag); } if (tag.get("Patterns") instanceof ListTag) { for (Tag pattern : (ListTag) tag.get("Patterns")) { if (pattern instanceof CompoundTag) { Tag c = ((CompoundTag) pattern).get("Color"); if (c instanceof IntTag) { ((IntTag) c).setValue(15 - (int) c.getValue()); // Invert color id } } } } Tag name = tag.get("CustomName"); if (name instanceof StringTag) { ((StringTag) name).setValue(ChatRewriter.legacyTextToJsonString(((StringTag) name).getValue())); } return blockId; } private long getLong(NumberTag tag) { return tag.asLong(); } }