diff --git a/src/main/java/ellpeck/actuallyadditions/booklet/InitBooklet.java b/src/main/java/ellpeck/actuallyadditions/booklet/InitBooklet.java index ff45845fa..45379e3bc 100644 --- a/src/main/java/ellpeck/actuallyadditions/booklet/InitBooklet.java +++ b/src/main/java/ellpeck/actuallyadditions/booklet/InitBooklet.java @@ -56,12 +56,12 @@ public class InitBooklet{ //Getting Started chapterIntro = new BookletChapter("intro", entryGettingStarted, new ItemStack(InitItems.itemLexicon), new PageTextOnly(1), new PageTextOnly(2), new PageTextOnly(3)); new BookletChapter("bookTutorial", entryGettingStarted, new ItemStack(InitItems.itemLexicon), new PageTextOnly(1), new PageTextOnly(2), new PageCrafting(3, ItemCrafting.recipeBook)); - new BookletChapterReconstructor("crystals", entryGettingStarted, new ItemStack(InitBlocks.blockAtomicReconstructor), new PageTextOnly(1).addTextReplacement("", ConfigIntValues.RECONSTRUCTOR_BASE_ENERGY_USE.getValue()), new PageTextOnly(2), new PagePicture(3, "pageAtomicReconstructor", 0).setNoText(), new PageTextOnly(4), new PageCrafting(5, BlockCrafting.recipeAtomicReconstructor).setNoText(), new PageCrafting(6, ItemCrafting.recipeLens).setNoText(), new PageReconstructor(7, ReconstructorRecipeHandler.recipeColorLens).setNoText()).setSpecial(); + new BookletChapterReconstructor("crystals", entryGettingStarted, new ItemStack(InitBlocks.blockAtomicReconstructor), new PageTextOnly(1).addTextReplacement("", ConfigIntValues.RECONSTRUCTOR_BASE_ENERGY_USE.getValue()), new PageTextOnly(2), new PagePicture(3, "pageAtomicReconstructor", 0).setNoText(), new PageTextOnly(4), new PageCrafting(5, BlockCrafting.recipeAtomicReconstructor).setNoText(), new PageCrafting(6, ItemCrafting.recipeLens).setNoText()).setSpecial(); new BookletChapter("coalGen", entryGettingStarted, new ItemStack(InitBlocks.blockCoalGenerator), new PageCrafting(1, BlockCrafting.recipeCoalGen).addTextReplacement("", ConfigIntValues.COAL_GEN_ENERGY_PRODUCED.getValue())); new BookletChapter("craftingIngs", entryGettingStarted, new ItemStack(InitItems.itemMisc, 1, TheMiscItems.COIL.ordinal()), new PageTextOnly(1), new PageCrafting(2, ItemCrafting.recipeCoil).setNoText(), new PageCrafting(3, ItemCrafting.recipeCoilAdvanced).setNoText(), new PageCrafting(4, BlockCrafting.recipeCase).setNoText(), new PageCrafting(5, BlockCrafting.recipeStoneCase).setNoText(), new PageCrafting(6, BlockCrafting.recipeEnderPearlBlock).setNoText(), new PageCrafting(7, BlockCrafting.recipeEnderCase).setNoText(), new PageCrafting(8, ItemCrafting.recipeRing).setNoText(), new PageCrafting(9, ItemCrafting.recipeKnifeHandle).setNoText(), new PageCrafting(10, ItemCrafting.recipeKnifeBlade).setNoText(), new PageCrafting(11, ItemCrafting.recipeKnife).setNoText(), new PageCrafting(12, ItemCrafting.recipeDough).setNoText(), new PageCrafting(13, ItemCrafting.recipeRiceDough).setNoText(), new PageCrafting(14, BlockCrafting.recipeIronCase).setNoText()).setImportant(); //Miscellaneous - new BookletChapter("miscReconstructor", entryMisc, new ItemStack(InitBlocks.blockTestifiBucksWhiteWall), new PageTextOnly(1), new PageReconstructor(2, ReconstructorRecipeHandler.recipeSoulSand).setNoText(), new PageReconstructor(3, ReconstructorRecipeHandler.recipeWhiteWall), new PageReconstructor(4, ReconstructorRecipeHandler.recipeGreenWall).setNoText(), new PageReconstructor(5, ReconstructorRecipeHandler.colorConversionRecipes)).setImportant(); + new BookletChapter("miscReconstructor", entryMisc, new ItemStack(InitBlocks.blockTestifiBucksWhiteWall), new PageTextOnly(1), new PageReconstructor(2, ReconstructorRecipeHandler.recipeExplosionLens), new PageReconstructor(3, ReconstructorRecipeHandler.recipeColorLens).setNoText(), new PageReconstructor(4, ReconstructorRecipeHandler.recipeSoulSand).setNoText(), new PageReconstructor(5, ReconstructorRecipeHandler.recipeWhiteWall), new PageReconstructor(6, ReconstructorRecipeHandler.recipeGreenWall).setNoText(), new PageReconstructor(7, ReconstructorRecipeHandler.colorConversionRecipes)).setImportant(); new BookletChapter("bookStand", entryMisc, new ItemStack(InitBlocks.blockBookletStand), new PageTextOnly(1), new PageCrafting(2, BlockCrafting.recipeBookStand)); new BookletChapter("quartz", entryMisc, new ItemStack(InitItems.itemMisc, 1, TheMiscItems.QUARTZ.ordinal()), new PageTextOnly(1).setStack(new ItemStack(InitBlocks.blockMisc, 1, TheMiscBlocks.ORE_QUARTZ.ordinal())).addTextReplacement("", ConfigIntValues.BLACK_QUARTZ_MIN_HEIGHT.getValue()).addTextReplacement("", ConfigIntValues.BLACK_QUARTZ_MAX_HEIGHT.getValue()), new PageTextOnly(2).setStack(new ItemStack(InitItems.itemMisc, 1, TheMiscItems.QUARTZ.ordinal())), new PageCrafting(3, BlockCrafting.recipeQuartzBlock).setNoText(), new PageCrafting(4, BlockCrafting.recipeQuartzPillar).setNoText(), new PageCrafting(5, BlockCrafting.recipeQuartzChiseled).setNoText()); new BookletChapter("cloud", entryMisc, new ItemStack(InitBlocks.blockSmileyCloud), new PageTextOnly(1), new PageCrafting(2, BlockCrafting.recipeSmileyCloud).setNoText()).setSpecial(); diff --git a/src/main/java/ellpeck/actuallyadditions/communication/InterModCommunications.java b/src/main/java/ellpeck/actuallyadditions/communication/InterModCommunications.java index 102cb1625..ce647a5d5 100644 --- a/src/main/java/ellpeck/actuallyadditions/communication/InterModCommunications.java +++ b/src/main/java/ellpeck/actuallyadditions/communication/InterModCommunications.java @@ -111,8 +111,14 @@ public class InterModCommunications{ int lensType = compound.getInteger("lensType"); if(ReconstructorRecipeHandler.LensType.values().length > lensType && input != null && output != null){ - ReconstructorRecipeHandler.addRecipe(input, output, energyUse, ReconstructorRecipeHandler.LensType.values()[lensType]); - ModUtil.LOGGER.info("Reconstructor Recipe that was sent from Mod "+message.getSender()+" has been registered successfully: "+input+" -> "+output+" @ "+energyUse+" with LensType "+lensType); + ReconstructorRecipeHandler.LensType type = ReconstructorRecipeHandler.LensType.values()[lensType]; + if(type.canAddRecipesFor){ + ReconstructorRecipeHandler.addRecipe(input, output, energyUse, type); + ModUtil.LOGGER.info("Reconstructor Recipe that was sent from Mod "+message.getSender()+" has been registered successfully: "+input+" -> "+output+" @ "+energyUse+" with LensType "+lensType); + } + else{ + ModUtil.LOGGER.error("Reconstructor Recipe that was sent from Mod "+message.getSender()+" could not be registered: It's trying to register for a Lens Type ("+lensType+") that can't have recipes added!"); + } } else{ ModUtil.LOGGER.error("Reconstructor Recipe that was sent from Mod "+message.getSender()+" could not be registered: It's missing an Output, an Input or a LensType!"); diff --git a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java index 2490f6af3..ff40f2588 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java +++ b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java @@ -131,6 +131,7 @@ public class InitItems{ public static Item itemLaserWrench; public static Item itemCrystal; public static Item itemColorLens; + public static Item itemExplosionLens; public static void init(){ ModUtil.LOGGER.info("Initializing Items..."); @@ -138,6 +139,9 @@ public class InitItems{ itemColorLens = new ItemLens("itemColorLens", ReconstructorRecipeHandler.LensType.COLOR); ItemUtil.register(itemColorLens); + itemExplosionLens = new ItemLens("itemExplosionLens", ReconstructorRecipeHandler.LensType.DETONATION); + ItemUtil.register(itemExplosionLens); + itemCrystal = new ItemCrystal(); ItemUtil.register(itemCrystal); diff --git a/src/main/java/ellpeck/actuallyadditions/ore/InitOreDict.java b/src/main/java/ellpeck/actuallyadditions/ore/InitOreDict.java index 2357996bd..1e12b6b2f 100644 --- a/src/main/java/ellpeck/actuallyadditions/ore/InitOreDict.java +++ b/src/main/java/ellpeck/actuallyadditions/ore/InitOreDict.java @@ -117,6 +117,7 @@ public class InitOreDict{ addOre(InitBlocks.blockTestifiBucksGreenWall, "blockGreenBrick"); addOre(InitItems.itemColorLens, "itemColorLens"); + addOre(InitItems.itemExplosionLens, "itemExplosionLens"); addOre(InitItems.itemMisc, TheMiscItems.LENS.ordinal(), "itemLens"); } diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/ReconstructorRecipeHandler.java b/src/main/java/ellpeck/actuallyadditions/recipe/ReconstructorRecipeHandler.java index 290b26a2f..0a4cda56d 100644 --- a/src/main/java/ellpeck/actuallyadditions/recipe/ReconstructorRecipeHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/recipe/ReconstructorRecipeHandler.java @@ -12,6 +12,7 @@ package ellpeck.actuallyadditions.recipe; import ellpeck.actuallyadditions.blocks.metalists.TheColoredLampColors; import ellpeck.actuallyadditions.config.values.ConfigCrafting; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.util.AssetUtil; import ellpeck.actuallyadditions.util.Util; import net.minecraft.item.Item; @@ -31,6 +32,7 @@ public class ReconstructorRecipeHandler{ public static Recipe recipeSoulSand; public static Recipe recipeGreenWall; public static Recipe recipeWhiteWall; + public static Recipe recipeExplosionLens; public static ArrayList colorConversionRecipes = new ArrayList(); public static void init(){ @@ -64,8 +66,10 @@ public class ReconstructorRecipeHandler{ //Lenses addRecipe("itemLens", "itemColorLens", 5000); - addRecipe("itemColorLens", "itemLens", 5000); recipeColorLens = Util.GetRecipes.lastReconstructorRecipe(); + addRecipe("itemColorLens", "itemExplosionLens", 5000); + recipeExplosionLens = Util.GetRecipes.lastReconstructorRecipe(); + addRecipe("itemExplosionLens", "itemLens", 5000); //Misc if(ConfigCrafting.RECONSTRUCTOR_MISC.isEnabled()){ @@ -103,7 +107,9 @@ public class ReconstructorRecipeHandler{ } public static void addRecipe(String input, String output, int energyUse, LensType type){ - recipes.add(new Recipe(input, output, energyUse, type)); + if(type.canAddRecipesFor){ + recipes.add(new Recipe(input, output, energyUse, type)); + } } public static ArrayList getRecipes(ItemStack input){ @@ -146,22 +152,35 @@ public class ReconstructorRecipeHandler{ public enum LensType{ - NONE, - COLOR; + NONE(true), + COLOR(true), + DETONATION(false); public ItemStack lens; + public boolean canAddRecipesFor; + + LensType(boolean canAddRecipesFor){ + this.canAddRecipesFor = canAddRecipesFor; + } public float[] getColor(){ if(this == COLOR){ float[] colors = AssetUtil.RGB_WOOL_COLORS[Util.RANDOM.nextInt(AssetUtil.RGB_WOOL_COLORS.length)]; return new float[]{colors[0]/255F, colors[1]/255F, colors[2]/255F}; } - return new float[]{27F/255F, 109F/255F, 1F}; + else if(this == DETONATION){ + return new float[]{158F/255F, 43F/255F, 39F/255F}; + } + else return new float[]{27F/255F, 109F/255F, 1F}; } public void setLens(Item lens){ this.lens = new ItemStack(lens); } + + public int getDistance(){ + return ConfigIntValues.RECONSTRUCTOR_DISTANCE.getValue()*(this == DETONATION ? 3 : 1); + } } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityAtomicReconstructor.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityAtomicReconstructor.java index d69c5035f..5bb282227 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityAtomicReconstructor.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityAtomicReconstructor.java @@ -55,76 +55,89 @@ public class TileEntityAtomicReconstructor extends TileEntityInventoryBase imple ForgeDirection sideToManipulate = ForgeDirection.getOrientation(worldObj.getBlockMetadata(xCoord, yCoord, zCoord)); //Extract energy for shooting the laser itself too! this.storage.extractEnergy(baseUse, false); + if(this.storage.getEnergyStored() >= baseUse){ - //The Lens the Reconstructor currently has installed - ReconstructorRecipeHandler.LensType currentLens = this.getCurrentLens(); - int distance = ConfigIntValues.RECONSTRUCTOR_DISTANCE.getValue(); - for(int i = 0; i < distance; i++){ - WorldPos coordsBlock = WorldUtil.getCoordsFromSide(sideToManipulate, worldObj, xCoord, yCoord, zCoord, i); - this.damagePlayer(coordsBlock.getX(), coordsBlock.getY(), coordsBlock.getZ()); + //The Lens the Reconstructor currently has installed + ReconstructorRecipeHandler.LensType currentLens = this.getCurrentLens(); + int distance = currentLens.getDistance(); + for(int i = 0; i < distance; i++){ + WorldPos hitBlock = WorldUtil.getCoordsFromSide(sideToManipulate, worldObj, xCoord, yCoord, zCoord, i); + this.damagePlayer(hitBlock.getX(), hitBlock.getY(), hitBlock.getZ()); - if(coordsBlock != null){ - if(!coordsBlock.getBlock().isAir(coordsBlock.getWorld(), coordsBlock.getX(), coordsBlock.getY(), coordsBlock.getZ())){ - PacketHandler.theNetwork.sendToAllAround(new PacketAtomicReconstructor(xCoord, yCoord, zCoord, coordsBlock.getX(), coordsBlock.getY(), coordsBlock.getZ(), currentLens), new NetworkRegistry.TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 64)); + if(hitBlock != null){ + if(!hitBlock.getBlock().isAir(hitBlock.getWorld(), hitBlock.getX(), hitBlock.getY(), hitBlock.getZ())){ + this.shootLaser(hitBlock.getX(), hitBlock.getY(), hitBlock.getZ(), currentLens); - int range = ConfigIntValues.RECONSTRCUTOR_RANGE.getValue(); + //Detonation + if(currentLens == ReconstructorRecipeHandler.LensType.DETONATION){ + int use = baseUse+800000; + if(this.storage.getEnergyStored() >= use){ + this.worldObj.newExplosion(null, hitBlock.getX()+0.5, hitBlock.getY()+0.5, hitBlock.getZ()+0.5, 8F, true, true); + this.storage.extractEnergy(use, false); + } + } + //Conversion Recipes + else{ + int range = ConfigIntValues.RECONSTRCUTOR_RANGE.getValue(); - //Converting the Blocks - for(int reachX = -range; reachX < range+1; reachX++){ - for(int reachZ = -range; reachZ < range+1; reachZ++){ - for(int reachY = -range; reachY < range+1; reachY++){ + //Converting the Blocks + for(int reachX = -range; reachX < range+1; reachX++){ + for(int reachZ = -range; reachZ < range+1; reachZ++){ + for(int reachY = -range; reachY < range+1; reachY++){ + if(this.storage.getEnergyStored() >= baseUse){ + WorldPos pos = new WorldPos(worldObj, hitBlock.getX()+reachX, hitBlock.getY()+reachY, hitBlock.getZ()+reachZ); + ArrayList recipes = ReconstructorRecipeHandler.getRecipes(new ItemStack(pos.getBlock(), 1, pos.getMetadata())); + for(ReconstructorRecipeHandler.Recipe recipe : recipes){ + if(recipe != null && this.storage.getEnergyStored() >= baseUse+recipe.energyUse && recipe.type == currentLens){ + ItemStack output = recipe.getFirstOutput(); + if(output != null){ + if(output.getItem() instanceof ItemBlock){ + this.worldObj.playAuxSFX(2001, pos.getX(), pos.getY(), pos.getZ(), Block.getIdFromBlock(pos.getBlock())+(pos.getMetadata() << 12)); + pos.setBlock(Block.getBlockFromItem(output.getItem()), output.getItemDamage(), 2); + } + else{ + EntityItem item = new EntityItem(worldObj, pos.getX()+0.5, pos.getY()+0.5, pos.getZ()+0.5, output.copy()); + worldObj.spawnEntityInWorld(item); + } + this.storage.extractEnergy(baseUse+recipe.energyUse, false); + break; + } + } + } + } + } + } + } + + //Converting the Items + ArrayList items = (ArrayList)worldObj.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(hitBlock.getX()-range, hitBlock.getY()-range, hitBlock.getZ()-range, hitBlock.getX()+range, hitBlock.getY()+range, hitBlock.getZ()+range)); + for(EntityItem item : items){ if(this.storage.getEnergyStored() >= baseUse){ - WorldPos pos = new WorldPos(worldObj, coordsBlock.getX()+reachX, coordsBlock.getY()+reachY, coordsBlock.getZ()+reachZ); - ArrayList recipes = ReconstructorRecipeHandler.getRecipes(new ItemStack(pos.getBlock(), 1, pos.getMetadata())); - for(ReconstructorRecipeHandler.Recipe recipe : recipes){ - if(recipe != null && this.storage.getEnergyStored() >= baseUse+recipe.energyUse && recipe.type == currentLens){ - ItemStack output = recipe.getFirstOutput(); - if(output != null){ - if(output.getItem() instanceof ItemBlock){ - this.worldObj.playAuxSFX(2001, pos.getX(), pos.getY(), pos.getZ(), Block.getIdFromBlock(pos.getBlock())+(pos.getMetadata() << 12)); - pos.setBlock(Block.getBlockFromItem(output.getItem()), output.getItemDamage(), 2); + ItemStack stack = item.getEntityItem(); + if(stack != null){ + ArrayList recipes = ReconstructorRecipeHandler.getRecipes(stack); + for(ReconstructorRecipeHandler.Recipe recipe : recipes){ + if(recipe != null && this.storage.getEnergyStored() >= baseUse+recipe.energyUse && recipe.type == currentLens){ + ItemStack output = recipe.getFirstOutput(); + if(output != null){ + ItemStack outputCopy = output.copy(); + outputCopy.stackSize = stack.stackSize; + item.setEntityItemStack(outputCopy); + + this.storage.extractEnergy(baseUse+recipe.energyUse, false); + break; } - else{ - EntityItem item = new EntityItem(worldObj, pos.getX()+0.5, pos.getY()+0.5, pos.getZ()+0.5, output.copy()); - worldObj.spawnEntityInWorld(item); - } - this.storage.extractEnergy(baseUse+recipe.energyUse, false); - break; } } } } } } + break; } - - //Converting the Items - ArrayList items = (ArrayList)worldObj.getEntitiesWithinAABB(EntityItem.class, AxisAlignedBB.getBoundingBox(coordsBlock.getX()-range, coordsBlock.getY()-range, coordsBlock.getZ()-range, coordsBlock.getX()+range, coordsBlock.getY()+range, coordsBlock.getZ()+range)); - for(EntityItem item : items){ - if(this.storage.getEnergyStored() >= baseUse){ - ItemStack stack = item.getEntityItem(); - if(stack != null){ - ArrayList recipes = ReconstructorRecipeHandler.getRecipes(stack); - for(ReconstructorRecipeHandler.Recipe recipe : recipes){ - if(recipe != null && this.storage.getEnergyStored() >= baseUse+recipe.energyUse && recipe.type == currentLens){ - ItemStack output = recipe.getFirstOutput(); - if(output != null){ - ItemStack outputCopy = output.copy(); - outputCopy.stackSize = stack.stackSize; - item.setEntityItemStack(outputCopy); - - this.storage.extractEnergy(baseUse+recipe.energyUse, false); - break; - } - } - } - } - } + else if(i >= distance-1){ + this.shootLaser(hitBlock.getX(), hitBlock.getY(), hitBlock.getZ(), currentLens); } - break; - } - if(i >= distance-1){ - PacketHandler.theNetwork.sendToAllAround(new PacketAtomicReconstructor(xCoord, yCoord, zCoord, coordsBlock.getX(), coordsBlock.getY(), coordsBlock.getZ(), currentLens), new NetworkRegistry.TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 64)); } } } @@ -137,6 +150,10 @@ public class TileEntityAtomicReconstructor extends TileEntityInventoryBase imple } } + private void shootLaser(int endX, int endY, int endZ, ReconstructorRecipeHandler.LensType currentLens){ + PacketHandler.theNetwork.sendToAllAround(new PacketAtomicReconstructor(xCoord, yCoord, zCoord, endX, endY, endZ, currentLens), new NetworkRegistry.TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 64)); + } + public ReconstructorRecipeHandler.LensType getCurrentLens(){ if(this.slots[0] != null){ if(this.slots[0].getItem() instanceof IReconstructorLens){ diff --git a/src/main/resources/assets/actuallyadditions/lang/en_US.lang b/src/main/resources/assets/actuallyadditions/lang/en_US.lang index 8f0792688..15505651e 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_US.lang +++ b/src/main/resources/assets/actuallyadditions/lang/en_US.lang @@ -308,7 +308,8 @@ item.actuallyadditions.itemCrystalGreen.name=Emeradic Crystal item.actuallyadditions.itemCrystalBlack.name=Void Crystal item.actuallyadditions.itemCrystalWhite.name=Enori Crystal item.actuallyadditions.itemMiscLens.name=Lens -item.actuallyadditions.itemColorLens.name=Lens: Color +item.actuallyadditions.itemColorLens.name=Lens of Color +item.actuallyadditions.itemExplosionLens.name=Lens of Detonation #Tooltips tooltip.actuallyadditions.onSuffix.desc=On @@ -612,8 +613,9 @@ booklet.actuallyadditions.chapter.bookTutorial.text.3=If you, for some reason, w booklet.actuallyadditions.chapter.miscReconstructor.name=Useful Reconstructor Recipes booklet.actuallyadditions.chapter.miscReconstructor.text.1=There are some additional recipes for the Atomic Reconstructor that could be very useful to you. These include decor blocks and items as well as some useful conversions. Flip through the following pages to see them all. -booklet.actuallyadditions.chapter.miscReconstructor.text.3=The Ethetic Quartz Blocks are Quartz Blocks spruced up. They can be crafted into stairs, slabs and walls with the same recipes as cobblestone has. No, not misspelled -booklet.actuallyadditions.chapter.miscReconstructor.text.5=By firing at Wool, Stained Clay, Stained Glass and Dye with a Lens: Color multiple times, you can cycle through all of their colors. +booklet.actuallyadditions.chapter.miscReconstructor.text.2=The Lens of Detonation, when put into the Reconstructor, will fire out a red laser that will cause a firey explosion around the block it hits, using a lot of power in the process. Be careful. Seriously. +booklet.actuallyadditions.chapter.miscReconstructor.text.5=The Ethetic Quartz Blocks are Quartz Blocks spruced up. They can be crafted into stairs, slabs and walls with the same recipes as cobblestone has. No, not misspelled +booklet.actuallyadditions.chapter.miscReconstructor.text.7=By firing at Wool, Stained Clay, Stained Glass and Dye with a Lens of Color multiple times, you can cycle through all of their colors. booklet.actuallyadditions.chapter.bookStand.name=Manual Stand booklet.actuallyadditions.chapter.bookStand.text.1=The Manual Stand is a block that is supposed to mainly be used on Servers. You can, provided you are the person who placed it down, set a page in the GUI that will open when someone else accesses it by pressing the "Set Page"-button while being on the desired page. The Manual Stand does not save pages another player navigated to, meaing re-accessing the Stand will cause it to always end up on the page speficied by the placer.