/**
Copyright (C) <2017> <coolAlias>
This file is part of coolAlias' Zelda Sword Skills Minecraft Mod; as such,
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 <http://www.gnu.org/licenses/>.
*/
package zeldaswordskills.block;
import java.util.List;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockState;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemPickaxe;
import net.minecraft.item.ItemStack;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.IStringSerializable;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.eventhandler.Event.Result;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import zeldaswordskills.api.block.BlockWeight;
import zeldaswordskills.api.block.IQuakeBlock;
import zeldaswordskills.api.block.ISmashable;
import zeldaswordskills.creativetab.ZSSCreativeTabs;
import zeldaswordskills.item.ZSSItems;
import zeldaswordskills.ref.Config;
import zeldaswordskills.ref.ModInfo;
import zeldaswordskills.ref.Sounds;
import zeldaswordskills.util.PlayerUtils;
public class BlockQuakeStone extends Block implements IBlockItemVariant, IDungeonBlock, IQuakeBlock, ISmashable
{
public static final PropertyEnum<BlockQuakeStone.EnumType> VARIANT = PropertyEnum.create("variant", BlockQuakeStone.EnumType.class);
public BlockQuakeStone() {
super(ZSSBlockMaterials.adventureStone);
disableStats();
setBlockUnbreakable();
setResistance(BlockWeight.IMPOSSIBLE.weight);
setStepSound(soundTypeStone);
setDefaultState(blockState.getBaseState().withProperty(VARIANT, BlockQuakeStone.EnumType.COBBLE));
setCreativeTab(ZSSCreativeTabs.tabBlocks);
}
@Override
public void handleQuakeEffect(World world, BlockPos pos, IBlockState state, EntityPlayer player) {
world.destroyBlock(pos, true);
}
@Override
public BlockWeight getSmashWeight(EntityPlayer player, ItemStack stack, IBlockState state, EnumFacing face) {
return (Config.allowMegaSmashQuakeStone() && PlayerUtils.hasItem(player, ZSSItems.gauntletsGolden) ? BlockWeight.VERY_HEAVY : BlockWeight.IMPOSSIBLE);
}
@Override
public Result onSmashed(World world, EntityPlayer player, ItemStack stack, BlockPos pos, IBlockState state, EnumFacing face) {
return Result.DEFAULT;
}
@Override
public int damageDropped(IBlockState state) {
return state.getValue(VARIANT).getMetadata();
}
@Override
public Item getItemDropped(IBlockState state, Random rand, int fortune) {
return Item.getItemFromBlock(state.getValue(VARIANT).getDroppedBlock());
}
@Override
public void onBlockClicked(World world, BlockPos pos, EntityPlayer player) {
if (player.getHeldItem() != null && player.getHeldItem().getItem() instanceof ItemPickaxe) {
if (!world.isRemote) {
world.playSoundAtEntity(player, Sounds.ITEM_BREAK, 0.25F, 1.0F / (world.rand.nextFloat() * 0.4F + 0.5F));
} else if (Config.showSecretMessage) {
PlayerUtils.sendTranslatedChat(player, "chat.zss.block.secret");
}
}
}
@Override
public String[] getItemBlockVariants() {
String[] variants = new String[BlockQuakeStone.EnumType.values().length];
for (BlockQuakeStone.EnumType type : BlockQuakeStone.EnumType.values()) {
variants[type.getMetadata()] = ModInfo.ID + ":quake_stone_" + type.getName();
}
return variants;
}
@Override
@SideOnly(Side.CLIENT)
public void getSubBlocks(Item item, CreativeTabs tab, List<ItemStack> list) {
for (BlockQuakeStone.EnumType type : BlockQuakeStone.EnumType.values()) {
list.add(new ItemStack(item, 1, type.getMetadata()));
}
}
@Override
public boolean isSameVariant(World world, BlockPos pos, IBlockState state, int meta) {
IBlockState expected = getStateFromMeta(meta);
return state.getValue(VARIANT) == expected.getValue(VARIANT);
}
@Override
public IBlockState getStateFromMeta(int meta) {
return this.getDefaultState().withProperty(VARIANT, BlockQuakeStone.EnumType.byMetadata(meta));
}
@Override
public int getMetaFromState(IBlockState state) {
return state.getValue(VARIANT).getMetadata();
}
@Override
protected BlockState createBlockState() {
return new BlockState(this, VARIANT);
}
public static enum EnumType implements IStringSerializable
{
COBBLE(0, "cobble"),
MOSSY(1, "mossy");
private final int meta;
private final String unlocalizedName;
private EnumType(int meta, String unlocalizedName) {
this.meta = meta;
this.unlocalizedName = unlocalizedName;
}
@Override
public String toString() {
return this.unlocalizedName;
}
@Override
public String getName() {
return this.unlocalizedName;
}
public int getMetadata() {
return this.meta;
}
/**
* Returns the block dropped when this type is broken
*/
public Block getDroppedBlock() {
switch (this) {
case MOSSY: return Blocks.mossy_cobblestone;
default: return Blocks.cobblestone;
}
}
public static BlockQuakeStone.EnumType byMetadata(int meta) {
return EnumType.values()[Math.max(0, meta) % EnumType.values().length];
}
}
}