package org.bukkit.craftbukkit.inventory;
import java.util.Map;
import net.minecraft.server.NBTTagCompound;
import net.minecraft.server.NBTTagInt;
import net.minecraft.server.NBTTagString;
import org.bukkit.Color;
import org.bukkit.Material;
import org.bukkit.configuration.serialization.DelegateDeserialization;
import org.bukkit.craftbukkit.inventory.CraftMetaItem.SerializableMeta;
import org.bukkit.inventory.meta.MapMeta;
import com.google.common.collect.ImmutableMap;
@DelegateDeserialization(SerializableMeta.class)
class CraftMetaMap extends CraftMetaItem implements MapMeta {
static final ItemMetaKey MAP_SCALING = new ItemMetaKey("map_is_scaling", "scaling");
static final ItemMetaKey MAP_LOC_NAME = new ItemMetaKey("LocName", "display-loc-name");
static final ItemMetaKey MAP_COLOR = new ItemMetaKey("MapColor", "display-map-color");
static final byte SCALING_EMPTY = (byte) 0;
static final byte SCALING_TRUE = (byte) 1;
static final byte SCALING_FALSE = (byte) 2;
private byte scaling = SCALING_EMPTY;
private String locName;
private Color color;
CraftMetaMap(CraftMetaItem meta) {
super(meta);
if (!(meta instanceof CraftMetaMap)) {
return;
}
CraftMetaMap map = (CraftMetaMap) meta;
this.scaling = map.scaling;
this.locName = map.locName;
this.color = map.color;
}
CraftMetaMap(NBTTagCompound tag) {
super(tag);
if (tag.hasKey(MAP_SCALING.NBT)) {
this.scaling = tag.getBoolean(MAP_SCALING.NBT) ? SCALING_TRUE : SCALING_FALSE;
}
if (tag.hasKey(DISPLAY.NBT)) {
NBTTagCompound display = tag.getCompound(DISPLAY.NBT);
if (display.hasKey(MAP_LOC_NAME.NBT)) {
locName = display.getString(MAP_LOC_NAME.NBT);
}
if (display.hasKey(MAP_COLOR.NBT)) {
color = Color.fromRGB(display.getInt(MAP_COLOR.NBT));
}
}
}
CraftMetaMap(Map<String, Object> map) {
super(map);
Boolean scaling = SerializableMeta.getObject(Boolean.class, map, MAP_SCALING.BUKKIT, true);
if (scaling != null) {
setScaling(scaling);
}
String locName = SerializableMeta.getString(map, MAP_LOC_NAME.BUKKIT, true);
if (locName != null) {
setLocationName(locName);
}
Color color = SerializableMeta.getObject(Color.class, map, MAP_COLOR.BUKKIT, true);
if (color != null) {
setColor(color);
}
}
@Override
void applyToItem(NBTTagCompound tag) {
super.applyToItem(tag);
if (hasScaling()) {
tag.setBoolean(MAP_SCALING.NBT, isScaling());
}
if (hasLocationName()) {
setDisplayTag(tag, MAP_LOC_NAME.NBT, new NBTTagString(getLocationName()));
}
if (hasColor()) {
setDisplayTag(tag, MAP_COLOR.NBT, new NBTTagInt(color.asRGB()));
}
}
@Override
boolean applicableTo(Material type) {
switch (type) {
case MAP:
return true;
default:
return false;
}
}
@Override
boolean isEmpty() {
return super.isEmpty() && isMapEmpty();
}
boolean isMapEmpty() {
return !(hasScaling() | hasLocationName() || hasColor());
}
boolean hasScaling() {
return scaling != SCALING_EMPTY;
}
public boolean isScaling() {
return scaling == SCALING_TRUE;
}
public void setScaling(boolean scaling) {
this.scaling = scaling ? SCALING_TRUE : SCALING_FALSE;
}
@Override
public boolean hasLocationName() {
return this.locName != null;
}
@Override
public String getLocationName() {
return this.locName;
}
@Override
public void setLocationName(String name) {
this.locName = name;
}
@Override
public boolean hasColor() {
return this.color != null;
}
@Override
public Color getColor() {
return this.color;
}
@Override
public void setColor(Color color) {
this.color = color;
}
@Override
boolean equalsCommon(CraftMetaItem meta) {
if (!super.equalsCommon(meta)) {
return false;
}
if (meta instanceof CraftMetaMap) {
CraftMetaMap that = (CraftMetaMap) meta;
return (this.scaling == that.scaling)
&& (hasLocationName() ? that.hasLocationName() && this.locName.equals(that.locName) : !that.hasLocationName())
&& (hasColor() ? that.hasColor() && this.color.equals(that.color) : !that.hasColor());
}
return true;
}
@Override
boolean notUncommon(CraftMetaItem meta) {
return super.notUncommon(meta) && (meta instanceof CraftMetaMap || isMapEmpty());
}
@Override
int applyHash() {
final int original;
int hash = original = super.applyHash();
if (hasScaling()) {
hash ^= 0x22222222 << (isScaling() ? 1 : -1);
}
if (hasLocationName()) {
hash = 61 * hash + locName.hashCode();
}
if (hasColor()) {
hash = 61 * hash + color.hashCode();
}
return original != hash ? CraftMetaMap.class.hashCode() ^ hash : hash;
}
public CraftMetaMap clone() {
return (CraftMetaMap) super.clone();
}
@Override
ImmutableMap.Builder<String, Object> serialize(ImmutableMap.Builder<String, Object> builder) {
super.serialize(builder);
if (hasScaling()) {
builder.put(MAP_SCALING.BUKKIT, isScaling());
}
if (hasLocationName()) {
builder.put(MAP_LOC_NAME.BUKKIT, getLocationName());
}
if (hasColor()) {
builder.put(MAP_COLOR.BUKKIT, getColor());
}
return builder;
}
}