add gate copiers, close #2081
This commit is contained in:
parent
64c263c1cb
commit
59686cd481
4 changed files with 152 additions and 35 deletions
|
@ -19,7 +19,6 @@ import net.minecraft.item.Item;
|
|||
import net.minecraft.item.ItemBlock;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import cpw.mods.fml.common.Loader;
|
||||
import cpw.mods.fml.common.Mod;
|
||||
import cpw.mods.fml.common.event.FMLInitializationEvent;
|
||||
|
@ -29,13 +28,11 @@ import cpw.mods.fml.common.event.FMLPostInitializationEvent;
|
|||
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
|
||||
import cpw.mods.fml.common.network.NetworkRegistry;
|
||||
import cpw.mods.fml.common.registry.GameRegistry;
|
||||
|
||||
import net.minecraftforge.common.config.Configuration;
|
||||
import net.minecraftforge.common.config.Property;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
import net.minecraftforge.oredict.RecipeSorter;
|
||||
|
||||
import buildcraft.api.blueprints.SchematicRegistry;
|
||||
import buildcraft.api.core.EnumColor;
|
||||
import buildcraft.api.core.IIconProvider;
|
||||
|
@ -61,6 +58,7 @@ import buildcraft.transport.BlockFilteredBuffer;
|
|||
import buildcraft.transport.BlockGenericPipe;
|
||||
import buildcraft.transport.GuiHandler;
|
||||
import buildcraft.transport.ItemFacade;
|
||||
import buildcraft.transport.ItemGateCopier;
|
||||
import buildcraft.transport.ItemPipe;
|
||||
import buildcraft.transport.ItemPipeWire;
|
||||
import buildcraft.transport.ItemPlug;
|
||||
|
@ -161,6 +159,7 @@ public class BuildCraftTransport extends BuildCraftMod {
|
|||
public static Item plugItem;
|
||||
public static Item robotStationItem;
|
||||
public static Item pipeStructureCobblestone;
|
||||
public static Item gateCopier;
|
||||
public static ItemFacade facadeItem;
|
||||
|
||||
public static Item pipeItemsWood;
|
||||
|
@ -420,11 +419,13 @@ public class BuildCraftTransport extends BuildCraftMod {
|
|||
plugItem.setUnlocalizedName("pipePlug");
|
||||
CoreProxy.proxy.registerItem(plugItem);
|
||||
|
||||
|
||||
robotStationItem = new ItemRobotStation();
|
||||
robotStationItem.setUnlocalizedName("robotStation");
|
||||
CoreProxy.proxy.registerItem(robotStationItem);
|
||||
|
||||
gateCopier = new ItemGateCopier();
|
||||
CoreProxy.proxy.registerItem(gateCopier);
|
||||
|
||||
for (PipeContents kind : PipeContents.values()) {
|
||||
triggerPipe[kind.ordinal()] = new TriggerPipeContents(kind);
|
||||
}
|
||||
|
|
|
@ -734,6 +734,8 @@ public class BlockGenericPipe extends BlockBuildCraft {
|
|||
return false;
|
||||
} else if (currentItem.getItem() instanceof ItemPipe) {
|
||||
return false;
|
||||
} else if (currentItem.getItem() instanceof ItemGateCopier) {
|
||||
return false;
|
||||
} else if (currentItem.getItem() instanceof IToolWrench) {
|
||||
// Only check the instance at this point. Call the IToolWrench
|
||||
// interface callbacks for the individual pipe/logic calls
|
||||
|
|
|
@ -133,6 +133,36 @@ public final class Gate implements IGate {
|
|||
expansions.put(expansion, expansion.makeController(pipe.container));
|
||||
}
|
||||
}
|
||||
|
||||
public void writeStatementsToNBT(NBTTagCompound data) {
|
||||
for (int i = 0; i < material.numSlots; ++i) {
|
||||
if (triggers[i] != null) {
|
||||
data.setString("trigger[" + i + "]", triggers[i].getUniqueTag());
|
||||
}
|
||||
|
||||
if (actions[i] != null) {
|
||||
data.setString("action[" + i + "]", actions[i].getUniqueTag());
|
||||
}
|
||||
|
||||
for (int j = 0; j < material.numTriggerParameters; ++j) {
|
||||
if (triggerParameters[i][j] != null) {
|
||||
NBTTagCompound cpt = new NBTTagCompound();
|
||||
cpt.setString("kind", StatementManager.getParameterKind(triggerParameters[i][j]));
|
||||
triggerParameters[i][j].writeToNBT(cpt);
|
||||
data.setTag("triggerParameters[" + i + "][" + j + "]", cpt);
|
||||
}
|
||||
}
|
||||
|
||||
for (int j = 0; j < material.numActionParameters; ++j) {
|
||||
if (actionParameters[i][j] != null) {
|
||||
NBTTagCompound cpt = new NBTTagCompound();
|
||||
cpt.setString("kind", StatementManager.getParameterKind(actionParameters[i][j]));
|
||||
actionParameters[i][j].writeToNBT(cpt);
|
||||
data.setTag("actionParameters[" + i + "][" + j + "]", cpt);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// / SAVING & LOADING
|
||||
public void writeToNBT(NBTTagCompound data) {
|
||||
|
@ -150,33 +180,7 @@ public final class Gate implements IGate {
|
|||
}
|
||||
data.setTag("expansions", exList);
|
||||
|
||||
for (int i = 0; i < MAX_STATEMENTS; ++i) {
|
||||
if (triggers[i] != null) {
|
||||
data.setString("trigger[" + i + "]", triggers[i].getUniqueTag());
|
||||
}
|
||||
|
||||
if (actions[i] != null) {
|
||||
data.setString("action[" + i + "]", actions[i].getUniqueTag());
|
||||
}
|
||||
|
||||
for (int j = 0; j < MAX_PARAMETERS; ++j) {
|
||||
if (triggerParameters[i][j] != null) {
|
||||
NBTTagCompound cpt = new NBTTagCompound();
|
||||
cpt.setString("kind", StatementManager.getParameterKind(triggerParameters[i][j]));
|
||||
triggerParameters[i][j].writeToNBT(cpt);
|
||||
data.setTag("triggerParameters[" + i + "][" + j + "]", cpt);
|
||||
}
|
||||
}
|
||||
|
||||
for (int j = 0; j < MAX_PARAMETERS; ++j) {
|
||||
if (actionParameters[i][j] != null) {
|
||||
NBTTagCompound cpt = new NBTTagCompound();
|
||||
cpt.setString("kind", StatementManager.getParameterKind(actionParameters[i][j]));
|
||||
actionParameters[i][j].writeToNBT(cpt);
|
||||
data.setTag("actionParameters[" + i + "][" + j + "]", cpt);
|
||||
}
|
||||
}
|
||||
}
|
||||
writeStatementsToNBT(data);
|
||||
|
||||
for (PipeWire wire : PipeWire.VALUES) {
|
||||
data.setBoolean("wireState[" + wire.ordinal() + "]", broadcastSignal.get(wire.ordinal()));
|
||||
|
@ -185,8 +189,8 @@ public final class Gate implements IGate {
|
|||
data.setByte("redstoneOutput", (byte) redstoneOutput);
|
||||
}
|
||||
|
||||
public void readFromNBT(NBTTagCompound data) {
|
||||
for (int i = 0; i < MAX_STATEMENTS; ++i) {
|
||||
public void readStatementsFromNBT(NBTTagCompound data) {
|
||||
for (int i = 0; i < material.numSlots; ++i) {
|
||||
if (data.hasKey("trigger[" + i + "]")) {
|
||||
triggers[i] = (ITrigger) StatementManager.statements.get(data.getString("trigger[" + i + "]"));
|
||||
}
|
||||
|
@ -201,7 +205,7 @@ public final class Gate implements IGate {
|
|||
triggerParameters[i][0].readFromNBT(data.getCompoundTag("triggerParameters[" + i + "]"));
|
||||
}
|
||||
|
||||
for (int j = 0; j < MAX_PARAMETERS; ++j) {
|
||||
for (int j = 0; j < material.numTriggerParameters; ++j) {
|
||||
if (data.hasKey("triggerParameters[" + i + "][" + j + "]")) {
|
||||
NBTTagCompound cpt = data.getCompoundTag("triggerParameters[" + i + "][" + j + "]");
|
||||
triggerParameters[i][j] = (ITriggerParameter) StatementManager.createParameter(cpt.getString("kind"));
|
||||
|
@ -209,7 +213,7 @@ public final class Gate implements IGate {
|
|||
}
|
||||
}
|
||||
|
||||
for (int j = 0; j < MAX_PARAMETERS; ++j) {
|
||||
for (int j = 0; j < material.numActionParameters; ++j) {
|
||||
if (data.hasKey("actionParameters[" + i + "][" + j + "]")) {
|
||||
NBTTagCompound cpt = data.getCompoundTag("actionParameters[" + i + "][" + j + "]");
|
||||
actionParameters[i][j] = (IActionParameter) StatementManager.createParameter(cpt.getString("kind"));
|
||||
|
@ -217,6 +221,10 @@ public final class Gate implements IGate {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void readFromNBT(NBTTagCompound data) {
|
||||
readStatementsFromNBT(data);
|
||||
|
||||
for (PipeWire wire : PipeWire.VALUES) {
|
||||
broadcastSignal.set(wire.ordinal(), data.getBoolean("wireState[" + wire.ordinal() + "]"));
|
||||
|
|
106
common/buildcraft/transport/ItemGateCopier.java
Normal file
106
common/buildcraft/transport/ItemGateCopier.java
Normal file
|
@ -0,0 +1,106 @@
|
|||
package buildcraft.transport;
|
||||
|
||||
import net.minecraft.client.renderer.texture.IIconRegister;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.ChatComponentTranslation;
|
||||
import net.minecraft.util.IIcon;
|
||||
import net.minecraft.world.World;
|
||||
import cpw.mods.fml.relauncher.Side;
|
||||
import cpw.mods.fml.relauncher.SideOnly;
|
||||
import net.minecraftforge.common.util.ForgeDirection;
|
||||
import buildcraft.core.ItemBuildCraft;
|
||||
import buildcraft.core.utils.NBTUtils;
|
||||
import buildcraft.transport.gates.GateDefinition.GateMaterial;
|
||||
|
||||
public class ItemGateCopier extends ItemBuildCraft {
|
||||
|
||||
private IIcon[] icons;
|
||||
|
||||
public ItemGateCopier() {
|
||||
super();
|
||||
setMaxDamage(0);
|
||||
setMaxStackSize(1);
|
||||
setHasSubtypes(true);
|
||||
setUnlocalizedName("gateCopier");
|
||||
}
|
||||
|
||||
@Override
|
||||
public IIcon getIconFromDamage(int damage) {
|
||||
return icons[damage];
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) {
|
||||
if (world.isRemote) {
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean isCopying = !player.isSneaking();
|
||||
TileEntity tile = world.getTileEntity(x, y, z);
|
||||
NBTTagCompound data = NBTUtils.getItemData(stack);
|
||||
|
||||
if (tile == null || !(tile instanceof TileGenericPipe)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Gate gate = ((TileGenericPipe) tile).getGate(ForgeDirection.getOrientation(side));
|
||||
|
||||
if (isCopying) {
|
||||
if (gate == null) {
|
||||
stack.setItemDamage(0);
|
||||
stack.setTagCompound(null);
|
||||
player.addChatMessage(new ChatComponentTranslation("chat.gateCopier.clear"));
|
||||
return true;
|
||||
}
|
||||
|
||||
gate.writeStatementsToNBT(data);
|
||||
data.setByte("material", (byte) gate.material.ordinal());
|
||||
data.setByte("logic", (byte) gate.logic.ordinal());
|
||||
stack.setItemDamage(1);
|
||||
player.addChatMessage(new ChatComponentTranslation("chat.gateCopier.gateCopied"));
|
||||
} else {
|
||||
if (!data.hasKey("logic")) {
|
||||
player.addChatMessage(new ChatComponentTranslation("chat.gateCopier.noInformation"));
|
||||
return true;
|
||||
} else if (gate == null) {
|
||||
player.addChatMessage(new ChatComponentTranslation("chat.gateCopier.noGate"));
|
||||
return true;
|
||||
}
|
||||
|
||||
GateMaterial dataMaterial = GateMaterial.fromOrdinal(data.getByte("material"));
|
||||
GateMaterial gateMaterial = gate.material;
|
||||
|
||||
if (gateMaterial.numSlots < dataMaterial.numSlots) {
|
||||
player.addChatMessage(new ChatComponentTranslation("chat.gateCopier.warning.slots"));
|
||||
}
|
||||
if (gateMaterial.numActionParameters < dataMaterial.numActionParameters) {
|
||||
player.addChatMessage(new ChatComponentTranslation("chat.gateCopier.warning.actionParameters"));
|
||||
}
|
||||
if (gateMaterial.numTriggerParameters < dataMaterial.numTriggerParameters) {
|
||||
player.addChatMessage(new ChatComponentTranslation("chat.gateCopier.warning.triggerParameters"));
|
||||
}
|
||||
if (data.getByte("logic") != gate.logic.ordinal()) {
|
||||
player.addChatMessage(new ChatComponentTranslation("chat.gateCopier.warning.logic"));
|
||||
}
|
||||
|
||||
gate.readStatementsFromNBT(data);
|
||||
|
||||
player.addChatMessage(new ChatComponentTranslation("chat.gateCopier.gatePasted"));
|
||||
return true;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public void registerIcons(IIconRegister register) {
|
||||
icons = new IIcon[2];
|
||||
icons[0] = register.registerIcon("buildcraft:gate_copier_off");
|
||||
icons[1] = register.registerIcon("buildcraft:gate_copier_on");
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in a new issue