Minestom/src/main/java/net/minestom/server/entity/metadata/other/PaintingMeta.java

162 lines
4.2 KiB
Java

package net.minestom.server.entity.metadata.other;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.Metadata;
import net.minestom.server.entity.metadata.EntityMeta;
import net.minestom.server.entity.metadata.ObjectDataProvider;
import net.minestom.server.registry.StaticProtocolObject;
import net.minestom.server.utils.NamespaceID;
import net.minestom.server.utils.validate.Check;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Locale;
public class PaintingMeta extends EntityMeta implements ObjectDataProvider {
public static final byte OFFSET = EntityMeta.MAX_OFFSET;
public static final byte MAX_OFFSET = OFFSET + 1;
private Orientation orientation = null;
public PaintingMeta(@NotNull Entity entity, @NotNull Metadata metadata) {
super(entity, metadata);
}
public @NotNull Variant getVariant() {
return super.metadata.getIndex(OFFSET, Variant.KEBAB);
}
public void setVariant(@NotNull Variant value) {
super.metadata.setIndex(OFFSET, Metadata.PaintingVariant(value));
}
@NotNull
public Orientation getOrientation() {
return this.orientation;
}
/**
* Sets orientation of the painting.
* This is possible only before spawn packet is sent.
*
* @param orientation the orientation of the painting.
*/
public void setOrientation(@NotNull Orientation orientation) {
this.orientation = orientation;
}
@Override
public int getObjectData() {
Check.stateCondition(this.orientation == null, "Painting orientation must be set before spawn");
return this.orientation.id();
}
@Override
public boolean requiresVelocityPacketAtSpawn() {
return false;
}
public enum Orientation {
NORTH(2),
SOUTH(3),
WEST(4),
EAST(5);
private final int id;
Orientation(int id) {
this.id = id;
}
public int id() {
return id;
}
}
public enum Variant implements StaticProtocolObject {
KEBAB(16, 16),
AZTEC(16, 16),
ALBAN(16, 16),
AZTEC2(16, 16),
BOMB(16, 16),
PLANT(16, 16),
WASTELAND(16, 16),
POOL(32, 16),
COURBET(32, 16),
SEA(32, 16),
SUNSET(32, 16),
CREEBET(32, 16),
WANDERER(16, 32),
GRAHAM(16, 32),
MATCH(32, 32),
BUST(32, 32),
STAGE(32, 32),
VOID(32, 32),
SKULL_AND_ROSES(32, 32),
WITHER(32, 32),
FIGHTERS(64, 32),
POINTER(64, 64),
PIGSCENE(64, 64),
BURNING_SKULL(64, 64),
SKELETON(64, 48),
EARTH(32, 32),
WIND(32, 32),
WATER(32, 32),
FIRE(32, 32),
DONKEY_KONG(64, 48);
private static final Variant[] VALUES = values();
public static @Nullable Variant fromId(int id) {
if (id < 0 || id >= VALUES.length) {
return null;
}
return VALUES[id];
}
public static @Nullable Variant fromNamespaceId(@Nullable String namespaceId) {
if (namespaceId == null) return null;
return fromNamespaceId(NamespaceID.from(namespaceId));
}
public static @Nullable Variant fromNamespaceId(@Nullable NamespaceID namespaceId) {
if (namespaceId == null) return null;
for (Variant value : VALUES) {
if (value.namespace().equals(namespaceId)) {
return value;
}
}
return null;
}
private final NamespaceID namespace;
private final int width;
private final int height;
Variant(int width, int height) {
this.namespace = NamespaceID.from("minecraft", name().toLowerCase(Locale.ROOT));
this.width = width;
this.height = height;
}
@Override
public int id() {
return ordinal();
}
public int width() {
return width;
}
public int height() {
return height;
}
@Override
public @NotNull NamespaceID namespace() {
return namespace;
}
}
}