add gate copiers, close #2081

This commit is contained in:
asiekierka 2014-10-25 22:22:25 +02:00
parent 64c263c1cb
commit 59686cd481
4 changed files with 152 additions and 35 deletions

View file

@ -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);
}

View file

@ -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

View file

@ -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() + "]"));

View 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");
}
}