/**
* Copyright (c) Lambda Innovation, 2013-2016
* This file is part of the AcademyCraft mod.
* https://github.com/LambdaInnovation/AcademyCraft
* Licensed under GPLv3, see project root for more information.
*/
package cn.academy.crafting.item;
import cn.academy.core.Resources;
import cn.academy.core.item.ACItem;
import cn.academy.crafting.api.event.MatterUnitHarvestEvent;
import cn.academy.crafting.client.render.item.RendererMatterUnit;
import cn.lambdalib.annoreg.mc.RegItem;
import cn.lambdalib.util.mc.PlayerUtils;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
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.ItemStack;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.MovingObjectPosition.MovingObjectType;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import java.util.ArrayList;
import java.util.List;
/**
* The matter unit class. Have a simple material system for registration.
* @author WeAthFolD
*/
public class ItemMatterUnit extends ACItem {
@RegItem.Render
@SideOnly(Side.CLIENT)
public static RendererMatterUnit renderer;
public static class MatterMaterial {
public final String name;
public final ResourceLocation texture;
public final Block block;
private int id;
public MatterMaterial(String _name, Block block) {
this(_name, block, Resources.getTexture("items/matter_unit/" + _name + "_mat"));
}
public MatterMaterial(String _name, Block _block, ResourceLocation tex) {
name = _name;
texture = tex;
block = _block;
}
}
private static List<MatterMaterial> materials = new ArrayList();
public static final MatterMaterial NONE = new MatterMaterial("none", Blocks.air);
static {
addMatterMaterial(NONE);
}
public static void addMatterMaterial(MatterMaterial mat) {
for(MatterMaterial prev : materials) {
if(prev.name.equals(mat.name))
throw new RuntimeException("Duplicate MatterMaterial Key " + mat.name);
}
mat.id = materials.size();
materials.add(mat);
}
public static MatterMaterial getMatterMaterial(String name) {
for(MatterMaterial mat : materials) {
if(mat.name.equals(name))
return mat;
}
return null;
}
//------
public ItemMatterUnit() {
super("matter_unit");
setMaxStackSize(16);
hasSubtypes = true;
}
public MatterMaterial getMaterial(ItemStack stack) {
if(stack.getItem() != this || stack.getItemDamage() >= materials.size())
return null;
MatterMaterial mat = materials.get(stack.getItemDamage());
if(mat == null) {
setMaterial(stack, NONE);
return NONE;
}
return mat;
}
public void setMaterial(ItemStack stack, MatterMaterial mat) {
stack.setItemDamage(mat.id);
}
public void setMaterial(ItemStack stack, String name) {
setMaterial(stack, getMatterMaterial(name));
}
public ItemStack create(String name) {
return create(getMatterMaterial(name));
}
public ItemStack create(MatterMaterial mat) {
ItemStack ret = new ItemStack(this);
setMaterial(ret, mat);
return ret;
}
@Override
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
boolean isNone = getMaterial(stack) == NONE;
MovingObjectPosition mop =
this.getMovingObjectPositionFromPlayer(world, player, true);
if (mop == null) {
return stack;
} else {
if (mop.typeOfHit == MovingObjectType.BLOCK) {
int i = mop.blockX;
int j = mop.blockY;
int k = mop.blockZ;
if (!world.canMineBlock(player, i, j, k)) {
return stack;
}
if (isNone) {
if (!player.canPlayerEdit(i, j, k, mop.sideHit, stack)) {
return stack;
}
Block b = world.getBlock(i, j, k);
for(MatterMaterial m : materials) {
if(m.block == b) {
// Match, merge the stack.
ItemStack newStack = new ItemStack(this);
this.setMaterial(newStack, m);
int left = PlayerUtils.mergeStackable(player.inventory, newStack);
if(left > 0 && !world.isRemote) {
newStack.stackSize = left;
player.dropPlayerItemWithRandomChoice(newStack, false);
}
// --stackSize
if(!player.capabilities.isCreativeMode) {
stack.stackSize--;
}
// Clear block
world.setBlockToAir(i, j, k);
MinecraftForge.EVENT_BUS.post(new MatterUnitHarvestEvent(player, m));
break;
}
}
} else {
if (!player.canPlayerEdit(i, j, k, mop.sideHit, stack)) {
return stack;
}
Block b = world.getBlock(i, j, k);
if(b.isReplaceable(world, i, j, k)) {
world.setBlock(i, j, k, getMaterial(stack).block);
} else {
switch(mop.sideHit) {
case 0:
j--;
break;
case 1:
j++;
break;
case 2:
k--;
break;
case 3:
k++;
break;
case 4:
i--;
break;
case 5:
i++;
break;
}
world.setBlock(i, j, k, this.getMaterial(stack).block);
}
ItemStack newStack = new ItemStack(this);
this.setMaterial(newStack, NONE);
int left = PlayerUtils.mergeStackable(player.inventory, newStack);
if(left > 0 && !world.isRemote) {
newStack.stackSize = left;
player.dropPlayerItemWithRandomChoice(newStack, false);
}
if(!player.capabilities.isCreativeMode) {
stack.stackSize--;
}
MinecraftForge.EVENT_BUS.post(new MatterUnitHarvestEvent(player, NONE));
}
}
return stack;
}
}
@Override
public String getUnlocalizedName(ItemStack stack) {
return getUnlocalizedName() + "_" + getMaterial(stack).name;
}
@SideOnly(Side.CLIENT)
@Override
public void getSubItems(Item instance, CreativeTabs cct, List list) {
for(MatterMaterial mat : materials) {
ItemStack stack = new ItemStack(this);
setMaterial(stack, mat);
list.add(stack);
}
}
}