2022-12-22 17:22:45 +01:00
|
|
|
package com.eloraam.redpower.base;
|
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
import java.util.List;
|
|
|
|
|
2022-12-22 17:22:45 +01:00
|
|
|
import com.eloraam.redpower.RedPowerBase;
|
|
|
|
import com.eloraam.redpower.core.CoreLib;
|
|
|
|
import com.eloraam.redpower.core.CoverLib;
|
|
|
|
import com.eloraam.redpower.core.CreativeExtraTabs;
|
|
|
|
import com.eloraam.redpower.core.ICoverable;
|
|
|
|
import com.eloraam.redpower.core.IMicroPlacement;
|
|
|
|
import com.eloraam.redpower.core.RedPowerLib;
|
|
|
|
import com.eloraam.redpower.core.WorldCoord;
|
|
|
|
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.item.Item;
|
|
|
|
import net.minecraft.item.ItemBlock;
|
|
|
|
import net.minecraft.item.ItemStack;
|
|
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
|
|
import net.minecraft.tileentity.TileEntity;
|
|
|
|
import net.minecraft.util.MovingObjectPosition;
|
|
|
|
import net.minecraft.util.MovingObjectPosition.MovingObjectType;
|
|
|
|
import net.minecraft.world.World;
|
|
|
|
import net.minecraftforge.common.MinecraftForge;
|
|
|
|
import net.minecraftforge.common.util.BlockSnapshot;
|
|
|
|
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
|
|
|
|
import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
|
|
|
|
import net.minecraftforge.event.world.BlockEvent.PlaceEvent;
|
|
|
|
|
|
|
|
public class ItemMicro extends ItemBlock {
|
2023-01-12 16:43:10 +01:00
|
|
|
private IMicroPlacement[] placers = new IMicroPlacement[256];
|
2022-12-22 17:22:45 +01:00
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
public ItemMicro(Block block) {
|
|
|
|
super(block);
|
|
|
|
this.setMaxDamage(0);
|
|
|
|
this.setHasSubtypes(true);
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
private boolean useCover(
|
|
|
|
ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side
|
|
|
|
) {
|
|
|
|
MovingObjectPosition pos = CoreLib.retraceBlock(world, player, x, y, z);
|
|
|
|
if (pos == null) {
|
2022-12-22 17:22:45 +01:00
|
|
|
return false;
|
2023-01-12 16:43:10 +01:00
|
|
|
} else if (pos.typeOfHit != MovingObjectType.BLOCK) {
|
|
|
|
return false;
|
|
|
|
} else {
|
|
|
|
pos = CoverLib.getPlacement(world, pos, ist.getItemDamage());
|
|
|
|
if (pos == null) {
|
|
|
|
return false;
|
2022-12-22 17:22:45 +01:00
|
|
|
} else {
|
2023-01-12 16:43:10 +01:00
|
|
|
Block oldBlock = world.getBlock(pos.blockX, pos.blockY, pos.blockZ);
|
|
|
|
if (world.canPlaceEntityOnSide(
|
|
|
|
oldBlock,
|
|
|
|
pos.blockX,
|
|
|
|
pos.blockY,
|
|
|
|
pos.blockZ,
|
|
|
|
false,
|
|
|
|
side,
|
|
|
|
player,
|
|
|
|
ist
|
|
|
|
)) {
|
|
|
|
world.setBlock(
|
|
|
|
pos.blockX, pos.blockY, pos.blockZ, RedPowerBase.blockMicro, 0, 3
|
|
|
|
);
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
TileEntity te = world.getTileEntity(pos.blockX, pos.blockY, pos.blockZ);
|
|
|
|
Block newBlock = world.getBlock(pos.blockX, pos.blockY, pos.blockZ);
|
|
|
|
int newMeta = world.getBlockMetadata(pos.blockX, pos.blockY, pos.blockZ);
|
|
|
|
if (!(te instanceof ICoverable)) {
|
|
|
|
return false;
|
|
|
|
} else {
|
|
|
|
ICoverable icv = (ICoverable) te;
|
|
|
|
PlayerInteractEvent event = new PlayerInteractEvent(
|
|
|
|
player,
|
|
|
|
Action.RIGHT_CLICK_BLOCK,
|
|
|
|
pos.blockX,
|
|
|
|
pos.blockY,
|
|
|
|
pos.blockZ,
|
|
|
|
side,
|
|
|
|
world
|
|
|
|
);
|
|
|
|
if (!MinecraftForge.EVENT_BUS.post(event)) {
|
|
|
|
NBTTagCompound nbt = new NBTTagCompound();
|
|
|
|
te.writeToNBT(nbt);
|
|
|
|
BlockSnapshot snapshot = new BlockSnapshot(
|
|
|
|
world,
|
|
|
|
pos.blockX,
|
|
|
|
pos.blockY,
|
|
|
|
pos.blockZ,
|
|
|
|
newBlock,
|
|
|
|
newMeta,
|
|
|
|
nbt
|
|
|
|
);
|
|
|
|
PlaceEvent plvt = new PlaceEvent(snapshot, oldBlock, player);
|
|
|
|
if (!MinecraftForge.EVENT_BUS.post(plvt)) {
|
|
|
|
if (icv.tryAddCover(
|
|
|
|
pos.subHit,
|
|
|
|
CoverLib.damageToCoverValue(ist.getItemDamage())
|
|
|
|
)) {
|
|
|
|
if (!player.capabilities.isCreativeMode) {
|
|
|
|
--ist.stackSize;
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
CoreLib.placeNoise(
|
|
|
|
world,
|
|
|
|
pos.blockX,
|
|
|
|
pos.blockY,
|
|
|
|
pos.blockZ,
|
|
|
|
CoverLib.getBlock(ist.getItemDamage() & 0xFF)
|
|
|
|
);
|
|
|
|
RedPowerLib.updateIndirectNeighbors(
|
|
|
|
world,
|
|
|
|
pos.blockX,
|
|
|
|
pos.blockY,
|
|
|
|
pos.blockZ,
|
|
|
|
RedPowerBase.blockMicro
|
|
|
|
);
|
|
|
|
world.markBlockForUpdate(
|
|
|
|
pos.blockX, pos.blockY, pos.blockZ
|
|
|
|
);
|
|
|
|
return true;
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
}
|
2023-01-12 16:43:10 +01:00
|
|
|
}
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
public boolean func_150936_a(
|
|
|
|
World world, int x, int y, int z, int side, EntityPlayer player, ItemStack ist
|
|
|
|
) {
|
|
|
|
return true;
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
public boolean onItemUse(
|
|
|
|
ItemStack ist,
|
|
|
|
EntityPlayer player,
|
|
|
|
World world,
|
|
|
|
int x,
|
|
|
|
int y,
|
|
|
|
int z,
|
|
|
|
int side,
|
|
|
|
float xp,
|
|
|
|
float yp,
|
|
|
|
float zp
|
|
|
|
) {
|
|
|
|
return player != null && !player.isSneaking()
|
|
|
|
&& this.itemUseShared(ist, player, world, x, y, z, side);
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
public boolean onItemUseFirst(
|
|
|
|
ItemStack ist,
|
|
|
|
EntityPlayer player,
|
|
|
|
World world,
|
|
|
|
int x,
|
|
|
|
int y,
|
|
|
|
int z,
|
|
|
|
int side,
|
|
|
|
float xp,
|
|
|
|
float yp,
|
|
|
|
float zp
|
|
|
|
) {
|
|
|
|
return !world.isRemote && player.isSneaking()
|
|
|
|
&& this.itemUseShared(ist, player, world, x, y, z, side);
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
private boolean itemUseShared(
|
|
|
|
ItemStack ist, EntityPlayer player, World world, int x, int y, int z, int side
|
|
|
|
) {
|
|
|
|
int hb = ist.getItemDamage();
|
|
|
|
hb >>= 8;
|
|
|
|
return hb != 0 && (hb < 16 || hb > 45)
|
|
|
|
? this.placers[hb] != null
|
|
|
|
&& this.placers[hb].onPlaceMicro(
|
|
|
|
ist, player, world, new WorldCoord(x, y, z), side
|
|
|
|
)
|
|
|
|
: this.useCover(ist, player, world, x, y, z, side);
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
private String getMicroName(int hb) {
|
|
|
|
switch (hb) {
|
|
|
|
case 0:
|
|
|
|
return "rpcover";
|
|
|
|
case 1:
|
|
|
|
case 2:
|
|
|
|
case 3:
|
|
|
|
case 4:
|
|
|
|
case 5:
|
|
|
|
case 6:
|
|
|
|
case 7:
|
|
|
|
case 8:
|
|
|
|
case 9:
|
|
|
|
case 10:
|
|
|
|
case 11:
|
|
|
|
case 12:
|
|
|
|
case 13:
|
|
|
|
case 14:
|
|
|
|
case 15:
|
|
|
|
default:
|
|
|
|
return null;
|
|
|
|
case 16:
|
|
|
|
return "rppanel";
|
|
|
|
case 17:
|
|
|
|
return "rpslab";
|
|
|
|
case 18:
|
|
|
|
return "rpcovc";
|
|
|
|
case 19:
|
|
|
|
return "rppanc";
|
|
|
|
case 20:
|
|
|
|
return "rpslabc";
|
|
|
|
case 21:
|
|
|
|
return "rpcovs";
|
|
|
|
case 22:
|
|
|
|
return "rppans";
|
|
|
|
case 23:
|
|
|
|
return "rpslabs";
|
|
|
|
case 24:
|
|
|
|
return "rphcover";
|
|
|
|
case 25:
|
|
|
|
return "rphpanel";
|
|
|
|
case 26:
|
|
|
|
return "rphslab";
|
|
|
|
case 27:
|
|
|
|
return "rpcov3";
|
|
|
|
case 28:
|
|
|
|
return "rpcov5";
|
|
|
|
case 29:
|
|
|
|
return "rpcov6";
|
|
|
|
case 30:
|
|
|
|
return "rpcov7";
|
|
|
|
case 31:
|
|
|
|
return "rphcov3";
|
|
|
|
case 32:
|
|
|
|
return "rphcov5";
|
|
|
|
case 33:
|
|
|
|
return "rphcov6";
|
|
|
|
case 34:
|
|
|
|
return "rphcov7";
|
|
|
|
case 35:
|
|
|
|
return "rpcov3c";
|
|
|
|
case 36:
|
|
|
|
return "rpcov5c";
|
|
|
|
case 37:
|
|
|
|
return "rpcov6c";
|
|
|
|
case 38:
|
|
|
|
return "rpcov7c";
|
|
|
|
case 39:
|
|
|
|
return "rpcov3s";
|
|
|
|
case 40:
|
|
|
|
return "rpcov5s";
|
|
|
|
case 41:
|
|
|
|
return "rpcov6s";
|
|
|
|
case 42:
|
|
|
|
return "rpcov7s";
|
|
|
|
case 43:
|
|
|
|
return "rppole1";
|
|
|
|
case 44:
|
|
|
|
return "rppole2";
|
|
|
|
case 45:
|
|
|
|
return "rppole3";
|
|
|
|
}
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
public String getUnlocalizedName(ItemStack ist) {
|
|
|
|
int hb = ist.getItemDamage();
|
|
|
|
int lb = hb & 0xFF;
|
|
|
|
hb >>= 8;
|
|
|
|
String stub = this.getMicroName(hb);
|
|
|
|
if (stub != null) {
|
|
|
|
String name = CoverLib.getName(lb);
|
|
|
|
if (name == null) {
|
|
|
|
throw new IndexOutOfBoundsException();
|
|
|
|
} else {
|
|
|
|
return "tile." + stub + "." + name;
|
|
|
|
}
|
|
|
|
} else if (this.placers[hb] == null) {
|
2022-12-22 17:22:45 +01:00
|
|
|
throw new IndexOutOfBoundsException();
|
2023-01-12 16:43:10 +01:00
|
|
|
} else {
|
|
|
|
String name = this.placers[hb].getMicroName(hb, lb);
|
|
|
|
if (name == null) {
|
|
|
|
throw new IndexOutOfBoundsException();
|
|
|
|
} else {
|
|
|
|
return name;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
public void registerPlacement(int md, IMicroPlacement imp) {
|
|
|
|
this.placers[md] = imp;
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
public void getSubItems(Item id, CreativeTabs tab, List list) {
|
|
|
|
if (tab != CreativeExtraTabs.tabWires && tab != CreativeExtraTabs.tabMachine) {
|
|
|
|
if (tab == CreativeExtraTabs.tabMicros) {
|
|
|
|
for (int i = 0; i < 255; ++i) {
|
|
|
|
String stub = CoverLib.getName(i);
|
|
|
|
if (stub != null) {
|
|
|
|
list.add(new ItemStack(RedPowerBase.blockMicro, 1, i));
|
|
|
|
}
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
for (int i = 1; i < 255; ++i) {
|
|
|
|
String stub = this.getMicroName(i);
|
|
|
|
if (stub != null) {
|
|
|
|
list.add(new ItemStack(RedPowerBase.blockMicro, 1, i << 8));
|
|
|
|
}
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
for (int i = 1; i < 255; ++i) {
|
|
|
|
String stub = this.getMicroName(i);
|
|
|
|
if (stub != null) {
|
|
|
|
list.add(new ItemStack(RedPowerBase.blockMicro, 1, i << 8 | 2));
|
|
|
|
}
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
for (int i = 1; i < 255; ++i) {
|
|
|
|
String stub = this.getMicroName(i);
|
|
|
|
if (stub != null) {
|
|
|
|
list.add(new ItemStack(RedPowerBase.blockMicro, 1, i << 8 | 23));
|
|
|
|
}
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
for (int i = 1; i < 255; ++i) {
|
|
|
|
String stub = this.getMicroName(i);
|
|
|
|
if (stub != null) {
|
|
|
|
list.add(new ItemStack(RedPowerBase.blockMicro, 1, i << 8 | 26));
|
|
|
|
}
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
}
|
2023-01-12 16:43:10 +01:00
|
|
|
} else {
|
|
|
|
for (int i = 0; i < 255; ++i) {
|
|
|
|
if (this.placers[i] != null) {
|
|
|
|
this.placers[i].addCreativeItems(i, tab, list);
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
}
|
2023-01-12 16:43:10 +01:00
|
|
|
}
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
|
2023-01-12 16:43:10 +01:00
|
|
|
public CreativeTabs[] getCreativeTabs() {
|
|
|
|
return new CreativeTabs[] { CreativeExtraTabs.tabWires,
|
|
|
|
CreativeExtraTabs.tabMicros,
|
|
|
|
CreativeExtraTabs.tabMachine };
|
|
|
|
}
|
2022-12-22 17:22:45 +01:00
|
|
|
}
|