diff --git a/api/buildcraft/api/blueprints/BuildingPermission.java b/api/buildcraft/api/blueprints/BuildingPermission.java new file mode 100755 index 00000000..c325bff4 --- /dev/null +++ b/api/buildcraft/api/blueprints/BuildingPermission.java @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team + * http://www.mod-buildcraft.com + * + * BuildCraft is distributed under the terms of the Minecraft Mod Public + * License 1.0, or MMPL. Please check the contents of the license located in + * http://www.mod-buildcraft.com/MMPL-1.0.txt + */ +package buildcraft.api.blueprints; + +/** + * Schematics recorded in the blueprints can restrict situations where a + * blueprint can be used. A same schematic class can have different + * permissions depending on its contents. It's particularly useful when + * fixing a schematic, if blueprints that saved the previous version should + * not be built because of a bug (such as dupe bug on inventories). + */ +public enum BuildingPermission { + /** + * No restrictions, blueprints using this schematic are good in all + * contexts. + */ + ALL, + + /** + * This blueprints containing this schematic can only be used in + * creative. Maybe the block can't be crafted in survival in the first + * place, or the content of the schematic is known to have dupe bugs. + */ + CREATIVE_ONLY, + + /** + * Blueprints containing this schematic should not be built. This is + * typically used when a critical problems have been fixed, but older + * versions of the schematic are too badly broken to be retreived. + */ + NONE, +} \ No newline at end of file diff --git a/api/buildcraft/api/blueprints/Schematic.java b/api/buildcraft/api/blueprints/Schematic.java index 5fd148c5..c3a8eee2 100755 --- a/api/buildcraft/api/blueprints/Schematic.java +++ b/api/buildcraft/api/blueprints/Schematic.java @@ -261,4 +261,12 @@ public abstract class Schematic { public BuildingStage getBuildStage () { return BuildingStage.STANDALONE; } + + /** + * Return the building permission for blueprint containing this schematic. + * @return + */ + public BuildingPermission getBuildingPermission () { + return BuildingPermission.ALL; + } } diff --git a/api/buildcraft/api/blueprints/SchematicBlockBase.java b/api/buildcraft/api/blueprints/SchematicBlockBase.java index 9c8f8f49..c571f7e3 100755 --- a/api/buildcraft/api/blueprints/SchematicBlockBase.java +++ b/api/buildcraft/api/blueprints/SchematicBlockBase.java @@ -41,6 +41,7 @@ public abstract class SchematicBlockBase extends Schematic { /** * Return true if the block should not be placed to the world. Requirements * will not be asked on such a block, and building will not be called. + * Post processing will still be called on these blocks though. */ public boolean doNotBuild() { return false; diff --git a/buildcraft_resources/assets/buildcraft/lang/en_US.lang b/buildcraft_resources/assets/buildcraft/lang/en_US.lang index 21102245..13e9bedc 100755 --- a/buildcraft_resources/assets/buildcraft/lang/en_US.lang +++ b/buildcraft_resources/assets/buildcraft/lang/en_US.lang @@ -133,6 +133,8 @@ item.blueprintItem.name=Blueprint item.blueprint.unnamed= item.blueprint.author=by item.blueprint.blank=Blank +item.blueprint.creative_only=Creative Only +item.blueprint.no_build=No Building item.PipeItemsWood.name=Wooden Transport Pipe item.PipeItemsCobblestone.name=Cobblestone Transport Pipe item.PipeItemsStone.name=Stone Transport Pipe diff --git a/common/buildcraft/BuildCraftBuilders.java b/common/buildcraft/BuildCraftBuilders.java index 288bd4b6..5a254f3d 100644 --- a/common/buildcraft/BuildCraftBuilders.java +++ b/common/buildcraft/BuildCraftBuilders.java @@ -67,6 +67,7 @@ import buildcraft.builders.filler.pattern.PatternHorizon; import buildcraft.builders.filler.pattern.PatternPyramid; import buildcraft.builders.filler.pattern.PatternStairs; import buildcraft.builders.schematics.SchematicBed; +import buildcraft.builders.schematics.SchematicBlockCreative; import buildcraft.builders.schematics.SchematicCactus; import buildcraft.builders.schematics.SchematicCustomStack; import buildcraft.builders.schematics.SchematicDirt; @@ -93,6 +94,7 @@ import buildcraft.builders.schematics.SchematicSign; import buildcraft.builders.schematics.SchematicSkull; import buildcraft.builders.schematics.SchematicStairs; import buildcraft.builders.schematics.SchematicStone; +import buildcraft.builders.schematics.SchematicTileCreative; import buildcraft.builders.schematics.SchematicTripWireHook; import buildcraft.builders.schematics.SchematicWallSide; import buildcraft.builders.triggers.ActionFiller; @@ -279,6 +281,10 @@ public class BuildCraftBuilders extends BuildCraftMod { SchematicRegistry.registerSchematicBlock(Blocks.fire, SchematicFire.class); + SchematicRegistry.registerSchematicBlock(Blocks.bedrock, SchematicBlockCreative.class); + + SchematicRegistry.registerSchematicBlock(Blocks.mob_spawner, SchematicTileCreative.class); + // Standard entities SchematicRegistry.registerSchematicEntity(EntityMinecartEmpty.class, SchematicMinecart.class, Items.minecart); diff --git a/common/buildcraft/builders/ItemBlueprint.java b/common/buildcraft/builders/ItemBlueprint.java index 8612b421..74e417e9 100644 --- a/common/buildcraft/builders/ItemBlueprint.java +++ b/common/buildcraft/builders/ItemBlueprint.java @@ -14,6 +14,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import buildcraft.BuildCraftBuilders; +import buildcraft.api.blueprints.BuildingPermission; import buildcraft.builders.blueprints.BlueprintId; import buildcraft.core.CreativeTabBuildCraft; import buildcraft.core.ItemBuildCraft; @@ -46,6 +47,19 @@ public abstract class ItemBlueprint extends ItemBuildCraft { } else { list.add(StringUtils.localize("item.blueprint.blank")); } + + if (NBTUtils.getItemData(stack).hasKey("permission")) { + BuildingPermission p = BuildingPermission.values()[NBTUtils + .getItemData(stack).getByte("permission")]; + + if (p == BuildingPermission.CREATIVE_ONLY) { + list.add(String.format(StringUtils + .localize("item.blueprint.creative_only"))); + } else if (p == BuildingPermission.NONE) { + list.add(String.format(StringUtils + .localize("item.blueprint.no_build"))); + } + } } public static BlueprintId getId (ItemStack stack) { diff --git a/common/buildcraft/builders/TileBuilder.java b/common/buildcraft/builders/TileBuilder.java index 7d4e5875..ba5ad96d 100644 --- a/common/buildcraft/builders/TileBuilder.java +++ b/common/buildcraft/builders/TileBuilder.java @@ -22,6 +22,7 @@ import net.minecraft.world.WorldSettings.GameType; import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.ForgeDirection; import buildcraft.BuildCraftBuilders; +import buildcraft.api.blueprints.BuildingPermission; import buildcraft.api.blueprints.Translation; import buildcraft.api.core.NetworkData; import buildcraft.api.core.Position; @@ -287,6 +288,12 @@ public class TileBuilder extends TileAbstractBuilder implements IMachine { return null; } + if (bpt.buildingPermission == BuildingPermission.NONE + || (bpt.buildingPermission == BuildingPermission.CREATIVE_ONLY && worldObj + .getWorldInfo().getGameType() != GameType.CREATIVE)) { + return null; + } + BptContext context = bpt.getContext(worldObj, bpt.getBoxForPos(x, y, z)); if (bpt.rotate) { diff --git a/common/buildcraft/builders/schematics/SchematicBlockCreative.java b/common/buildcraft/builders/schematics/SchematicBlockCreative.java new file mode 100755 index 00000000..0d462ad8 --- /dev/null +++ b/common/buildcraft/builders/schematics/SchematicBlockCreative.java @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team + * http://www.mod-buildcraft.com + * + * BuildCraft is distributed under the terms of the Minecraft Mod Public + * License 1.0, or MMPL. Please check the contents of the license located in + * http://www.mod-buildcraft.com/MMPL-1.0.txt + */ +package buildcraft.builders.schematics; + +import buildcraft.api.blueprints.BuildingPermission; +import buildcraft.api.blueprints.SchematicBlock; + +public class SchematicBlockCreative extends SchematicBlock { + + @Override + public BuildingPermission getBuildingPermission () { + return BuildingPermission.CREATIVE_ONLY; + } + +} diff --git a/common/buildcraft/builders/schematics/SchematicTileCreative.java b/common/buildcraft/builders/schematics/SchematicTileCreative.java new file mode 100755 index 00000000..383be2a8 --- /dev/null +++ b/common/buildcraft/builders/schematics/SchematicTileCreative.java @@ -0,0 +1,21 @@ +/** + * Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team + * http://www.mod-buildcraft.com + * + * BuildCraft is distributed under the terms of the Minecraft Mod Public + * License 1.0, or MMPL. Please check the contents of the license located in + * http://www.mod-buildcraft.com/MMPL-1.0.txt + */ +package buildcraft.builders.schematics; + +import buildcraft.api.blueprints.BuildingPermission; +import buildcraft.api.blueprints.SchematicTile; + +public class SchematicTileCreative extends SchematicTile { + + @Override + public BuildingPermission getBuildingPermission () { + return BuildingPermission.CREATIVE_ONLY; + } + +} diff --git a/common/buildcraft/core/blueprints/Blueprint.java b/common/buildcraft/core/blueprints/Blueprint.java index f92cbedc..f1fbd7f4 100644 --- a/common/buildcraft/core/blueprints/Blueprint.java +++ b/common/buildcraft/core/blueprints/Blueprint.java @@ -18,6 +18,7 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.Constants; import buildcraft.BuildCraftBuilders; +import buildcraft.api.blueprints.BuildingPermission; import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.SchematicBlock; import buildcraft.api.blueprints.SchematicEntity; @@ -99,6 +100,19 @@ public class Blueprint extends BlueprintBase { t.printStackTrace(); BCLog.logger.throwing("BptBlueprint", "readFromWorld", t); } + + switch (slot.getBuildingPermission()) { + case ALL: + break; + case CREATIVE_ONLY: + if (buildingPermission == BuildingPermission.ALL) { + buildingPermission = BuildingPermission.CREATIVE_ONLY; + } + break; + case NONE: + buildingPermission = BuildingPermission.NONE; + break; + } } @Override @@ -179,6 +193,19 @@ public class Blueprint extends BlueprintBase { contents[x][y][z] = SchematicRegistry.newSchematicBlock(mapping.getBlockForId(blockId)); contents[x][y][z].readFromNBT(cpt, mapping); + + switch (contents[x][y][z].getBuildingPermission()) { + case ALL: + break; + case CREATIVE_ONLY: + if (buildingPermission == BuildingPermission.ALL) { + buildingPermission = BuildingPermission.CREATIVE_ONLY; + } + break; + case NONE: + buildingPermission = BuildingPermission.NONE; + break; + } } else { contents[x][y][z] = null; } @@ -208,6 +235,7 @@ public class Blueprint extends BlueprintBase { id.write (nbt); nbt.setString("author", author); nbt.setString("name", id.name); + nbt.setByte ("permission", (byte) buildingPermission.ordinal()); return stack; } diff --git a/common/buildcraft/core/blueprints/BlueprintBase.java b/common/buildcraft/core/blueprints/BlueprintBase.java index a72236e9..dec02cc7 100644 --- a/common/buildcraft/core/blueprints/BlueprintBase.java +++ b/common/buildcraft/core/blueprints/BlueprintBase.java @@ -15,6 +15,7 @@ import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import buildcraft.api.blueprints.BuildingPermission; import buildcraft.api.blueprints.IBuilderContext; import buildcraft.api.blueprints.MappingRegistry; import buildcraft.api.blueprints.SchematicBlockBase; @@ -35,6 +36,7 @@ public abstract class BlueprintBase { protected MappingRegistry mapping = new MappingRegistry(); public boolean rotate = true; public boolean excavate = true; + public BuildingPermission buildingPermission = BuildingPermission.ALL; private byte [] data;