package net.minecraft.block.state;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Objects;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableTable;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import net.minecraft.block.Block;
import net.minecraft.block.properties.IProperty;
import net.minecraft.util.Cartesian;
import net.minecraft.util.MapPopulator;
public class BlockState
{
private static final Joiner COMMA_JOINER = Joiner.on(", ");
/** Function that converts a Property into it's name. */
private static final Function GET_NAME_FUNC = new Function()
{
private static final String __OBFID = "CL_00002029";
public String apply(IProperty property)
{
return property == null ? "<NULL>" : property.getName();
}
public Object apply(Object p_apply_1_)
{
return this.apply((IProperty)p_apply_1_);
}
};
private final Block block;
private final ImmutableList properties;
private final ImmutableList validStates;
private static final String __OBFID = "CL_00002030";
public BlockState(Block blockIn, IProperty ... properties)
{
this.block = blockIn;
Arrays.sort(properties, new Comparator()
{
private static final String __OBFID = "CL_00002028";
public int compare(IProperty left, IProperty right)
{
return left.getName().compareTo(right.getName());
}
public int compare(Object p_compare_1_, Object p_compare_2_)
{
return this.compare((IProperty)p_compare_1_, (IProperty)p_compare_2_);
}
});
this.properties = ImmutableList.copyOf(properties);
LinkedHashMap var3 = Maps.newLinkedHashMap();
ArrayList var4 = Lists.newArrayList();
Iterable var5 = Cartesian.cartesianProduct(this.getAllowedValues());
Iterator var6 = var5.iterator();
while (var6.hasNext())
{
List var7 = (List)var6.next();
Map var8 = MapPopulator.createMap(this.properties, var7);
BlockState.StateImplemenation var9 = new BlockState.StateImplemenation(blockIn, ImmutableMap.copyOf(var8), null);
var3.put(var8, var9);
var4.add(var9);
}
var6 = var4.iterator();
while (var6.hasNext())
{
BlockState.StateImplemenation var10 = (BlockState.StateImplemenation)var6.next();
var10.buildPropertyValueTable(var3);
}
this.validStates = ImmutableList.copyOf(var4);
}
public ImmutableList getValidStates()
{
return this.validStates;
}
private List getAllowedValues()
{
ArrayList var1 = Lists.newArrayList();
for (int var2 = 0; var2 < this.properties.size(); ++var2)
{
var1.add(((IProperty)this.properties.get(var2)).getAllowedValues());
}
return var1;
}
public IBlockState getBaseState()
{
return (IBlockState)this.validStates.get(0);
}
public Block getBlock()
{
return this.block;
}
public Collection getProperties()
{
return this.properties;
}
public String toString()
{
return Objects.toStringHelper(this).add("block", Block.blockRegistry.getNameForObject(this.block)).add("properties", Iterables.transform(this.properties, GET_NAME_FUNC)).toString();
}
static class StateImplemenation extends BlockStateBase
{
private final Block block;
private final ImmutableMap properties;
private ImmutableTable propertyValueTable;
private static final String __OBFID = "CL_00002027";
private StateImplemenation(Block p_i45660_1_, ImmutableMap p_i45660_2_)
{
this.block = p_i45660_1_;
this.properties = p_i45660_2_;
}
public Collection getPropertyNames()
{
return Collections.unmodifiableCollection(this.properties.keySet());
}
public Comparable getValue(IProperty property)
{
if (!this.properties.containsKey(property))
{
throw new IllegalArgumentException("Cannot get property " + property + " as it does not exist in " + this.block.getBlockState());
}
else
{
return (Comparable)property.getValueClass().cast(this.properties.get(property));
}
}
public IBlockState withProperty(IProperty property, Comparable value)
{
if (!this.properties.containsKey(property))
{
throw new IllegalArgumentException("Cannot set property " + property + " as it does not exist in " + this.block.getBlockState());
}
else if (!property.getAllowedValues().contains(value))
{
throw new IllegalArgumentException("Cannot set property " + property + " to " + value + " on block " + Block.blockRegistry.getNameForObject(this.block) + ", it is not an allowed value");
}
else
{
return (IBlockState)(this.properties.get(property) == value ? this : (IBlockState)this.propertyValueTable.get(property, value));
}
}
public ImmutableMap getProperties()
{
return this.properties;
}
public Block getBlock()
{
return this.block;
}
public boolean equals(Object p_equals_1_)
{
return this == p_equals_1_;
}
public int hashCode()
{
return this.properties.hashCode();
}
public void buildPropertyValueTable(Map map)
{
if (this.propertyValueTable != null)
{
throw new IllegalStateException();
}
else
{
HashBasedTable var2 = HashBasedTable.create();
Iterator var3 = this.properties.keySet().iterator();
while (var3.hasNext())
{
IProperty var4 = (IProperty)var3.next();
Iterator var5 = var4.getAllowedValues().iterator();
while (var5.hasNext())
{
Comparable var6 = (Comparable)var5.next();
if (var6 != this.properties.get(var4))
{
var2.put(var4, var6, map.get(this.setPropertyValue(var4, var6)));
}
}
}
this.propertyValueTable = ImmutableTable.copyOf(var2);
}
}
private Map setPropertyValue(IProperty property, Comparable value)
{
HashMap var3 = Maps.newHashMap(this.properties);
var3.put(property, value);
return var3;
}
StateImplemenation(Block p_i45661_1_, ImmutableMap p_i45661_2_, Object p_i45661_3_)
{
this(p_i45661_1_, p_i45661_2_);
}
}
}