<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://www.computercraft.info/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lyqyd</id>
		<title>ComputerCraft Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://www.computercraft.info/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Lyqyd"/>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/Special:Contributions/Lyqyd"/>
		<updated>2026-07-11T00:48:55Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.24.1</generator>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=OpenCCSensors&amp;diff=7240</id>
		<title>OpenCCSensors</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=OpenCCSensors&amp;diff=7240"/>
				<updated>2015-09-12T03:12:58Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Update description of target keys.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.computercraft.info/forums2/index.php?/topic/5996-144-cc-147-openccsensors/ OpenCCSensors] is a new, open-source, up to date replacement for [[CcSensors|CcSensors (outdated)]], allowing monitoring and gathering information from the Minecraft environment - including players, entities, proximity, world info, IndustrialCraft 2, BuildCraft 2, liquids, inventories - and more!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OpenCCSensors comes with its own API, and automatically installs a new program for you at /ocs/programs/sensorview. sensorview is a handy program for very quickly looking at the information gathered from your sensors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Forum thread and download: [http://www.computercraft.info/forums2/index.php?/topic/5996-144-cc-147-openccsensors/ OpenCCSensors]&lt;br /&gt;
&lt;br /&gt;
http://www.youtube.com/watch?v=i8Bv7uKkIOM&amp;amp;feature=youtu.be&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: solid 1px black; margin: 2px; border-spacing: 0px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;font-weight: bold; font-size: large; padding-bottom: .3em; border-bottom: solid #C9C9C9 1px; background: #D3FFC2; line-height:28px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Grid_disk.png|24px]]&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
OpenCCSensors Peripherals&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;width: 350px; background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Name&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Description&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Sensor Peripheral&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Sensor Peripheral needs to be placed next to a computer and it has a single slot to insert a Sensor Card&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Obsidian |B1=Obsidian           |C1=Obsidian&lt;br /&gt;
 |A2=Redstone |B2=Obsidian        |C2=Redstone&lt;br /&gt;
 |A3=Stone |B3=Stone      |C3=Stone&lt;br /&gt;
 |Output=Sensor Peripheral&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
	&amp;lt;table style=&amp;quot;width: 100%; border-spacing: 0px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;os.loadAPI(&amp;quot;ocs/apis/sensor&amp;quot;)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Load the sensor API&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;mySensor = sensor.wrap(side)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Returns the wrapped sensor on the side specified.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;mySensor.getTargets()&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Returns a a table of all the targets for mySensor, where the keys are usually strings (either an entity name or a relative coordinate for blocks), and the values are each a table of basic details.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;mySensor.getTargetDetails(key)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Returns a table of full details for that particular target from the sensor mySensor - where the the &amp;quot;key&amp;quot; is the key returned from getTargets()&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/table&amp;gt;&lt;br /&gt;
 &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Gauge Peripheral&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Gauge Peripheral can be placed onto the side of certain machines to get instant readings from them. Right now this only supports Batboxes, MFE's, MFSU, Mass fabricators and Nuclear reactors. We hope to expand this in the future as well as offer an API to re-program the gauge from a computer.&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=glass_pane |B1=Redstone           |C1=Monitor&lt;br /&gt;
 |Output=Gauge Peripheral&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: solid 1px black; margin: 2px; border-spacing: 0px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;font-weight: bold; font-size: large; padding-bottom: .3em; border-bottom: solid #C9C9C9 1px; background: #D3FFC2; line-height:28px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Grid_disk.png|24px]]&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
OpenCCSensors Blocks&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;width: 350px; background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Name&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Description&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Proximity Sensor Block&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This block outputs a redstone signal if players/mobs are within 16 blocks. The strength of the signal depends on how close the entity is to the block.&lt;br /&gt;
&lt;br /&gt;
This block has 3 different modes: &amp;quot;Any Living Entity&amp;quot;, &amp;quot;Any Player&amp;quot; or &amp;quot;Owner Only&amp;quot;. To switch between modes, the owner of the block must right click on the block.&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1= |B1= |C1=&lt;br /&gt;
 |A2=Comparator |B2=Proximity Sensor Card MKIV |C2=Comparator&lt;br /&gt;
 |A3=Redstone |B3=Block of Iron      |C3=Redstone &lt;br /&gt;
 |Output=Proximity Sensor Block&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 |B2-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: solid 1px black; margin: 2px; border-spacing: 0px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;font-weight: bold; font-size: large; padding-bottom: .3em; border-bottom: solid #C9C9C9 1px; background: #D3FFC2; line-height:28px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Grid_disk.png|24px]]&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
OpenCCSensors Sensor Cards&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;width: 350px; background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Name&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Description&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Inventory Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Inventory Sensor Card is capable of reading inventories of any chests or machines around the sensor. It gives full information about what item is in each slot.&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=chest           |C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Inventory Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Proximity Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Proximity Sensor Card is capable of detecting players and entities within it's range.&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=pressure_plate           |C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Proximity Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Machine Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Machine Sensor Card can read information from IC2 devices. &lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=Redstone           |C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Buildcraft Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Power Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Power Sensor Card can read power information from IC2 and Applied Energistics devices. &lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=Coal           |C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Power Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Tank Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Tank sensor card is far more powerful than it first seems. This card not only reads actual tanks, but reads internal tanks within a variety of different machines, such as:&lt;br /&gt;
&lt;br /&gt;
Railcraft: Iron Tanks, Buildcraft: Tanks, Thermal Expansion: Aqueous Accumulator, Thermal Expansion: Igneous Extruder, Thermal Expansion: Glacial Precipitator, Thermal Expansion: Liquid Transposer, Thermal Expansion: Magma Crucible, Thermal Expansion: Magmatic Engine, Thermal Expansion: Steam Engine, Industrial Craft: Geothermal Generator, Thaumcraft: Crucible, Buildcraft: Tank, Buildcraft: Combustion Engine, Buildcraft: Pump, Buildcraft: Refinery, Forestry: Biogas Engine, Forestry: Fermenter, Forestry: Still, Forestry: Bottler, Forestry: Raintank, Forestry: Bio Generator, Forestry: Carpenter, Forestry: Moistener, Forestry: Squeezer, Forestry: Thermonic Fabricator, Extra Bees: Analyser, Extra Bees: Purifier, Extra Bees: Synthesizer, Extra Bees: Genepool, Extra Bees: Splicer, Railcraft: Hobbyist's Steam Engine, Railcraft: Commercial Steam Engine, Railcraft: Industrial Steam Engine, GregTech: Quantum Tank, GregTech: Thermal Generator&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=Bucket |C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Liquid Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;World Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The World Sensor Card is able to tell the time, weather, and more about the world.&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=ender_pearl |C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=World Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Dropped Item Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Dropped Item Sensor Card is able to locate and identify dropped items.&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=slime_ball |C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Dropped Item Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Sign Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Sign Sensor Card is capable of reading signs within it's range.&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=sign|C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Sign Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Minecart Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Minecart Sensor Card can detect minecarts in the area and give basic information about them&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=Minecart|C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Minecart Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Sonic Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Sonic Sensor Card can detect blocks in the area and report if they're solid or liquid. &lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=Jukebox|C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Sonic Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Crop Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The crop sensor card can detect the growth status of crops within range. IndustrialCraft2 crops are also supported (+extra!)&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=Wheat|C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Crop Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: solid 1px black; margin: 2px; border-spacing: 0px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;font-weight: bold; font-size: large; padding-bottom: .3em; border-bottom: solid #C9C9C9 1px; background: #D3FFC2; line-height:28px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Grid_disk.png|24px]]&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
OpenCCSensors Sensor Card Upgrades&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;width: 350px; background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Name&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Description&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Range Extension Antenna&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Range Extension Antenna is used to upgrade sensor cards to Mk1, Mk2, and Mk3. &lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |B1=redstone_torch           &lt;br /&gt;
 |A2=stone |B2=Redstone        |C2=stone&lt;br /&gt;
 |A3=stone |B3=iron_ingot      |C3=stone&lt;br /&gt;
 |Output=Range Extension Antenna&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Signal Amplifier&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Signal Amplifier is used to upgrade sensor cards to Mk3 and Mk4. &lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=stone |B1=Gold_Ingot|C1=stone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=stone |B3=Gold_Ingot     |C3=stone&lt;br /&gt;
 |Output=Signal Amplifier&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Advanced Amplifier&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Advanced Amplifier is used to upgrade sensor cards to Mk4. &lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=iron_ingot |B1=Gold_Ingot|C1=iron_ingot&lt;br /&gt;
 |A2=Redstone |B2=Diamond        |C2=Redstone&lt;br /&gt;
 |A3=iron_ingot |B3=Gold_Ingot     |C3=iron_ingot&lt;br /&gt;
 |Output=Advanced Amplifier&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: solid 1px black; margin: 2px; border-spacing: 0px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;font-weight: bold; font-size: large; padding-bottom: .3em; border-bottom: solid #C9C9C9 1px; background: #D3FFC2; line-height:28px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Grid_disk.png|24px]]&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
Sensor Tiers&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;width: 350px; background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Name&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Description&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;'''Mk 1'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The recipes for Mk 1 sensors are all different. (See above sensor card lists) &lt;br /&gt;
Special-type sensor cards (Currently only the World Sensor Card) only exist as Mk 1, as they do not have a range. &lt;br /&gt;
&lt;br /&gt;
'''Ranges:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Type&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Range&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Sensor types&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Block&amp;lt;td&amp;gt;'''1''' block away (3x3x3)&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[File:Grid_Inventory_Sensor_Card.png|24px|Inventory Sensor]]&lt;br /&gt;
[[File:Grid_Industrial_Craft_2_Sensor_Card.png|24px|Industrial Craft 2 Sensor]]&lt;br /&gt;
[[File:Grid_Buildcraft_Sensor_Card.png|24px|Buildcraft Sensor]]&lt;br /&gt;
[[File:Grid_Liquid_Sensor_Card.png|24px|Liquid Sensor]]&lt;br /&gt;
[[File:Grid_Sign_Sensor_Card.png|24px|Sign Sensor]]&lt;br /&gt;
[[File:Grid_Thaumcraft_Sensor_Card.png|24px|Thaumcraft Sensor]]&lt;br /&gt;
[[File:Grid_Sonic_Sensor_Card.png|24px|Sonic Sensor]]&lt;br /&gt;
[[File:Grid_Crop_Sensor_Card.png|24px|Crop Sensor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Entity&amp;lt;td&amp;gt;'''4''' block-radius sphere&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[File:Grid_Proximity_Sensor_Card.png|24px|Proximity Sensor]]&lt;br /&gt;
[[File:Grid_Dropped_Item_Sensor_Card.png|24px|Dropped Item Sensor]]&lt;br /&gt;
[[File:Grid_Minecart_Sensor_Card.png|24px|Minecart Sensor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Special&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[File:Grid_World_Sensor_Card.png|24px|World Sensor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;'''Mk 2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Mk 2 is the first upgrade to sensor cards. Simply combine a Range Extension Antenna with a Mk 1 sensor card (The recipe is shapeless)&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Inventory Sensor Card |B1=Range Extension Antenna&lt;br /&gt;
 |Output=Inventory Sensor Card Mk2&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 |A1-link=OpenCCSensors&lt;br /&gt;
 |B1-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ranges:'''&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Type&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Range&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Sensor types&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Block&amp;lt;td&amp;gt;'''3''' blocks away (7x7x7)&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[File:Grid_Inventory_Sensor_Card.png|24px|Inventory Sensor]]&lt;br /&gt;
[[File:Grid_Industrial_Craft_2_Sensor_Card.png|24px|Industrial Craft 2 Sensor]]&lt;br /&gt;
[[File:Grid_Buildcraft_Sensor_Card.png|24px|Buildcraft Sensor]]&lt;br /&gt;
[[File:Grid_Liquid_Sensor_Card.png|24px|Liquid Sensor]]&lt;br /&gt;
[[File:Grid_Sign_Sensor_Card.png|24px|Sign Sensor]]&lt;br /&gt;
[[File:Grid_Thaumcraft_Sensor_Card.png|24px|Thaumcraft Sensor]]&lt;br /&gt;
[[File:Grid_Sonic_Sensor_Card.png|24px|Sonic Sensor]]&lt;br /&gt;
[[File:Grid_Crop_Sensor_Card.png|24px|Crop Sensor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Entity&amp;lt;td&amp;gt;'''12''' block-radius sphere&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[File:Grid_Proximity_Sensor_Card.png|24px|Proximity Sensor]]&lt;br /&gt;
[[File:Grid_Dropped_Item_Sensor_Card.png|24px|Dropped Item Sensor]]&lt;br /&gt;
[[File:Grid_Minecart_Sensor_Card.png|24px|Minecart Sensor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;'''Mk 3'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Mk 3 is the second upgrade to sensor cards. Note that the recipe is no longer shapeless.&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Range Extension Antenna |B1=Inventory Sensor Card Mk2|C1=Range Extension Antenna&lt;br /&gt;
 |B2=Signal Amplifier&lt;br /&gt;
 |Output=Inventory Sensor Card Mk3&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 |A1-link=OpenCCSensors&lt;br /&gt;
 |B1-link=OpenCCSensors&lt;br /&gt;
 |B2-link=OpenCCSensors&lt;br /&gt;
 |C1-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ranges:'''&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Type&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Range&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Sensor types&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Block&amp;lt;td&amp;gt;'''5''' blocks away (11x11x11)&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[File:Grid_Inventory_Sensor_Card.png|24px|Inventory Sensor]]&lt;br /&gt;
[[File:Grid_Industrial_Craft_2_Sensor_Card.png|24px|Industrial Craft 2 Sensor]]&lt;br /&gt;
[[File:Grid_Buildcraft_Sensor_Card.png|24px|Buildcraft Sensor]]&lt;br /&gt;
[[File:Grid_Liquid_Sensor_Card.png|24px|Liquid Sensor]]&lt;br /&gt;
[[File:Grid_Sign_Sensor_Card.png|24px|Sign Sensor]]&lt;br /&gt;
[[File:Grid_Thaumcraft_Sensor_Card.png|24px|Thaumcraft Sensor]]&lt;br /&gt;
[[File:Grid_Sonic_Sensor_Card.png|24px|Sonic Sensor]]&lt;br /&gt;
[[File:Grid_Crop_Sensor_Card.png|24px|Crop Sensor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Entity&amp;lt;td&amp;gt;'''20''' block-radius sphere&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[File:Grid_Proximity_Sensor_Card.png|24px|Proximity Sensor]]&lt;br /&gt;
[[File:Grid_Dropped_Item_Sensor_Card.png|24px|Dropped Item Sensor]]&lt;br /&gt;
[[File:Grid_Minecart_Sensor_Card.png|24px|Minecart Sensor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;'''Mk 4'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Mk 4 is the highest tier of sensor card upgrades&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |B1=Range Extension Antenna &lt;br /&gt;
|A2=Range Extension Antenna |B2=Inventory Sensor Card Mk3|C2=Range Extension Antenna&lt;br /&gt;
 |A3=Signal Amplifier|B3=Advanced Amplifier|C3=Signal Amplifier&lt;br /&gt;
 |Output=Inventory Sensor Card Mk4&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 |B1-link=OpenCCSensors&lt;br /&gt;
 |A2-link=OpenCCSensors&lt;br /&gt;
 |B2-link=OpenCCSensors&lt;br /&gt;
 |C2-link=OpenCCSensors&lt;br /&gt;
 |A3-link=OpenCCSensors&lt;br /&gt;
 |B3-link=OpenCCSensors&lt;br /&gt;
 |C3-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ranges:'''&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Type&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Range&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Sensor types&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Block&amp;lt;td&amp;gt;'''7''' blocks away (15x15x15)&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[File:Grid_Inventory_Sensor_Card.png|24px|Inventory Sensor]]&lt;br /&gt;
[[File:Grid_Industrial_Craft_2_Sensor_Card.png|24px|Industrial Craft 2 Sensor]]&lt;br /&gt;
[[File:Grid_Buildcraft_Sensor_Card.png|24px|Buildcraft Sensor]]&lt;br /&gt;
[[File:Grid_Liquid_Sensor_Card.png|24px|Liquid Sensor]]&lt;br /&gt;
[[File:Grid_Sign_Sensor_Card.png|24px|Sign Sensor]]&lt;br /&gt;
[[File:Grid_Thaumcraft_Sensor_Card.png|24px|Thaumcraft Sensor]]&lt;br /&gt;
[[File:Grid_Sonic_Sensor_Card.png|24px|Sonic Sensor]]&lt;br /&gt;
[[File:Grid_Crop_Sensor_Card.png|24px|Crop Sensor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Entity&amp;lt;td&amp;gt;'''28''' block-radius sphere&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[File:Grid_Proximity_Sensor_Card.png|24px|Proximity Sensor]]&lt;br /&gt;
[[File:Grid_Dropped_Item_Sensor_Card.png|24px|Dropped Item Sensor]]&lt;br /&gt;
[[File:Grid_Minecart_Sensor_Card.png|24px|Minecart Sensor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Usage Examples =&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=List all available targets on a Proximity Sensor on the left of the Computer.&lt;br /&gt;
|code=os.loadAPI(&amp;quot;ocs/apis/sensor&amp;quot;)&lt;br /&gt;
 local prox = sensor.wrap(&amp;quot;left&amp;quot;)&lt;br /&gt;
 print(textutils.serialize(prox.getTargets()))&lt;br /&gt;
|output=A huge blob of text with all nearby available targets to the sensor, and some basic details.&lt;br /&gt;
}}&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Turn on a Redstone lamp when a player is within a certain distance from it. The sensor is placed to the left of the computer and the lamp is placed on top of the computer.&lt;br /&gt;
|code=&lt;br /&gt;
  os.loadAPI(&amp;quot;ocs/apis/sensor&amp;quot;)&lt;br /&gt;
  &lt;br /&gt;
 -- the location of the redstone lamp relative to the sensor&lt;br /&gt;
 local offset = {&lt;br /&gt;
   X = 1,&lt;br /&gt;
   Y = 1,&lt;br /&gt;
   Z = 0&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 -- how close a player has to be to activate the lamp&lt;br /&gt;
 local radius = 5&lt;br /&gt;
 &lt;br /&gt;
  -- find the distance from the player position to the offset&lt;br /&gt;
 function distance(pos)&lt;br /&gt;
   local xd = pos.X - offset.X&lt;br /&gt;
   local yd = pos.Y - offset.Y&lt;br /&gt;
   local zd = pos.Z - offset.Z&lt;br /&gt;
   return math.sqrt(xd*xd + yd*yd + zd*zd)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
 local proximity = sensor.wrap(&amp;quot;left&amp;quot;)&lt;br /&gt;
 while true do&lt;br /&gt;
   local signal = false&lt;br /&gt;
   local targets = proximity.getTargets()&lt;br /&gt;
   for k, v in pairs(targets) do&lt;br /&gt;
         if distance(v.Position) &amp;lt; radius then&lt;br /&gt;
           signal = true   &lt;br /&gt;
         end&lt;br /&gt;
   end&lt;br /&gt;
   rs.setOutput(&amp;quot;top&amp;quot;, signal)&lt;br /&gt;
 end&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User_Created_Peripherals]][[Category:Unofficial_APIs]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Term.restore&amp;diff=7215</id>
		<title>Term.restore</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Term.restore&amp;diff=7215"/>
				<updated>2015-08-24T05:55:25Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Removed bad advice.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
&lt;br /&gt;
{{Deprecated&lt;br /&gt;
|type=term.restore&lt;br /&gt;
|version=1.6&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Function&lt;br /&gt;
|name=term.restore&lt;br /&gt;
|returns=Nothing&lt;br /&gt;
|api=term&lt;br /&gt;
|addon=ComputerCraft&lt;br /&gt;
|desc=Using versions of ComputerCraft prior to 1.6, this command switches the terminal back to whatever object it was using to output the display prior to the current one. For example, if you redirect from a computer's screen to an attached [[Monitor]], this command will revert back to the computer's own display.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As of version 1.6, ComputerCraft no longer tracks this for you and so term.restore() has been removed. That build instead adds [[term.current|term.current()]] - this can be used to track the previous trail of displays yourself, hence still allowing you to manually [[term.redirect|term.redirect()]] back.&lt;br /&gt;
|examples=&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Wraps a monitor at the top of the computer, redirects to it, then restores back to the previous display. Uses term.restore() ''if available'', or [[term.current|term.current()]] if not.&lt;br /&gt;
|code= local mon = peripheral.wrap(&amp;quot;top&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 -- If using a build of ComputerCraft without term.restore, record the current terminal output object:&lt;br /&gt;
 if not term.restore then mon.restoreTo = term.current() end&lt;br /&gt;
 &lt;br /&gt;
 -- Redirect the terminal to the attached monitor:&lt;br /&gt;
 term.redirect(mon)&lt;br /&gt;
 &lt;br /&gt;
 -- Restore back:&lt;br /&gt;
 if term.restore then&lt;br /&gt;
 	term.restore()&lt;br /&gt;
 else&lt;br /&gt;
 	term.redirect(mon.restoreTo)&lt;br /&gt;
 end&lt;br /&gt;
}}&lt;br /&gt;
|notes=&lt;br /&gt;
* term.restore() will return the monitor to the last used redirect target - meaning that if you have used [[term.redirect|term.redirect()]] on two different monitor objects, one use of term.restore() will only restore back to the first redirected monitor, whereas a second would restore back to the original display. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Deprecated API Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=OS_(API)&amp;diff=6829</id>
		<title>OS (API)</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=OS_(API)&amp;diff=6829"/>
				<updated>2015-01-04T06:54:17Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: add cancelTimer and cancelAlarm calls.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Operating System API allows for interfacing with the Lua based Operating System itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{API table|OS|image=Grid disk.png|2=&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.version]]()|{{type|string}} version&lt;br /&gt;
|Returns the version of the OS the computer is running, which (for CraftOS) also contains the version of ComputerCraft.&lt;br /&gt;
|odd}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.getComputerID]]()|{{type|number}} id&lt;br /&gt;
|Returns the unique ID of this computer. [[os.computerID]]() also behaves exactly the same as [[os.getComputerID]]().&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.getComputerLabel]]()|{{type|string}}/{{type|nil}} label&lt;br /&gt;
|Returns the label of this computer. [[os.computerLabel]]() also behaves exactly the same as [[os.getComputerLabel]]().&lt;br /&gt;
|odd}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.setComputerLabel]]({{type|string}}/{{type|nil}} label)|{{type|nil}}&lt;br /&gt;
|Set the label of this computer.&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.run]]({{type|table}} environment, {{type|string}} programPath [, {{type|string}} arguments])&lt;br /&gt;
|{{type|boolean}} success&lt;br /&gt;
|An advanced way of starting programs. A started program will have a given &amp;lt;var&amp;gt;environment&amp;lt;/var&amp;gt; table which determines what functions it has available, as well as any variables it will be able to access by default. You may prefer to use the [[Shell (API)]] unless you need to do something special.&lt;br /&gt;
|odd}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.loadAPI]]({{type|string}} path)&lt;br /&gt;
|{{type|boolean}} success&lt;br /&gt;
|Loads a Lua script as an API in its own namespace. It will be available to '''all''' programs that run on the terminal.}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.unloadAPI]]({{type|string}} name)|{{type|nil}}&lt;br /&gt;
|Unloads a previously loaded API.&lt;br /&gt;
|odd}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.pullEvent]]([&amp;lt;nowiki/&amp;gt;{{type|string}} target-event])&lt;br /&gt;
|{{type|string}} event, param1, param2, ...&lt;br /&gt;
|Blocks until the computer receives an event, or if &amp;lt;var&amp;gt;target-event&amp;lt;/var&amp;gt; is specified, will block until an instance of &amp;lt;var&amp;gt;target-event&amp;lt;/var&amp;gt; occurs. [[os.pullEvent]](target-event) returns the event and any parameters the event may have. If a &amp;lt;var&amp;gt;target-event&amp;lt;/var&amp;gt; is specified, the computer will not break for any other events (except termination).&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.pullEventRaw]]([&amp;lt;nowiki/&amp;gt;{{type|string}} target-event])&lt;br /&gt;
|{{type|string}} event, param1, param2, ...&lt;br /&gt;
|Advanced version of pullEvent(). Blocks until the computer receives an event, or if &amp;lt;var&amp;gt;target-event&amp;lt;/var&amp;gt; is specified, will block until an instance of &amp;lt;var&amp;gt;target-event&amp;lt;/var&amp;gt; occurs. [[os.pullEventRaw]](target-event) returns the event and any parameters the event may have. Unlike [[os.pullEvent]](target-event), this function will not raise an error if a [[terminate_(event)|'terminate' event]] is received.&lt;br /&gt;
|odd}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.queueEvent]]({{type|string}} event, param1, param2, ...)|{{type|nil}}&lt;br /&gt;
|Adds an event to the event queue with the name &amp;lt;var&amp;gt;event&amp;lt;/var&amp;gt; and the given parameters.&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.clock]]()|{{type|number}} time&lt;br /&gt;
|Returns the amount of time since the in-game computer was started.&lt;br /&gt;
|odd}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.startTimer]]({{Type|number}} timeout)|{{type|number}} timerID&lt;br /&gt;
|Queues an event to be triggered after a number of seconds (&amp;lt;var&amp;gt;timeout&amp;lt;/var&amp;gt;). The ID of the timer is returned from this function to differentiate multiple timers. Timers are one-shot; once they have fired an event you will need to start another one if you need a recurring timer.&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.cancelTimer]]({{Type|number}} timerID)|{{type|nil}}&lt;br /&gt;
|Cancels a running timer, to prevent it throwing an event.&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.time]]()|{{type|number}} time&lt;br /&gt;
|Returns the current in-game time.&lt;br /&gt;
|odd}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.sleep]]({{Type|number}} time)|{{type|nil}}&lt;br /&gt;
|Makes the system wait a number of seconds before continuing in the program. [[os.sleep]](time) may also be used as simply &amp;quot;sleep(time)&amp;quot;.&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.day]]()|{{type|number}} day&lt;br /&gt;
|Return the current in-game day (the number of in-game days since the world was created).&lt;br /&gt;
|odd}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.setAlarm]]({{type|number}} time)|{{type|number}} alarmID&lt;br /&gt;
|Queues an event to be triggered at the specified in-game &amp;lt;var&amp;gt;time&amp;lt;/var&amp;gt;.&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.cancelAlarm]]({{Type|number}} alarmID)|{{type|nil}}&lt;br /&gt;
|Cancels a pending alarm, to prevent it throwing an event.&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.shutdown]]()|{{type|nil}}&lt;br /&gt;
|Turns off the computer.&lt;br /&gt;
|odd}}&lt;br /&gt;
&lt;br /&gt;
{{API table/row&lt;br /&gt;
|[[os.reboot]]()|{{type|nil}}&lt;br /&gt;
|Reboots the computer.&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:APIs]]&lt;br /&gt;
&lt;br /&gt;
== APIs ==&lt;br /&gt;
&lt;br /&gt;
APIs are Lua files which are loaded into the OS itself, and expose functions which other programs may use. The stock [[:Category:APIs|APIs]] that ship with ComputerCraft are loaded in this way, and may be replaced by a computer’s user or programs.&lt;br /&gt;
&lt;br /&gt;
The following is an example of a valid implementation of an API, and its usage after being registered:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  -- &amp;quot;apiTest&amp;quot; file&lt;br /&gt;
  function foo(bar)&lt;br /&gt;
    print(bar)&lt;br /&gt;
  end&lt;br /&gt;
  &lt;br /&gt;
  -- &amp;quot;program&amp;quot; file&lt;br /&gt;
  os.loadAPI(&amp;quot;apiTest&amp;quot;)&lt;br /&gt;
  apiTest.foo(&amp;quot;this is a test&amp;quot;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;div id=&amp;quot;pullEvent&amp;quot;&amp;gt;os.pullEvent()&amp;lt;/div&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
os.pullEvent() causes the current program to pause, retrieving the next event from the computer's queue of events. If there is no event to read, then the program will stall until such an event becomes available. Note that if a program has not attempted to pull an event in the past ten seconds, it will be forcefully terminated to prevent CPU waste in SMP environments.&lt;br /&gt;
&lt;br /&gt;
os.pullEvent() returns the name of the event that was read, as well as up to five parameters:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local event, p1, p2, p3, p4, p5 = os.pullEvent()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
os.pullEvent() is usually run inside a 'while true do' loop.&lt;br /&gt;
&lt;br /&gt;
An advanced version of this method &amp;lt;code&amp;gt;os.pullEventRaw&amp;lt;/code&amp;gt; bypasses the normal handling of events from the OS. You may use this to act on the &amp;quot;Terminate&amp;quot; event (triggered when holding Ctrl-T) for custom termination logic.&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Talk:String_(API)&amp;diff=6811</id>
		<title>Talk:String (API)</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Talk:String_(API)&amp;diff=6811"/>
				<updated>2014-11-15T02:20:20Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Looks like we need to add a note about balanced string searches (&amp;quot;%b()&amp;quot;, for example), as well as noting that the string.sub/find interaction was fixed by re-implementing the functions to include the concatenation operation, in 1.6+.&lt;br /&gt;
[[User:Lyqyd|Lyqyd]] 02:20, 15 November 2014 (GMT)&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Fs.getDrive&amp;diff=6805</id>
		<title>Fs.getDrive</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Fs.getDrive&amp;diff=6805"/>
				<updated>2014-11-08T18:34:58Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=fs.getDrive&lt;br /&gt;
|args={{Type|string}} path&lt;br /&gt;
|api=fs&lt;br /&gt;
|returns={{Type|string}} the type of storage medium holding the path, or [[nil]] if the path does not exist&lt;br /&gt;
|desc=Returns the storage medium holding a path, or [[nil]] if the path does not exist. This is one of “hdd” if the path is stored on the computer’s local hard drive, “rom” if the path is in ROM, or the side on which a disk drive is attached if the path is on a [[Floppy Disk]]. From ComputerCraft 1.52 through ComputerCraft 1.64, a network-attached disk drive with a floppy in it returns the side of the computer on which the modem is attached, rather than the network name of the disk drive; this was a bug.[http://www.computercraft.info/forums2/index.php?/topic/12369-mc-151-cc-152-fsgetdrive-wrong-answer-for-network-drives/]&lt;br /&gt;
|examples=&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Checks that the standard &amp;quot;startup&amp;quot; file is stored in ROM&lt;br /&gt;
|code=print(fs.getDrive(&amp;quot;rom/startup&amp;quot;))&lt;br /&gt;
|output=rom&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua_Core_Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Template:News&amp;diff=6753</id>
		<title>Template:News</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Template:News&amp;diff=6753"/>
				<updated>2014-09-27T21:49:44Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Add 1.64 full release.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''September 27, 2014'''&lt;br /&gt;
* ComputerCraft 1.64 is released for Minecraft '''1.7.10'''.&lt;br /&gt;
'''April 16, 2014'''&lt;br /&gt;
* ComputerCraft 1.63 is released for Minecraft '''1.6.4'''.&lt;br /&gt;
'''April 4, 2014'''&lt;br /&gt;
* ComputerCraft 1.62 is released to fix game crashes.&lt;br /&gt;
'''April 1, 2014'''&lt;br /&gt;
* ComputerCraft 1.61 is released as a bug fix update for ComputerCraft 1.6.&lt;br /&gt;
'''March 27, 2014'''&lt;br /&gt;
* ComputerCraft 1.6 is released for Minecraft '''1.6.4'''.&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&amp;lt;!-- Only display latest four events.--&amp;gt;&lt;br /&gt;
'''December 9, 2013'''&lt;br /&gt;
* ComputerCraft 1.58 is released for Minecraft '''1.6.4'''.&lt;br /&gt;
'''October 14, 2013'''&lt;br /&gt;
* ComputerCraft 1.57 is released for Minecraft '''1.6.4'''.&lt;br /&gt;
'''August 4, 2013'''&lt;br /&gt;
* ComputerCraft 1.56 is released for Minecraft '''1.6.2'''.&lt;br /&gt;
'''July 11, 2013'''&lt;br /&gt;
* ComputerCraft 1.55 is released for Minecraft '''1.6.2'''.&lt;br /&gt;
'''May 23, 2013'''&lt;br /&gt;
* ComputerCraft 1.53 is released for Minecraft '''1.5.2'''.&lt;br /&gt;
'''March 26, 2013'''&lt;br /&gt;
* ComputerCraft 1.52 is released for Minecraft '''1.5.1'''.&lt;br /&gt;
'''February 11, 2013'''&lt;br /&gt;
* ComputerCraft 1.5 is released for Minecraft '''1.4.7'''.&lt;br /&gt;
'''December 27, 2012'''&lt;br /&gt;
* ComputerCraft 1.481 is released as a quick hotfix for MiscPeripherals.&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Template:Version&amp;diff=6752</id>
		<title>Template:Version</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Template:Version&amp;diff=6752"/>
				<updated>2014-09-27T21:48:23Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Add 1.64 full release.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- ATTENTION WIKI-ENS. Please do not alter the markup on this page,&lt;br /&gt;
  only change the values inside the table-cells (&amp;lt;td&amp;gt;). Thanks and&lt;br /&gt;
  love, AfterLifeLochie.&lt;br /&gt;
  Templates for this page:&lt;br /&gt;
   ** BETA **:&lt;br /&gt;
       &amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFE8A8; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''%VERSION%''' ''Beta'' for '''Minecraft %MCVERSION%'''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
   ** LATEST **:&lt;br /&gt;
       &amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#E5F9FF; text-align:center;&amp;quot;&amp;gt;'''Latest:'''&amp;lt;br /&amp;gt;ComputerCraft '''%VERSION%''' for '''Minecraft %MCVERSION%'''&amp;lt;br /&amp;gt;Latest&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
   ** OLD **:   (alternating cell pattern)&lt;br /&gt;
       &amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''%VERSION%''' for '''Minecraft %MCVERSION%'''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
       &amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''%VERSION%''' for '''Minecraft %MCVERSION%'''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;table style=&amp;quot;width:100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#E5F9FF; text-align:center;&amp;quot;&amp;gt;'''Latest:'''&amp;lt;br /&amp;gt;ComputerCraft '''1.64''' for '''Minecraft 1.7.10''' ([http://www.computercraft.info/2014/09/27/computercraft-1-64/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.63''' for '''Minecraft 1.6.4''' ([http://www.computercraft.info/2014/04/16/computercraft-1-63/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.62''' for '''Minecraft 1.6.4'''&lt;br /&gt;
([http://www.computercraft.info/2014/04/04/computercraft-1-62/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.61''' for '''Minecraft 1.6.4'''&lt;br /&gt;
([http://www.computercraft.info/2014/04/01/computercraft-1-61-bug-fix-update/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.6''' for '''Minecraft 1.6.4''' ([http://www.computercraft.info/2014/03/27/computercraft-1-6-is-here/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.58''' for '''Minecraft 1.6.4''' ([http://www.computercraft.info/2013/12/09/computercraft-1-58/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.57''' for '''Minecraft 1.6.4''' ([http://www.computercraft.info/2013/10/14/new-versions/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt; &amp;lt;!-- 6 newest releases should be enaugh --&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.56''' for '''Minecraft 1.6.2''' ([http://www.computercraft.info/2013/08/04/computercraft-1-56/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.55''' for '''Minecraft 1.6.2''' ([http://www.computercraft.info/2013/07/11/computercraft-1-55/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.53''' for '''Minecraft 1.5.2''' ([http://www.computercraft.info/2013/05/23/computercraft-1-53/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.52''' for '''Minecraft 1.5.1''' ([http://www.computercraft.info/2013/03/26/computercraft-1-52/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.51''' for '''Minecraft 1.5''' ([http://www.computercraft.info/2013/03/15/computercraft-1-51/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.5''' for '''Minecraft 1.4.7''' ([http://www.computercraft.info/2013/02/11/computercraft-1-5/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;'''[[Changelog]]'''&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Disk_Drive&amp;diff=6657</id>
		<title>Disk Drive</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Disk_Drive&amp;diff=6657"/>
				<updated>2014-07-12T00:05:11Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Add note about disk and disk_eject events being fired.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Block&lt;br /&gt;
|name=Disk Drive&lt;br /&gt;
|image=Iso_DiskDrive.png&lt;br /&gt;
|id=4094&lt;br /&gt;
|damage-value=Un-used.&lt;br /&gt;
|is-peripheral=Yes&lt;br /&gt;
|peripheral-api=Disk (API)&lt;br /&gt;
}}&lt;br /&gt;
The Disk Drive arrived with the [[ComputerCraft]] 1.2 update and with that also came [[Floppy Disk]]s. The Disk Drive is an object that, when placed adjacently but not diagonally next to a [[computer]], does the same as a disk drive for real computers in the real world would do: they allow the access to portable data storage devices ([[Floppy Disk]]s). Since the [[ComputerCraft]] 1.6 update, both types of [[Pocket Computer]]s can also be inserted into disk drives, allowing access to their files.&lt;br /&gt;
== Recipe ==&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=stone |B1=stone    |C1=stone&lt;br /&gt;
 |A2=stone |B2=Redstone |C2=stone&lt;br /&gt;
 |A3=stone |B3=Redstone |C3=stone&lt;br /&gt;
 |Output=Disk_Drive&lt;br /&gt;
 }}&lt;br /&gt;
== Usage ==&lt;br /&gt;
[[File:Computer_w_DiskDrive_w_Monitor.png|frame|428x241px|right|A 2x2 [[Monitor]], connected to a [[Computer]], with a [[Disk Drive]] connected.]]&lt;br /&gt;
[[File:DiskDriveGUI.png|thumb|350px|GUI of the Disk Drive]]&lt;br /&gt;
To use a disk drive, place it adjacently but not diagonally next to a computer (left, right, top, bottom, front, or back side). Insert a disk by right-clicking on the disk drive and placing the disk in the slot above the inventory. When a disk is inserted, a [[Disk (event)|disk]] event is fired, and when a disk is removed or ejected, a [[Disk eject (event)|disk_eject]] event is fired.&lt;br /&gt;
&lt;br /&gt;
If you sneak and right click the disk drive with a disk/music disc in 1.4+ it will place it into it without needing to open the disk drives interface.&lt;br /&gt;
&lt;br /&gt;
In [[ComputerCraft]] 1.6 and above, [[Pocket Computer]]s can also be inserted into a disk drive to browse their files.&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
See [[Disk (API)]] for the disk API.&lt;br /&gt;
&lt;br /&gt;
{{BlocksItemsList}}&lt;br /&gt;
[[Category:Blocks]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Shell_(API)&amp;diff=6329</id>
		<title>Shell (API)</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Shell_(API)&amp;diff=6329"/>
				<updated>2014-04-02T22:54:21Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: clarify shell.run parameters.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The shell API allows you to interface with the [http://en.wikipedia.org/wiki/Shell_%28computing%29 shell].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: solid 1px black; margin: 2px; border-spacing: 0px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;font-weight: bold; font-size: large; padding-bottom: .3em; border-bottom: solid #C9C9C9 1px; background: #D3FFC2; line-height:28px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Grid_disk.png|24px]]&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
Shell (API)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;width: 350px; background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Method Name&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Description&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[shell.exit]]()&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Exits the current shell&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[shell.dir]]()&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Returns the directory&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[shell.setDir]]({{type|string}} path)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Sets the directory&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[shell.path]]()&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Returns the path&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[shell.setPath]]({{type|string}} path)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Sets the path&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[shell.resolve]]({{type|string}} localpath)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Resolves a local path to an absolute path.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[shell.resolveProgram]]({{type|string}} name)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Resolves the absolute path to the program whose name you provided.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[shell.aliases]]()&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Returns aliases.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[shell.setAlias]]({{type|string}} alias, {{type|string}} program)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Sets an alias.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[shell.clearAlias]]({{type|string}} alias)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Clears an alias.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[shell.programs]]([&amp;lt;nowiki&amp;gt;&amp;lt;/nowiki&amp;gt;{{type|boolean}} hidden])&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Returns a {{type|table}} of programs.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[shell.run]]({{type|string}} command)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Runs a program.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[shell.getRunningProgram]]()&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Returns the absolute path to the currently-executing program.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[shell.openTab]]({{type|string}} command)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Runs a program in another [[multishell]] tab. ''Requires version 1.6 or newer and an advanced computer.''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[shell.switchTab]]({{type|number}} tab ID)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Switches the [[multishell]] tab to tab with the given ID.  ''Requires version 1.6 or newer and an advanced computer.''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that [[shell.run]] and [[shell.openTab]] concatenate any arguments they are given with single space separator characters before parsing the command.  This is backwards compatible with scripts written when shell.run required one string argument for the program, and one per argument for that program, but accepts a single string with the entire command as well.&lt;br /&gt;
&lt;br /&gt;
[[Category:APIs]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Template:Version&amp;diff=6326</id>
		<title>Template:Version</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Template:Version&amp;diff=6326"/>
				<updated>2014-04-02T01:23:46Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: 1.61 update.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- ATTENTION WIKI-ENS. Please do not alter the markup on this page,&lt;br /&gt;
  only change the values inside the table-cells (&amp;lt;td&amp;gt;). Thanks and&lt;br /&gt;
  love, AfterLifeLochie.&lt;br /&gt;
  Templates for this page:&lt;br /&gt;
   ** BETA **:&lt;br /&gt;
       &amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFE8A8; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''%VERSION%''' ''Beta'' for '''Minecraft %MCVERSION%'''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
   ** LATEST **:&lt;br /&gt;
       &amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#E5F9FF; text-align:center;&amp;quot;&amp;gt;'''Latest:'''&amp;lt;br /&amp;gt;ComputerCraft '''%VERSION%''' for '''Minecraft %MCVERSION%'''&amp;lt;br /&amp;gt;Latest&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
   ** OLD **:   (alternating cell pattern)&lt;br /&gt;
       &amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''%VERSION%''' for '''Minecraft %MCVERSION%'''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
       &amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''%VERSION%''' for '''Minecraft %MCVERSION%'''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;table style=&amp;quot;width:100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#E5F9FF; text-align:center;&amp;quot;&amp;gt;'''Latest:'''&amp;lt;br /&amp;gt;ComputerCraft '''1.61''' for '''Minecraft 1.6.4''' ([http://www.computercraft.info/2014/04/01/computercraft-1-61-bug-fix-update/// download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.6''' for '''Minecraft 1.6.4''' ([http://www.computercraft.info/2014/03/27/computercraft-1-6-is-here/// download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.58''' for '''Minecraft 1.6.4''' ([http://www.computercraft.info/2013/12/09/computercraft-1-58/// download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.57''' for '''Minecraft 1.6.4''' ([http://www.computercraft.info/2013/10/14/new-versions/// download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.56''' for '''Minecraft 1.6.2''' ([http://www.computercraft.info/2013/08/04/computercraft-1-56/// download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.55''' for '''Minecraft 1.6.2''' ([http://www.computercraft.info/2013/07/11/computercraft-1-55/// download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.53''' for '''Minecraft 1.5.2''' ([http://www.computercraft.info/2013/05/23/computercraft-1-53// download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.52''' for '''Minecraft 1.5.1''' ([http://www.computercraft.info/2013/03/26/computercraft-1-52/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.51''' for '''Minecraft 1.5''' ([http://www.computercraft.info/2013/03/15/computercraft-1-51/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.5''' for '''Minecraft 1.4.7''' ([http://www.computercraft.info/2013/02/11/computercraft-1-5/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;'''[[Changelog]]'''&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Template:Version&amp;diff=6290</id>
		<title>Template:Version</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Template:Version&amp;diff=6290"/>
				<updated>2014-03-29T20:12:01Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Move 1.6 to latest from beta&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- ATTENTION WIKI-ENS. Please do not alter the markup on this page,&lt;br /&gt;
  only change the values inside the table-cells (&amp;lt;td&amp;gt;). Thanks and&lt;br /&gt;
  love, AfterLifeLochie.&lt;br /&gt;
  Templates for this page:&lt;br /&gt;
   ** BETA **:&lt;br /&gt;
       &amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFE8A8; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''%VERSION%''' ''Beta'' for '''Minecraft %MCVERSION%'''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
   ** LATEST **:&lt;br /&gt;
       &amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#E5F9FF; text-align:center;&amp;quot;&amp;gt;'''Latest:'''&amp;lt;br /&amp;gt;ComputerCraft '''%VERSION%''' for '''Minecraft %MCVERSION%'''&amp;lt;br /&amp;gt;Latest&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
   ** OLD **:   (alternating cell pattern)&lt;br /&gt;
       &amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''%VERSION%''' for '''Minecraft %MCVERSION%'''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
       &amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''%VERSION%''' for '''Minecraft %MCVERSION%'''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;table style=&amp;quot;width:100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#E5F9FF; text-align:center;&amp;quot;&amp;gt;'''Latest:'''&amp;lt;br /&amp;gt;ComputerCraft '''1.6''' for '''Minecraft 1.6.4''' ([http://www.computercraft.info/2014/03/27/computercraft-1-6-is-here//// download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.58''' for '''Minecraft 1.6.4''' ([http://www.computercraft.info/2013/12/09/computercraft-1-58/// download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.57''' for '''Minecraft 1.6.4''' ([http://www.computercraft.info/2013/10/14/new-versions/// download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.56''' for '''Minecraft 1.6.2''' ([http://www.computercraft.info/2013/08/04/computercraft-1-56/// download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.53''' for '''Minecraft 1.5.2''' ([http://www.computercraft.info/2013/05/23/computercraft-1-53// download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.52''' for '''Minecraft 1.5.1''' ([http://www.computercraft.info/2013/03/26/computercraft-1-52/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.51''' for '''Minecraft 1.5''' ([http://www.computercraft.info/2013/03/15/computercraft-1-51/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.5''' for '''Minecraft 1.4.7''' ([http://www.computercraft.info/2013/02/11/computercraft-1-5/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;'''[[Changelog]]'''&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=User_talk:Thesbros&amp;diff=6179</id>
		<title>User talk:Thesbros</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=User_talk:Thesbros&amp;diff=6179"/>
				<updated>2014-03-26T05:14:39Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: fix link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;IRC Bot test&lt;br /&gt;
&lt;br /&gt;
== Change &amp;quot;ComputerCraft‎; (+22)&amp;quot; (CID:4756) ==&lt;br /&gt;
&lt;br /&gt;
Your change on the page &amp;quot;ComputerCraft&amp;quot; (CID:4756) deleted the redirect &amp;quot;ComputerCraft&amp;quot; to &amp;quot;Main Page&amp;quot;. This is a critical redirect, as there are more than fifty pages that link to the ComputerCraft page. &lt;br /&gt;
&lt;br /&gt;
In future, please check using the &amp;quot;What Links Here&amp;quot; tool on the left sidebar before marking pages for deletions, or, deleting redirects - and ultimately, check with an Administrator before completely removing the redirect. Tagging a redirect page with the &amp;lt;nowiki&amp;gt;{{delete}}&amp;lt;/nowiki&amp;gt; does not prevent redirection (and helps retain integrity), but alerts us to the need (or not) to delete said page. ''[[User:AfterLifeLochie|AfterLifeLochie]] 00:18, 10 December 2012 (MSK)''&lt;br /&gt;
&lt;br /&gt;
== Crafting Table ==&lt;br /&gt;
&lt;br /&gt;
ThesBros, is there any chance of adding content to the crafting table page? Or just making it redirect to the MC wiki please?&lt;br /&gt;
[[User:Jonjon1234|Jonjon1234]] 01:18, 10 December 2012 (MSK)&lt;br /&gt;
&lt;br /&gt;
== X is not an API ==&lt;br /&gt;
&lt;br /&gt;
How do you define API? Something that can be loaded with &amp;lt;code&amp;gt;os.loadAPI&amp;lt;/code&amp;gt;? Well, then [[Monitor (API)|&amp;lt;code&amp;gt;monitor&amp;lt;/code&amp;gt;]] is not an API, nor is [[Printer (API)|&amp;lt;code&amp;gt;printer&amp;lt;/code&amp;gt;]].&lt;br /&gt;
&lt;br /&gt;
To me, it seems reasonable to say that anything returned by &amp;lt;code&amp;gt;peripheral.wrap&amp;lt;/code&amp;gt; is a [[:Category:Peripheral APIs|Peripheral API]], and by association, an API. Both [[workbench (API)]] and [[modem (API)]] are returned by peripheral.wrap.&lt;br /&gt;
[[User:Eric|Eric]] 17:11, 20 January 2013 (MSK)&lt;br /&gt;
&lt;br /&gt;
* The [[peripheral.wrap]] method provides access to native functions, and does '''not''' return an API - it returns ''access methods'' to the functions of the wrapped blocks and the API's provided by the block, and allows invoking of the block's API(s). For example, wrapping a modem does not create &amp;quot;modem&amp;quot; API - it provides native access to the Rednet API functions. ''[[User:AfterLifeLochie|AfterLifeLochie]] 17:38, 20 January 2013 (MSK)''&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Template:News&amp;diff=6136</id>
		<title>Template:News</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Template:News&amp;diff=6136"/>
				<updated>2014-03-23T22:24:27Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Comment out older events.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''December 9, 2013'''&lt;br /&gt;
* ComputerCraft 1.58 is released for Minecraft '''1.6.4'''.&lt;br /&gt;
'''October 14, 2013'''&lt;br /&gt;
* ComputerCraft 1.57 is released for Minecraft '''1.6.4'''.&lt;br /&gt;
'''August 4, 2013'''&lt;br /&gt;
* ComputerCraft 1.56 is released for Minecraft '''1.6.2'''.&lt;br /&gt;
'''May 23, 2013'''&lt;br /&gt;
* ComputerCraft 1.53 is released for Minecraft '''1.5.2'''.&lt;br /&gt;
&amp;lt;!-- Only display latest four events.&lt;br /&gt;
'''March 26, 2013'''&lt;br /&gt;
* ComputerCraft 1.52 is released for Minecraft '''1.5.1'''.&lt;br /&gt;
'''February 11, 2013'''&lt;br /&gt;
* ComputerCraft 1.5 is released for Minecraft '''1.4.7'''.&lt;br /&gt;
'''December 27, 2012'''&lt;br /&gt;
* ComputerCraft 1.481 is released as a quick hotfix for MiscPeripherals.&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Template:News&amp;diff=6135</id>
		<title>Template:News</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Template:News&amp;diff=6135"/>
				<updated>2014-03-23T22:23:02Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Add 1.56 - 1.58.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''December 9, 2013'''&lt;br /&gt;
* ComputerCraft 1.58 is released for Minecraft '''1.6.4'''.&lt;br /&gt;
'''October 14, 2013'''&lt;br /&gt;
* ComputerCraft 1.57 is released for Minecraft '''1.6.4'''.&lt;br /&gt;
'''August 4, 2013'''&lt;br /&gt;
* ComputerCraft 1.56 is released for Minecraft '''1.6.2'''.&lt;br /&gt;
'''May 23, 2013'''&lt;br /&gt;
* ComputerCraft 1.53 is released for Minecraft '''1.5.2'''.&lt;br /&gt;
'''March 26, 2013'''&lt;br /&gt;
* ComputerCraft 1.52 is released for Minecraft '''1.5.1'''.&lt;br /&gt;
'''February 11, 2013'''&lt;br /&gt;
* ComputerCraft 1.5 is released for Minecraft '''1.4.7'''.&lt;br /&gt;
'''December 27, 2012'''&lt;br /&gt;
* ComputerCraft 1.481 is released as a quick hotfix for MiscPeripherals.&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Template:Version&amp;diff=6134</id>
		<title>Template:Version</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Template:Version&amp;diff=6134"/>
				<updated>2014-03-23T22:18:19Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Add 1.57, 1.58, 1.6 beta; fix markup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- ATTENTION WIKI-ENS. Please do not alter the markup on this page,&lt;br /&gt;
  only change the values inside the table-cells (&amp;lt;td&amp;gt;). Thanks and&lt;br /&gt;
  love, AfterLifeLochie.&lt;br /&gt;
  Templates for this page:&lt;br /&gt;
   ** BETA **:&lt;br /&gt;
       &amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFE8A8; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''%VERSION%''' ''Beta'' for '''Minecraft %MCVERSION%'''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
   ** LATEST **:&lt;br /&gt;
       &amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#E5F9FF; text-align:center;&amp;quot;&amp;gt;'''Latest:'''&amp;lt;br /&amp;gt;ComputerCraft '''%VERSION%''' for '''Minecraft %MCVERSION%'''&amp;lt;br /&amp;gt;Latest&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
   ** OLD **:   (alternating cell pattern)&lt;br /&gt;
       &amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''%VERSION%''' for '''Minecraft %MCVERSION%'''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
       &amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''%VERSION%''' for '''Minecraft %MCVERSION%'''&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;table style=&amp;quot;width:100%&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFE8A8; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.6''' ''Beta'' for '''Minecraft 1.6.4''' ([http://www.computercraft.info/forums2/index.php?/topic/16881-computercraft-16-beta-download-and-discussion-pr7-released-march-21st/// download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#E5F9FF; text-align:center;&amp;quot;&amp;gt;'''Latest:'''&amp;lt;br /&amp;gt;ComputerCraft '''1.58''' for '''Minecraft 1.6.4''' ([http://www.computercraft.info/2013/12/09/computercraft-1-58/// download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.57''' for '''Minecraft 1.6.4''' ([http://www.computercraft.info/2013/10/14/new-versions/// download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.56''' for '''Minecraft 1.6.2''' ([http://www.computercraft.info/2013/08/04/computercraft-1-56/// download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.53''' for '''Minecraft 1.5.2''' ([http://www.computercraft.info/2013/05/23/computercraft-1-53// download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.52''' for '''Minecraft 1.5.1''' ([http://www.computercraft.info/2013/03/26/computercraft-1-52/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#FFFFFF; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.51''' for '''Minecraft 1.5''' ([http://www.computercraft.info/2013/03/15/computercraft-1-51/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;background-color:#D4D4D4; text-align:center;&amp;quot;&amp;gt;ComputerCraft '''1.5''' for '''Minecraft 1.4.7''' ([http://www.computercraft.info/2013/02/11/computercraft-1-5/ download])&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;'''[[Changelog]]'''&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Template:Event&amp;diff=6030</id>
		<title>Template:Event</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Template:Event&amp;diff=6030"/>
				<updated>2013-10-04T13:04:46Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Copy-pasta'd returns 4 and 5; important Cranium fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;table style=&amp;quot;width: 100%; border: solid 1px black; margin: 2px; border-spacing: 0px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;font-weight: bold; font-size: large; padding-bottom: .3em; border-bottom: solid #C9C9C9 1px; background: #DBE5FF; line-height:28px;&amp;quot;&amp;gt;[[File:Grid_Modem.png|24px]]&amp;amp;nbsp;&amp;amp;nbsp;Event {{{name}}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;border-color: black; padding: .4em; padding-left: .4em;&amp;quot; colspan=&amp;quot;2&amp;quot;&amp;gt;{{{desc|No description provided.}}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; border-right: solid #C9C9C9 1px; padding: .4em; width: 175px; font-weight: bold;&amp;quot;&amp;gt;Returned Object 1&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em; padding-left: .4em;&amp;quot;&amp;gt;{{{return1|[[nil|Nothing]]}}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
{{#if: {{{return2|}}} |&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-right: solid #C9C9C9 1px; padding: .4em; width: 175px; font-weight: bold;&amp;quot;&amp;gt;Returned Object 2&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-color: black; padding: .4em; padding-left: .4em;&amp;quot;&amp;gt;{{{return2}}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; |}}&lt;br /&gt;
{{#if: {{{return3|}}} |&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-right: solid #C9C9C9 1px; padding: .4em; width: 175px; font-weight: bold;&amp;quot;&amp;gt;Returned Object 3&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-color: black; padding: .4em; padding-left: .4em;&amp;quot;&amp;gt;{{{return3}}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; |}}&lt;br /&gt;
{{#if: {{{return4|}}} |&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-right: solid #C9C9C9 1px; padding: .4em; width: 175px; font-weight: bold;&amp;quot;&amp;gt;Returned Object 4&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-color: black; padding: .4em; padding-left: .4em;&amp;quot;&amp;gt;{{{return4}}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; |}}&lt;br /&gt;
{{#if: {{{return5|}}} |&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-right: solid #C9C9C9 1px; padding: .4em; width: 175px; font-weight: bold;&amp;quot;&amp;gt;Returned Object 5&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-color: black; padding: .4em; padding-left: .4em;&amp;quot;&amp;gt;{{{return5}}}&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt; |}}&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#if:{{{examples|}}}|&lt;br /&gt;
== Examples ==&lt;br /&gt;
{{{examples|}}}&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
{{#if:{{{notes|}}}|&lt;br /&gt;
== Additional Notes ==&lt;br /&gt;
{{{notes}}}&lt;br /&gt;
|}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Events]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Variables&amp;diff=5928</id>
		<title>Variables</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Variables&amp;diff=5928"/>
				<updated>2013-08-14T19:56:51Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Add modulus operator, fix formatting for other arithmetic operators.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Tutorials]]&lt;br /&gt;
{{Tutorial&lt;br /&gt;
|name=Variables&lt;br /&gt;
|desc=This is a tutorial page for Variables and their function.&lt;br /&gt;
|objective=To gain an understanding of how Variables work.&lt;br /&gt;
|prereqs=[[Hello_World_Tutorial|A basic understanding of programming in ComputerCraft]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What are Variables? ==&lt;br /&gt;
&lt;br /&gt;
Variables are one of the fundamental building blocks of all coding languages. Variables are just as they sound, they can store a changeable value.&lt;br /&gt;
&lt;br /&gt;
== What do variables look like? ==&lt;br /&gt;
&lt;br /&gt;
Variables will usually be defined near the start of a script or function (Functions will be taught in a later tutorial), as this will make them easy to edit later if required. Variables can be defined in a number of different ways, reliant on the type of data that is being stored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; String values&lt;br /&gt;
String variables can store any text or &amp;quot;string&amp;quot; that you will use in your script. Strings can be defined as follows&lt;br /&gt;
 local Text = 'This is a string!'&lt;br /&gt;
 local MoreText = &amp;quot;This is also a string!&amp;quot;&lt;br /&gt;
String values have the unique ability to be concatenated (One added to the end of the other). To do this, simply enter a &amp;quot;..&amp;quot; between the two strings or variables.&lt;br /&gt;
 local Start = &amp;quot;This is&amp;quot;&lt;br /&gt;
 local Middle = &amp;quot; all part of &amp;quot;&lt;br /&gt;
 local End = &amp;quot;one sentence!\n&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 Start = Start..Middle&lt;br /&gt;
 &lt;br /&gt;
 write(Start..End)&lt;br /&gt;
This will write &amp;quot;This is all part of one sentence!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Number values&lt;br /&gt;
Number variables can store any number used in the script, as well as perform calculations with them.&lt;br /&gt;
Numbers can be defined as follows&lt;br /&gt;
 local Number = 1&lt;br /&gt;
 local AnotherNumber = 2&lt;br /&gt;
Lua supports the following mathematical functions:&lt;br /&gt;
*Addition (+) ''1+1 = 2''&lt;br /&gt;
*Subtraction (-) ''2-1 = 1''&lt;br /&gt;
*Multiplication (*) ''2*2 = 4''&lt;br /&gt;
*Division (/) ''2/2 = 1''&lt;br /&gt;
*Modulus (%) ''5%2 = 1''&lt;br /&gt;
*Power (^) ''2^3 = 8''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Boolean values&lt;br /&gt;
Boolean variables are simply a &amp;quot;True or False?&amp;quot; variable. They can be either true or false, but nothing else. Boolean values are usually used for conditional statements, which will be covered in a later tutorial.&lt;br /&gt;
Boolean variables can be defined as follows&lt;br /&gt;
 local Bool = true&lt;br /&gt;
 local Bool2 = false&lt;br /&gt;
Note that &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; are case sensitive.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Nil values&lt;br /&gt;
Nil values are values that are currently storing nothing. Usually you will not explicitly set a variable to nil, as it acts similar to a &amp;quot;false&amp;quot; boolean. All variables are nil by default.&lt;br /&gt;
 local Variable = nil&lt;br /&gt;
Note that &amp;quot;nil&amp;quot; is case sensitive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Table values&lt;br /&gt;
Table variables are variables that can store any other variables, including more tables. They will be described in more depth in a later tutorial.&lt;br /&gt;
Tables can be defined as follows&lt;br /&gt;
 local EmptyTable = {}&lt;br /&gt;
 local Table = {1,2,3,4}&lt;br /&gt;
 local AnotherTable = {&amp;quot;This table&amp;quot;, &amp;quot;Contains&amp;quot;, 3, {&amp;quot;Types of variables!&amp;quot;} }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Function values&lt;br /&gt;
Although not often considered variables, Lua functions can act the same way as other more standard variables. Functions will be described in more detail in a later tutorial.&lt;br /&gt;
functions can be defined as follows&lt;br /&gt;
  local DoStuff = function() end&lt;br /&gt;
  local function AnotherFunction() end&lt;br /&gt;
  &lt;br /&gt;
  local DoStuff2 = function()&lt;br /&gt;
    write(&amp;quot;Function!\n&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
  local function AnotherFunction2()&lt;br /&gt;
    write(&amp;quot;Another function!\n&amp;quot;)&lt;br /&gt;
  end&lt;br /&gt;
Function and table variables are usually defined over multiple lines due to the length of them. In Lua, a new line does not mark any functionality and is used purely for readability.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unlike many other languages, Lua allows for variable's data types to be changed as you go, easily overwriting, for example, a string with a number.&lt;br /&gt;
  local Variable = &amp;quot;String!&amp;quot; --The variable is a string&lt;br /&gt;
  Variable = 1 --The variable is now a number&lt;br /&gt;
&lt;br /&gt;
== What is &amp;quot;local&amp;quot; and why is it useful? ==&lt;br /&gt;
You may have noticed the use of &amp;quot;local&amp;quot; in the above declarations. &amp;quot;local&amp;quot; simply states that the variable being defined should only be used in this script or function. You only need to write local for the first time you set a variable, then it will assume every other time you use the variable afterwards it is the local variable. If you use or set a variable without using local, it will try and use or set a global variable which can be used and modified by other scripts.&lt;br /&gt;
&lt;br /&gt;
Although it likely won't be an issue when you are using ComputerCraft, it is advisable to use local variables and functions when possible, so they will not be unintentionally edited by other functions or scripts.&lt;br /&gt;
&lt;br /&gt;
== Multiple assignments ==&lt;br /&gt;
Variables don't necessarily need to be defined one at a time, it is possible to assign multiple values in one operation through the use of commas.&lt;br /&gt;
  local Var1, Var2 = &amp;quot;One&amp;quot;, &amp;quot;Two&amp;quot;&lt;br /&gt;
  write( Var1..Var2..&amp;quot;\n&amp;quot; )&lt;br /&gt;
This script will successfully assign the values &amp;quot;One&amp;quot; and &amp;quot;Two&amp;quot;, then write &amp;quot;OneTwo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==What have we learned?==&lt;br /&gt;
*Variables can store values&lt;br /&gt;
*Variables store different types of values&lt;br /&gt;
*Variables can be defined in different ways&lt;br /&gt;
*An overview of what different variable types do&lt;br /&gt;
*Use &amp;quot;local&amp;quot; to use variables locally&lt;br /&gt;
*Multiple values may be assigned at once&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Coroutine_(API)&amp;diff=5919</id>
		<title>Coroutine (API)</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Coroutine_(API)&amp;diff=5919"/>
				<updated>2013-08-06T00:17:14Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Removal of NeedsWork following edits made to bottom section of page.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Bug'''&lt;br /&gt;
'''From ComputerCraft 1.3''' this API suffers from the problem of potentially spawning Java threads that live forever therefore, use of coroutines should be minimized. This is '''fixed in ComputerCraft 1.32+''', though.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''This is for the Coroutine API. For the Coroutine Object, visit [[Coroutine (type)]].''&lt;br /&gt;
&lt;br /&gt;
Coroutine is a default Lua 5.1 API defined [http://www.lua.org/manual/5.1/manual.html#5.2 here]. Please list any non-working functions on this page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: solid 1px black; margin: 2px; border-spacing: 0px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;3&amp;quot; style=&amp;quot;font-weight: bold; font-size: large; padding-bottom: .3em; border-bottom: solid #C9C9C9 1px; background: #D3FFC2; line-height:28px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Grid_disk.png|24px]]&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
Coroutine (API)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;width: 100px; background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Return&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;width: 350px; background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Method Name&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Description&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[Coroutine (type)|coroutine]] coro&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[coroutine.create]]({{type|function}} f)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Creates a new coroutine.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[Boolean (type)|boolean]] success, …&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[coroutine.resume]]({{type|coroutine}} coro, [var1], [var2], ...)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Starts or resumes an existing coroutine.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[Coroutine (type)|coroutine]] coro&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[coroutine.running]]()&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Returns the currently executing coroutine.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[String (type)|string]] status&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[coroutine.status]]({{type|coroutine}} coroutine)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Returns the status of the given coroutine.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[Function (type)|function]] coroutine wrapper&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[coroutine.wrap]]({{type|function}} function)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Creates a new coroutine and wraps it in a function.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[var3], [var4], …&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[coroutine.yield]]([var1], [var2], …)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Pauses the currently executing coroutine and passes control to its caller.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Coroutine States and Ancestry ==&lt;br /&gt;
Every coroutine is in one of four states:&lt;br /&gt;
* A ''suspended'' coroutine is one that has not yet been started or that has yielded. A suspended coroutine can become running if it is passed to [[coroutine.resume]].&lt;br /&gt;
* A ''running'' coroutine is one that is currently executing code. Only one coroutine can be running at a time on a particular computer. A running coroutine can become suspended if it [[coroutine.yield]], normal if it calls [[coroutine.resume]] on another coroutine, or dead by if it returns from its body function.&lt;br /&gt;
* A ''normal'' coroutine is one that, while running, resumed another coroutine (the ''child coroutine''). A normal coroutine can become running if its child calls [[coroutine.yield]] or returns from its function body.&lt;br /&gt;
* A ''dead'' coroutine is one that, while running, returned from its function body. A dead coroutine can never change state.&lt;br /&gt;
&lt;br /&gt;
While suspended and dead coroutines simply sit loose with no connections to other coroutines, normal and running coroutines have an ancestry relationship between them. Exactly one coroutine is running at any given time, and the running coroutine has no children. Every running or normal coroutine except the top-level BIOS coroutine has a parent, and this relationship forms a chain with one end (the furthest ancestor) being the top-level BIOS coroutine and the other end (the furthest descendant) being the running coroutine. Remember that only the running coroutine can actually execute code, so any functions invoked must be invoked by that coroutine. Then, calling [[coroutine.resume]] makes the chain longer by taking a previously suspended coroutine, hanging it underneath the current coroutine as a new child, and making the current coroutine normal and the new child running. Meanwhile, calling [[coroutine.yield]] makes the chain shorter by turning the currently executing coroutine into a suspended coroutine, detaching it from the chain, and letting its former parent become running.&lt;br /&gt;
&lt;br /&gt;
It is important not to confuse this coroutine chain with the function call stack. Each individual coroutine contains a complete function call stack of its own, rooted at the coroutine’s body function, whether the coroutine is running, normal, or suspended; the chain described in the previous paragraph refers to how entire coroutines are connected together.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
As the coroutine API is very tightly coupled and many of its function must be used to get any interesting results, examples are shown here instead of on the individual function pages.&lt;br /&gt;
&lt;br /&gt;
=== Using the Basic Coroutine Functions ===&lt;br /&gt;
This example demonstrates using the basic coroutine functions to pass control and data between coroutines. This example prints the numbers 1 through 17 in order, showing how control flow moves through the main program coroutine and the two created coroutines, while using assertions to show how data flows through the program:&lt;br /&gt;
&lt;br /&gt;
 -- These variables will hold the coroutine objects.&lt;br /&gt;
 local c1 = nil&lt;br /&gt;
 local c2 = nil&lt;br /&gt;
 &lt;br /&gt;
 -- This function will be the body of the first coroutine.&lt;br /&gt;
 local function f1(x)&lt;br /&gt;
   -- The main code, below, starts c1 first, passing 1.&lt;br /&gt;
   -- Thus c1 should be running, c2 should be suspended (not started yet), and x should receive the value from main, 1.&lt;br /&gt;
   -- STEP 2: Check these assumptions.&lt;br /&gt;
   print(2)&lt;br /&gt;
   assert(coroutine.status(c1) == &amp;quot;running&amp;quot;)&lt;br /&gt;
   assert(coroutine.status(c2) == &amp;quot;suspended&amp;quot;)&lt;br /&gt;
   assert(x == 1)&lt;br /&gt;
   -- STEP 3: Run c2 until it yields, start it off with the value 2.&lt;br /&gt;
   print(3)&lt;br /&gt;
   success, value = coroutine.resume(c2, 2)&lt;br /&gt;
   assert(success)&lt;br /&gt;
   -- In step 6, c2 yields and passes back the value 3.&lt;br /&gt;
   -- Then c2, having yielded, should be suspended, and c1 should be running again.&lt;br /&gt;
   -- STEP 7: Check all that.&lt;br /&gt;
   print(7)&lt;br /&gt;
   assert(coroutine.status(c1) == &amp;quot;running&amp;quot;)&lt;br /&gt;
   assert(coroutine.status(c2) == &amp;quot;suspended&amp;quot;)&lt;br /&gt;
   assert(value == 3)&lt;br /&gt;
   -- STEP 8: Run c2 again, passing it the value 4.&lt;br /&gt;
   -- Since c2 has already run before, this time the 4 will come out of the yield() instead of appear as a function parameter.&lt;br /&gt;
   print(8)&lt;br /&gt;
   success, value = coroutine.resume(c2, 4)&lt;br /&gt;
   -- In step 10, c2 yields and passes back the value 5.&lt;br /&gt;
   -- Then c2, having yielded, should be suspended, and c1 should be running again.&lt;br /&gt;
   -- STEP 11: Check all that.&lt;br /&gt;
   print(11)&lt;br /&gt;
   assert(coroutine.status(c1) == &amp;quot;running&amp;quot;)&lt;br /&gt;
   assert(coroutine.status(c2) == &amp;quot;suspended&amp;quot;)&lt;br /&gt;
   assert(value == 5)&lt;br /&gt;
   -- STEP 12: Yield, turning c1 back into a suspended coroutine and continuing execution of the main program, passing back value 6.&lt;br /&gt;
   print(12)&lt;br /&gt;
   value = coroutine.yield(6)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 -- This function will be the body of the second coroutine.&lt;br /&gt;
 local function f2(x)&lt;br /&gt;
   -- The first time c2 is run, it is run from f1, which passes 2.&lt;br /&gt;
   -- Thus c1 should be normal (as we are nested inside it), c2 should be running, and x should receive the value from f1, 2.&lt;br /&gt;
   -- STEP 4: Check these assumptions.&lt;br /&gt;
   print(4)&lt;br /&gt;
   assert(coroutine.status(c1) == &amp;quot;normal&amp;quot;)&lt;br /&gt;
   assert(coroutine.status(c2) == &amp;quot;running&amp;quot;)&lt;br /&gt;
   assert(x == 2)&lt;br /&gt;
   -- Because c1 is not suspended, we should not be able to resume it.&lt;br /&gt;
   -- STEP 5: Check this is correct.&lt;br /&gt;
   print(5)&lt;br /&gt;
   success, value = coroutine.resume(c1)&lt;br /&gt;
   assert(not success)&lt;br /&gt;
   assert(value == &amp;quot;cannot resume normal coroutine&amp;quot;)&lt;br /&gt;
   -- STEP 6: Yield, turning c2 back into a suspended coroutine and continuing execution of c1, passing back value 3.&lt;br /&gt;
   print(6)&lt;br /&gt;
   value = coroutine.yield(3)&lt;br /&gt;
   -- In step 8, c1 resumed c2 again and passed the value 4.&lt;br /&gt;
   -- c2 should now be running again, and c1 normal again.&lt;br /&gt;
   -- STEP 9: Check all that.&lt;br /&gt;
   print(9)&lt;br /&gt;
   assert(coroutine.status(c1) == &amp;quot;normal&amp;quot;)&lt;br /&gt;
   assert(coroutine.status(c2) == &amp;quot;running&amp;quot;)&lt;br /&gt;
   assert(value == 4)&lt;br /&gt;
   -- STEP 10: Yield, turning c2 back into a suspended coroutine and continuing execution of c1, passing back value 5.&lt;br /&gt;
   print(10)&lt;br /&gt;
   value = coroutine.yield(5)&lt;br /&gt;
   -- In step 14, the main program resumed c2 directly and passed the value 7, bypassing c1.&lt;br /&gt;
   -- So c2 should be running and c1 should be suspended.&lt;br /&gt;
   -- STEP 15: Check all that.&lt;br /&gt;
   print(15)&lt;br /&gt;
   assert(coroutine.status(c1) == &amp;quot;suspended&amp;quot;)&lt;br /&gt;
   assert(coroutine.status(c2) == &amp;quot;running&amp;quot;)&lt;br /&gt;
   assert(value == 7)&lt;br /&gt;
   -- STEP 16: Now die, returning value 8 to the main program.&lt;br /&gt;
   print(16)&lt;br /&gt;
   return 8&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 -- Construct the two coroutines.&lt;br /&gt;
 c1 = coroutine.create(f1)&lt;br /&gt;
 c2 = coroutine.create(f2)&lt;br /&gt;
 &lt;br /&gt;
 -- Newly constructed coroutines are always suspended.&lt;br /&gt;
 assert(coroutine.status(c1) == &amp;quot;suspended&amp;quot;)&lt;br /&gt;
 assert(coroutine.status(c2) == &amp;quot;suspended&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 -- STEP 1: Run c1 until it yields, starting it off with the value 1.&lt;br /&gt;
 print(1)&lt;br /&gt;
 success, value = coroutine.resume(c1, 1)&lt;br /&gt;
 assert(success)&lt;br /&gt;
 &lt;br /&gt;
 -- In step 12, c1 should have yielded and returned the value 6.&lt;br /&gt;
 -- So now c1 and c2 should both be suspended.&lt;br /&gt;
 -- STEP 13: Check all that.&lt;br /&gt;
 print(13)&lt;br /&gt;
 assert(coroutine.status(c1) == &amp;quot;suspended&amp;quot;)&lt;br /&gt;
 assert(coroutine.status(c2) == &amp;quot;suspended&amp;quot;)&lt;br /&gt;
 assert(value == 6)&lt;br /&gt;
 &lt;br /&gt;
 -- STEP 14: Run c2 directly, NOT nested inside c1 this time, passing it the value 7.&lt;br /&gt;
 print(14)&lt;br /&gt;
 success, value = coroutine.resume(c2, 7)&lt;br /&gt;
 assert(success)&lt;br /&gt;
 &lt;br /&gt;
 -- c2 should have exited normally, returning the value 8.&lt;br /&gt;
 -- Therefore c1 should still be suspended, but c2 should be dead.&lt;br /&gt;
 -- STEP 17: Check all that.&lt;br /&gt;
 print(17)&lt;br /&gt;
 assert(coroutine.status(c1) == &amp;quot;suspended&amp;quot;)&lt;br /&gt;
 assert(coroutine.status(c2) == &amp;quot;dead&amp;quot;)&lt;br /&gt;
 assert(value == 8)&lt;br /&gt;
&lt;br /&gt;
=== Using Coroutine Wrapper Functions ===&lt;br /&gt;
This second example is virtually identical, but shows using [[coroutine.wrap]] and wrapper functions instead of the basic coroutine functions (checks of [[coroutine.status]] have been removed as the raw coroutine objects are not available):&lt;br /&gt;
&lt;br /&gt;
 -- These variables will hold the coroutine wrapper functions.&lt;br /&gt;
 local cw1 = nil&lt;br /&gt;
 local cw2 = nil&lt;br /&gt;
 &lt;br /&gt;
 -- This function will be the body of the first coroutine.&lt;br /&gt;
 local function f1(x)&lt;br /&gt;
   -- The main code, below, starts c1 first, passing 1.&lt;br /&gt;
   -- Thus c1 should be running, c2 should be suspended (not started yet), and x should receive the value from main, 1.&lt;br /&gt;
   -- STEP 2: Check these assumptions.&lt;br /&gt;
   print(2)&lt;br /&gt;
   assert(x == 1)&lt;br /&gt;
   -- STEP 3: Run c2 until it yields, start it off with the value 2.&lt;br /&gt;
   print(3)&lt;br /&gt;
   value = cw2(2)&lt;br /&gt;
   -- In step 6, c2 yields and passes back the value 3.&lt;br /&gt;
   -- Then c2, having yielded, should be suspended, and c1 should be running again.&lt;br /&gt;
   -- STEP 7: Check all that.&lt;br /&gt;
   print(7)&lt;br /&gt;
   assert(value == 3)&lt;br /&gt;
   -- STEP 8: Run c2 again, passing it the value 4.&lt;br /&gt;
   -- Since c2 has already run before, this time the 4 will come out of the yield() instead of appear as a function parameter.&lt;br /&gt;
   print(8)&lt;br /&gt;
   value = cw2(4)&lt;br /&gt;
   -- In step 10, c2 yields and passes back the value 5.&lt;br /&gt;
   -- Then c2, having yielded, should be suspended, and c1 should be running again.&lt;br /&gt;
   -- STEP 11: Check all that.&lt;br /&gt;
   print(11)&lt;br /&gt;
   assert(value == 5)&lt;br /&gt;
   -- STEP 12: Yield, turning c1 back into a suspended coroutine and continuing execution of the main program, passing back value 6.&lt;br /&gt;
   print(12)&lt;br /&gt;
   value = coroutine.yield(6)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 -- This function will be the body of the second coroutine.&lt;br /&gt;
 local function f2(x)&lt;br /&gt;
   -- The first time c2 is run, it is run from f1, which passes 2.&lt;br /&gt;
   -- Thus c1 should be normal (as we are nested inside it), c2 should be running, and x should receive the value from f1, 2.&lt;br /&gt;
   -- STEP 4: Check these assumptions.&lt;br /&gt;
   print(4)&lt;br /&gt;
   assert(x == 2)&lt;br /&gt;
   -- Because c1 is not suspended, we should not be able to resume it.&lt;br /&gt;
   -- STEP 5: Check this is correct (we must use pcall because an error will be raised).&lt;br /&gt;
   print(5)&lt;br /&gt;
   success, value = pcall(cw1)&lt;br /&gt;
   assert(not success)&lt;br /&gt;
   -- STEP 6: Yield, turning c2 back into a suspended coroutine and continuing execution of c1, passing back value 3.&lt;br /&gt;
   print(6)&lt;br /&gt;
   value = coroutine.yield(3)&lt;br /&gt;
   -- In step 8, c1 resumed c2 again and passed the value 4.&lt;br /&gt;
   -- c2 should now be running again, and c1 normal again.&lt;br /&gt;
   -- STEP 9: Check all that.&lt;br /&gt;
   print(9)&lt;br /&gt;
   assert(value == 4)&lt;br /&gt;
   -- STEP 10: Yield, turning c2 back into a suspended coroutine and continuing execution of c1, passing back value 5.&lt;br /&gt;
   print(10)&lt;br /&gt;
   value = coroutine.yield(5)&lt;br /&gt;
   -- In step 14, the main program resumed c2 directly and passed the value 7, bypassing c1.&lt;br /&gt;
   -- So c2 should be running and c1 should be suspended.&lt;br /&gt;
   -- STEP 15: Check all that.&lt;br /&gt;
   print(15)&lt;br /&gt;
   assert(value == 7)&lt;br /&gt;
   -- STEP 16: Now die, returning value 8 to the main program.&lt;br /&gt;
   print(16)&lt;br /&gt;
   return 8&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 -- Construct the two coroutine wrappers.&lt;br /&gt;
 cw1 = coroutine.wrap(f1)&lt;br /&gt;
 cw2 = coroutine.wrap(f2)&lt;br /&gt;
 &lt;br /&gt;
 -- STEP 1: Run cw1 until it yields, starting it off with the value 1.&lt;br /&gt;
 print(1)&lt;br /&gt;
 value = cw1(1)&lt;br /&gt;
 &lt;br /&gt;
 -- In step 12, c1 should have yielded and returned the value 6.&lt;br /&gt;
 -- So now c1 and c2 should both be suspended.&lt;br /&gt;
 -- STEP 13: Check all that.&lt;br /&gt;
 print(13)&lt;br /&gt;
 assert(value == 6)&lt;br /&gt;
 &lt;br /&gt;
 -- STEP 14: Run c2 directly, NOT nested inside c1 this time, passing it the value 7.&lt;br /&gt;
 print(14)&lt;br /&gt;
 value = cw2(7)&lt;br /&gt;
 &lt;br /&gt;
 -- c2 should have exited normally, returning the value 8.&lt;br /&gt;
 -- Therefore c1 should still be suspended, but c2 should be dead.&lt;br /&gt;
 -- STEP 17: Check all that.&lt;br /&gt;
 print(17)&lt;br /&gt;
 assert(value == 8)&lt;br /&gt;
&lt;br /&gt;
== Interaction with Other APIs ==&lt;br /&gt;
The [[OS (API)#pullEvent|os.pullEventRaw]] (and therefore [[os.pullEvent]]) functions are built on top of coroutines: &amp;lt;code&amp;gt;os.pullEventRaw&amp;lt;/code&amp;gt; actually just calls [[coroutine.yield]], passing the event type filter up to the parent coroutine. The parent coroutine is expected to wait until an event of the required type arrives, then use [[coroutine.resume]] to pass the event to the suspended coroutine (where it will be returned from &amp;lt;code&amp;gt;os.pullEventRaw&amp;lt;/code&amp;gt;). If you use the [[Parallel (API)|parallel API]], this is exactly what [[parallel.waitForAny]] and [[parallel.waitForAll]] do: they pull events from the system event queue (or even from a higher invocation of &amp;lt;code&amp;gt;parallel.waitForAny&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;parallel.waitForAll&amp;lt;/code&amp;gt;!) and deliver them to all nested coroutines. Therefore, the easiest way to use coroutines is the parallel API, if it works for your situation. However, in the event that you are not able to use the parallel API (e.g. if you need to add and remove coroutines from the executing set dynamically), you can build your own dispatcher that delivers events in the same way as the parallel API—looking at the source code to the parallel API may be useful here.&lt;br /&gt;
&lt;br /&gt;
If you choose to use coroutines in a different way, then &amp;lt;code&amp;gt;os.pullEventRaw&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;os.pullEvent&amp;lt;/code&amp;gt; will not work. This in turn will break any other API function which is written on top of &amp;lt;code&amp;gt;os.pullEvent&amp;lt;/code&amp;gt;. As a guideline, nearly any API function that can possibly take time to complete will fall into this category; some examples are:&lt;br /&gt;
* [[rednet.receive]] blocks until either a [[Rednet message (event)|rednet_message event]] or (if a timeout was requested) a matching [[Timer (event)|timer event]] occurs.&lt;br /&gt;
* [[Gps (API)|gps.locate]] blocks until either a number of [[Modem message (event)|modem_message events]] or (if a timeout was requested) a matching [[Timer (event)|timer event]] occurs.&lt;br /&gt;
* [[http.get]] blocks until an [[Http success (event)|HTTP success event]] or [[Http failure (event)|HTTP failure event]] occurs.&lt;br /&gt;
* [[IO (API)|io.read]] and the built-in [[read]] functions block waiting for, presumably, either [[Char (event)|char events]] or [[Key (event)|key events]].&lt;br /&gt;
* [[os.sleep]] blocks until a matching [[Timer (event)|timer event]] occurs.&lt;br /&gt;
* [[textutils.slowPrint]] calls [[os.sleep]].&lt;br /&gt;
* [[textutils.pagedPrint]] blocks until a [[Key (event)|key event]] occurs for each page.&lt;br /&gt;
* Most of the functions in the [[Turtle (API)|turtle API]] (with the exception of [[turtle.getItemCount]], [[turtle.getItemSpace]], and [[turtle.getFuelLevel]]) block waiting for a [[Turtle response (event)|turtle response event]].&lt;br /&gt;
&lt;br /&gt;
Most of these can be worked around by using non-blocking equivalents that return immediately and then queue an event on completion (such as using [[http.request]]) or that deliver an event unconditionally (such as [[Char_(event)|char]] for keyboard input), then handling events in a way that is suitable for the application. However, if possible, it will often be easier to implement event dispatching instead, remembering that [[os.queueEvent]] can be used for inter-coroutine communication within an application. Another alternative, if you must use a custom protocol between your coroutines and dispatcher, might be to replace &amp;lt;code&amp;gt;os.pullEventRaw&amp;lt;/code&amp;gt; with a new function that uses a mechanism appropriate to the application.&lt;br /&gt;
&lt;br /&gt;
[[Category:APIs]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Talk:Coroutine_(API)&amp;diff=5719</id>
		<title>Talk:Coroutine (API)</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Talk:Coroutine_(API)&amp;diff=5719"/>
				<updated>2013-05-28T14:04:39Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bottom section (Interaction with other APIs) is written upside-down. It would be more useful to start out talking about how the event-based model ComputerCraft uses actually utilizes coroutines and the .yield and .resume parameters and return values. That is the primary use case for coroutines in ComputerCraft, so it would be better to lead with that, as it will cause less confusion among new users. From there, it would be good to mention that if one does desire to deviate from the event-based model ComputerCraft uses, that one should avoid using (or add special handling for) all of the functions which wait for events. &amp;quot;Blocking&amp;quot; is also a misleading term, since it implies that the execution point gets stuck in that function (which would block other coroutines from running), when the truth of the matter is that it simply yields execution. &amp;quot;Yielding&amp;quot; would be a better term. [[User:Lyqyd|Lyqyd]] 15:53, 28 May 2013 (MSK)&lt;br /&gt;
&lt;br /&gt;
:Better? [[User:Hawk777|Hawk777]] 17:41, 28 May 2013 (MSK)&lt;br /&gt;
&lt;br /&gt;
::Much better, thanks! [[User:Lyqyd|Lyqyd]] 18:04, 28 May 2013 (MSK)&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Talk:Coroutine_(API)&amp;diff=5716</id>
		<title>Talk:Coroutine (API)</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Talk:Coroutine_(API)&amp;diff=5716"/>
				<updated>2013-05-28T11:53:51Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Created page with &amp;quot;Bottom section (Interaction with other APIs) is written upside-down. It would be more useful to start out talking about how the event-based model ComputerCraft uses actually u...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bottom section (Interaction with other APIs) is written upside-down. It would be more useful to start out talking about how the event-based model ComputerCraft uses actually utilizes coroutines and the .yield and .resume parameters and return values. That is the primary use case for coroutines in ComputerCraft, so it would be better to lead with that, as it will cause less confusion among new users. From there, it would be good to mention that if one does desire to deviate from the event-based model ComputerCraft uses, that one should avoid using (or add special handling for) all of the functions which wait for events. &amp;quot;Blocking&amp;quot; is also a misleading term, since it implies that the execution point gets stuck in that function (which would block other coroutines from running), when the truth of the matter is that it simply yields execution. &amp;quot;Yielding&amp;quot; would be a better term. [[User:Lyqyd|Lyqyd]] 15:53, 28 May 2013 (MSK)&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Wiki_Todo&amp;diff=5715</id>
		<title>Wiki Todo</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Wiki_Todo&amp;diff=5715"/>
				<updated>2013-05-26T21:44:32Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;padding-left: 8px; float: right&amp;quot;&amp;gt;{{List of Administrators}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;span style='font-size: 132%; font-weight:bold;'&amp;gt;This page lists where work is needed to be done on the wiki. If you would like to help, we ask that you please make an account and help wherever you can.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''If you need to contact an Administrator, please visit an admin's userpage, and leave a note on their talk page.''&lt;br /&gt;
&lt;br /&gt;
'''If you make a change here, please give us as much detail as you can, and sign the end of your change using four tildes, like so: &amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;. This allows us to get back to you if we need more information.'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Missing &amp;amp; NeedsWork Pages ==&lt;br /&gt;
* The [[:Category:Pages_Needing_Changes|Pages Needing Changes]] list shows all the pages that have been tagged with &amp;lt;nowiki&amp;gt;{{NeedsWork}}&amp;lt;/nowiki&amp;gt; or &amp;lt;nowiki&amp;gt;{{Stub}}&amp;lt;/nowiki&amp;gt;. These pages either need more information, to be tidied, re-worded or adjusted, or just needs some TLC.&lt;br /&gt;
* The [[Special:WantedPages| Wanted Pages]] list shows all the pages that are missing (have been linked to, but aren't there). You should first check that the page being requested doesn't already exist (in case the person misspelled the page) and then, if you're feeling adventurous, put together a page. You can always come back, or tag the page with a &amp;lt;nowiki&amp;gt;{{NeedsWork}}&amp;lt;/nowiki&amp;gt; or a &amp;lt;nowiki&amp;gt;{{Stub}}&amp;lt;/nowiki&amp;gt; tag. If you need help, ask us! We don't bite. &lt;br /&gt;
&lt;br /&gt;
== Additional Tasks ==&lt;br /&gt;
*[[Textutils_(API)|Textutils]] (Needs &amp;lt;s&amp;gt;5&amp;lt;/s&amp;gt; 3 function pages, &amp;lt;s&amp;gt;2&amp;lt;/s&amp;gt; 1 function description)&lt;br /&gt;
*[[Vector_(API)|Vector]] &amp;lt;s&amp;gt;(Needs link to page explaining or description explaining what a vector is and function pages)&amp;lt;/s&amp;gt;&lt;br /&gt;
** &amp;lt;s&amp;gt;It now has a link to Wikipedia, but it doesn't use any of the method or example templates. Can we get this rectified? ''[[User:AfterLifeLochie|AfterLifeLochie]] 02:14, 29 November 2012 (MSK)''&amp;lt;/s&amp;gt;&lt;br /&gt;
** Now has pages to every function in a standard template.  May need to double check work for any broken links or missing pages.  Examples and descriptions probably need work. ''[[User:MafiaMoe|MafiaMoe]] 18:38, 23 February 2013 (MSK)''&lt;br /&gt;
*[[Paintutils_(API)|Paintutils]] (Needs 3 function pages)&lt;br /&gt;
** &amp;lt;s&amp;gt;It also doesn't use any of the methods or example templates. Can we get this rectified? ''[[User:AfterLifeLochie|AfterLifeLochie]] 02:14, 29 November 2012 (MSK)''&amp;lt;/s&amp;gt;&lt;br /&gt;
** Apparently the thre new functions have been added, and are waiting on approval? Do we need approval for these things? --[[User:Cranium|Cranium]] 15:49, 23 April 2013 (MSK)&lt;br /&gt;
* Some links don't link to their correct pages, resulting in page duplication and wasting time deleting pages. Can sometimes be found in the [[Special:WantedPages| Wanted Pages.]]&lt;br /&gt;
* Since {{type|int}} is intended to be deleted, are we to be switching those links to {{type|number}}? --[[User:Cranium|Cranium]] 19:57, 10 May 2013 (MSK)&lt;br /&gt;
*[[Coroutine_(API)|Coroutine]] (Bottom section on interaction with other APIs is completely misleading; needs either re-write or removal) [[User:Lyqyd|Lyqyd]] 01:44, 27 May 2013 (MSK)&lt;br /&gt;
&lt;br /&gt;
== Wiki Admin Things ==&lt;br /&gt;
=== General Wiki Stuff ===&lt;br /&gt;
* &amp;lt;s&amp;gt;Random Links, such as mining_turtle via image links, any chance of removing them? &amp;lt;/s&amp;gt;&lt;br /&gt;
** Uh, no. They're generated through templates doing weird things, and fixing them is a real pain (template re factorization, renaming files, etc). I have fixed some but not all. ''[[User:AfterLifeLochie|AfterLifeLochie]] 16:46, 29 December 2012 (MSK)''&lt;br /&gt;
[[Category:Lists]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Coroutine_(API)&amp;diff=5714</id>
		<title>Coroutine (API)</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Coroutine_(API)&amp;diff=5714"/>
				<updated>2013-05-26T21:43:03Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: 'Interactions' section at bottom is highly misleading.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NeedsWork}}&lt;br /&gt;
:{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Bug'''&lt;br /&gt;
'''From ComputerCraft 1.3''' this API suffers from the problem of potentially spawning Java threads that live forever therefore, use of coroutines should be minimized. This is '''fixed in ComputerCraft 1.32+''', though.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
''This is for the Coroutine API. For the Coroutine Object, visit [[Coroutine (type)]].''&lt;br /&gt;
&lt;br /&gt;
Coroutine is a default Lua 5.1 API defined [http://www.lua.org/manual/5.1/manual.html#5.2 here]. Please list any non-working functions on this page.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: solid 1px black; margin: 2px; border-spacing: 0px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;3&amp;quot; style=&amp;quot;font-weight: bold; font-size: large; padding-bottom: .3em; border-bottom: solid #C9C9C9 1px; background: #D3FFC2; line-height:28px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Grid_disk.png|24px]]&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
Coroutine (API)&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;width: 100px; background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Return&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;width: 350px; background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Method Name&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Description&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;{{Type|coroutine}} coro&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[coroutine.create]]({{Type|function}} f)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Creates a new coroutine.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;{{Type|boolean}} success, …&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[coroutine.resume]]({{Type|coroutine}} coro, [var1], [var2], ...)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Starts or resumes an existing coroutine.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;{{Type|coroutine}} coro&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[coroutine.running]]()&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Returns the currently executing coroutine.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;{{Type|string}} status&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[coroutine.status]]({{type|coroutine}} coroutine)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Returns the status of the given coroutine.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;{{Type|function}} coroutine wrapper&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[coroutine.wrap]]({{type|function}} function)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Creates a new coroutine and wraps it in a function.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[var3], [var4], …&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;[[coroutine.yield]]([var1], [var2], …)&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Pauses the currently executing coroutine and passes control to its caller.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Coroutine States and Ancestry ==&lt;br /&gt;
Every coroutine is in one of four states:&lt;br /&gt;
* A ''suspended'' coroutine is one that has not yet been started or that has yielded. A suspended coroutine can become running if it is passed to [[coroutine.resume]].&lt;br /&gt;
* A ''running'' coroutine is one that is currently executing code. Only one coroutine can be running at a time on a particular computer. A running coroutine can become suspended if it [[coroutine.yield]], normal if it calls [[coroutine.resume]] on another coroutine, or dead by if it returns from its body function.&lt;br /&gt;
* A ''normal'' coroutine is one that, while running, resumed another coroutine (the ''child coroutine''). A normal coroutine can become running if its child calls [[coroutine.yield]] or returns from its function body.&lt;br /&gt;
* A ''dead'' coroutine is one that, while running, returned from its function body. A dead coroutine can never change state.&lt;br /&gt;
&lt;br /&gt;
While suspended and dead coroutines simply sit loose with no connections to other coroutines, normal and running coroutines have an ancestry relationship between them. Exactly one coroutine is running at any given time, and the running coroutine has no children. Every running or normal coroutine except the top-level BIOS coroutine has a parent, and this relationship forms a chain with one end (the furthest ancestor) being the top-level BIOS coroutine and the other end (the furthest descendant) being the running coroutine. Remember that only the running coroutine can actually execute code, so any functions invoked must be invoked by that coroutine. Then, calling [[coroutine.resume]] makes the chain longer by taking a previously suspended coroutine, hanging it underneath the current coroutine as a new child, and making the current coroutine normal and the new child running. Meanwhile, calling [[coroutine.yield]] makes the chain shorter by turning the currently executing coroutine into a suspended coroutine, detaching it from the chain, and letting its former parent become running.&lt;br /&gt;
&lt;br /&gt;
It is important not to confuse this coroutine chain with the function call stack. Each individual coroutine contains a complete function call stack of its own, rooted at the coroutine’s body function, whether the coroutine is running, normal, or suspended; the chain described in the previous paragraph refers to how entire coroutines are connected together.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
As the coroutine API is very tightly coupled and many of its function must be used to get any interesting results, examples are shown here instead of on the individual function pages.&lt;br /&gt;
&lt;br /&gt;
=== Using the Basic Coroutine Functions ===&lt;br /&gt;
This example demonstrates using the basic coroutine functions to pass control and data between coroutines. This example prints the numbers 1 through 17 in order, showing how control flow moves through the main program coroutine and the two created coroutines, while using assertions to show how data flows through the program:&lt;br /&gt;
&lt;br /&gt;
 -- These variables will hold the coroutine objects.&lt;br /&gt;
 local c1 = nil&lt;br /&gt;
 local c2 = nil&lt;br /&gt;
 &lt;br /&gt;
 -- This function will be the body of the first coroutine.&lt;br /&gt;
 local function f1(x)&lt;br /&gt;
   -- The main code, below, starts c1 first, passing 1.&lt;br /&gt;
   -- Thus c1 should be running, c2 should be suspended (not started yet), and x should receive the value from main, 1.&lt;br /&gt;
   -- STEP 2: Check these assumptions.&lt;br /&gt;
   print(2)&lt;br /&gt;
   assert(coroutine.status(c1) == &amp;quot;running&amp;quot;)&lt;br /&gt;
   assert(coroutine.status(c2) == &amp;quot;suspended&amp;quot;)&lt;br /&gt;
   assert(x == 1)&lt;br /&gt;
   -- STEP 3: Run c2 until it yields, start it off with the value 2.&lt;br /&gt;
   print(3)&lt;br /&gt;
   success, value = coroutine.resume(c2, 2)&lt;br /&gt;
   assert(success)&lt;br /&gt;
   -- In step 6, c2 yields and passes back the value 3.&lt;br /&gt;
   -- Then c2, having yielded, should be suspended, and c1 should be running again.&lt;br /&gt;
   -- STEP 7: Check all that.&lt;br /&gt;
   print(7)&lt;br /&gt;
   assert(coroutine.status(c1) == &amp;quot;running&amp;quot;)&lt;br /&gt;
   assert(coroutine.status(c2) == &amp;quot;suspended&amp;quot;)&lt;br /&gt;
   assert(value == 3)&lt;br /&gt;
   -- STEP 8: Run c2 again, passing it the value 4.&lt;br /&gt;
   -- Since c2 has already run before, this time the 4 will come out of the yield() instead of appear as a function parameter.&lt;br /&gt;
   print(8)&lt;br /&gt;
   success, value = coroutine.resume(c2, 4)&lt;br /&gt;
   -- In step 10, c2 yields and passes back the value 5.&lt;br /&gt;
   -- Then c2, having yielded, should be suspended, and c1 should be running again.&lt;br /&gt;
   -- STEP 11: Check all that.&lt;br /&gt;
   print(11)&lt;br /&gt;
   assert(coroutine.status(c1) == &amp;quot;running&amp;quot;)&lt;br /&gt;
   assert(coroutine.status(c2) == &amp;quot;suspended&amp;quot;)&lt;br /&gt;
   assert(value == 5)&lt;br /&gt;
   -- STEP 12: Yield, turning c1 back into a suspended coroutine and continuing execution of the main program, passing back value 6.&lt;br /&gt;
   print(12)&lt;br /&gt;
   value = coroutine.yield(6)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 -- This function will be the body of the second coroutine.&lt;br /&gt;
 local function f2(x)&lt;br /&gt;
   -- The first time c2 is run, it is run from f1, which passes 2.&lt;br /&gt;
   -- Thus c1 should be normal (as we are nested inside it), c2 should be running, and x should receive the value from f1, 2.&lt;br /&gt;
   -- STEP 4: Check these assumptions.&lt;br /&gt;
   print(4)&lt;br /&gt;
   assert(coroutine.status(c1) == &amp;quot;normal&amp;quot;)&lt;br /&gt;
   assert(coroutine.status(c2) == &amp;quot;running&amp;quot;)&lt;br /&gt;
   assert(x == 2)&lt;br /&gt;
   -- Because c1 is not suspended, we should not be able to resume it.&lt;br /&gt;
   -- STEP 5: Check this is correct.&lt;br /&gt;
   print(5)&lt;br /&gt;
   success, value = coroutine.resume(c1)&lt;br /&gt;
   assert(not success)&lt;br /&gt;
   assert(value == &amp;quot;cannot resume normal coroutine&amp;quot;)&lt;br /&gt;
   -- STEP 6: Yield, turning c2 back into a suspended coroutine and continuing execution of c1, passing back value 3.&lt;br /&gt;
   print(6)&lt;br /&gt;
   value = coroutine.yield(3)&lt;br /&gt;
   -- In step 8, c1 resumed c2 again and passed the value 4.&lt;br /&gt;
   -- c2 should now be running again, and c1 normal again.&lt;br /&gt;
   -- STEP 9: Check all that.&lt;br /&gt;
   print(9)&lt;br /&gt;
   assert(coroutine.status(c1) == &amp;quot;normal&amp;quot;)&lt;br /&gt;
   assert(coroutine.status(c2) == &amp;quot;running&amp;quot;)&lt;br /&gt;
   assert(value == 4)&lt;br /&gt;
   -- STEP 10: Yield, turning c2 back into a suspended coroutine and continuing execution of c1, passing back value 5.&lt;br /&gt;
   print(10)&lt;br /&gt;
   value = coroutine.yield(5)&lt;br /&gt;
   -- In step 14, the main program resumed c2 directly and passed the value 7, bypassing c1.&lt;br /&gt;
   -- So c2 should be running and c1 should be suspended.&lt;br /&gt;
   -- STEP 15: Check all that.&lt;br /&gt;
   print(15)&lt;br /&gt;
   assert(coroutine.status(c1) == &amp;quot;suspended&amp;quot;)&lt;br /&gt;
   assert(coroutine.status(c2) == &amp;quot;running&amp;quot;)&lt;br /&gt;
   assert(value == 7)&lt;br /&gt;
   -- STEP 16: Now die, returning value 8 to the main program.&lt;br /&gt;
   print(16)&lt;br /&gt;
   return 8&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 -- Construct the two coroutines.&lt;br /&gt;
 c1 = coroutine.create(f1)&lt;br /&gt;
 c2 = coroutine.create(f2)&lt;br /&gt;
 &lt;br /&gt;
 -- Newly constructed coroutines are always suspended.&lt;br /&gt;
 assert(coroutine.status(c1) == &amp;quot;suspended&amp;quot;)&lt;br /&gt;
 assert(coroutine.status(c2) == &amp;quot;suspended&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
 -- STEP 1: Run c1 until it yields, starting it off with the value 1.&lt;br /&gt;
 print(1)&lt;br /&gt;
 success, value = coroutine.resume(c1, 1)&lt;br /&gt;
 assert(success)&lt;br /&gt;
 &lt;br /&gt;
 -- In step 12, c1 should have yielded and returned the value 6.&lt;br /&gt;
 -- So now c1 and c2 should both be suspended.&lt;br /&gt;
 -- STEP 13: Check all that.&lt;br /&gt;
 print(13)&lt;br /&gt;
 assert(coroutine.status(c1) == &amp;quot;suspended&amp;quot;)&lt;br /&gt;
 assert(coroutine.status(c2) == &amp;quot;suspended&amp;quot;)&lt;br /&gt;
 assert(value == 6)&lt;br /&gt;
 &lt;br /&gt;
 -- STEP 14: Run c2 directly, NOT nested inside c1 this time, passing it the value 7.&lt;br /&gt;
 print(14)&lt;br /&gt;
 success, value = coroutine.resume(c2, 7)&lt;br /&gt;
 assert(success)&lt;br /&gt;
 &lt;br /&gt;
 -- c2 should have exited normally, returning the value 8.&lt;br /&gt;
 -- Therefore c1 should still be suspended, but c2 should be dead.&lt;br /&gt;
 -- STEP 17: Check all that.&lt;br /&gt;
 print(17)&lt;br /&gt;
 assert(coroutine.status(c1) == &amp;quot;suspended&amp;quot;)&lt;br /&gt;
 assert(coroutine.status(c2) == &amp;quot;dead&amp;quot;)&lt;br /&gt;
 assert(value == 8)&lt;br /&gt;
&lt;br /&gt;
=== Using Coroutine Wrapper Functions ===&lt;br /&gt;
This second example is virtually identical, but shows using [[coroutine.wrap]] and wrapper functions instead of the basic coroutine functions (checks of [[coroutine.status]] have been removed as the raw coroutine objects are not available):&lt;br /&gt;
&lt;br /&gt;
 -- These variables will hold the coroutine wrapper functions.&lt;br /&gt;
 local cw1 = nil&lt;br /&gt;
 local cw2 = nil&lt;br /&gt;
 &lt;br /&gt;
 -- This function will be the body of the first coroutine.&lt;br /&gt;
 local function f1(x)&lt;br /&gt;
   -- The main code, below, starts c1 first, passing 1.&lt;br /&gt;
   -- Thus c1 should be running, c2 should be suspended (not started yet), and x should receive the value from main, 1.&lt;br /&gt;
   -- STEP 2: Check these assumptions.&lt;br /&gt;
   print(2)&lt;br /&gt;
   assert(x == 1)&lt;br /&gt;
   -- STEP 3: Run c2 until it yields, start it off with the value 2.&lt;br /&gt;
   print(3)&lt;br /&gt;
   value = cw2(2)&lt;br /&gt;
   -- In step 6, c2 yields and passes back the value 3.&lt;br /&gt;
   -- Then c2, having yielded, should be suspended, and c1 should be running again.&lt;br /&gt;
   -- STEP 7: Check all that.&lt;br /&gt;
   print(7)&lt;br /&gt;
   assert(value == 3)&lt;br /&gt;
   -- STEP 8: Run c2 again, passing it the value 4.&lt;br /&gt;
   -- Since c2 has already run before, this time the 4 will come out of the yield() instead of appear as a function parameter.&lt;br /&gt;
   print(8)&lt;br /&gt;
   value = cw2(4)&lt;br /&gt;
   -- In step 10, c2 yields and passes back the value 5.&lt;br /&gt;
   -- Then c2, having yielded, should be suspended, and c1 should be running again.&lt;br /&gt;
   -- STEP 11: Check all that.&lt;br /&gt;
   print(11)&lt;br /&gt;
   assert(value == 5)&lt;br /&gt;
   -- STEP 12: Yield, turning c1 back into a suspended coroutine and continuing execution of the main program, passing back value 6.&lt;br /&gt;
   print(12)&lt;br /&gt;
   value = coroutine.yield(6)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 -- This function will be the body of the second coroutine.&lt;br /&gt;
 local function f2(x)&lt;br /&gt;
   -- The first time c2 is run, it is run from f1, which passes 2.&lt;br /&gt;
   -- Thus c1 should be normal (as we are nested inside it), c2 should be running, and x should receive the value from f1, 2.&lt;br /&gt;
   -- STEP 4: Check these assumptions.&lt;br /&gt;
   print(4)&lt;br /&gt;
   assert(x == 2)&lt;br /&gt;
   -- Because c1 is not suspended, we should not be able to resume it.&lt;br /&gt;
   -- STEP 5: Check this is correct (we must use pcall because an error will be raised).&lt;br /&gt;
   print(5)&lt;br /&gt;
   success, value = pcall(cw1)&lt;br /&gt;
   assert(not success)&lt;br /&gt;
   -- STEP 6: Yield, turning c2 back into a suspended coroutine and continuing execution of c1, passing back value 3.&lt;br /&gt;
   print(6)&lt;br /&gt;
   value = coroutine.yield(3)&lt;br /&gt;
   -- In step 8, c1 resumed c2 again and passed the value 4.&lt;br /&gt;
   -- c2 should now be running again, and c1 normal again.&lt;br /&gt;
   -- STEP 9: Check all that.&lt;br /&gt;
   print(9)&lt;br /&gt;
   assert(value == 4)&lt;br /&gt;
   -- STEP 10: Yield, turning c2 back into a suspended coroutine and continuing execution of c1, passing back value 5.&lt;br /&gt;
   print(10)&lt;br /&gt;
   value = coroutine.yield(5)&lt;br /&gt;
   -- In step 14, the main program resumed c2 directly and passed the value 7, bypassing c1.&lt;br /&gt;
   -- So c2 should be running and c1 should be suspended.&lt;br /&gt;
   -- STEP 15: Check all that.&lt;br /&gt;
   print(15)&lt;br /&gt;
   assert(value == 7)&lt;br /&gt;
   -- STEP 16: Now die, returning value 8 to the main program.&lt;br /&gt;
   print(16)&lt;br /&gt;
   return 8&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
 -- Construct the two coroutine wrappers.&lt;br /&gt;
 cw1 = coroutine.wrap(f1)&lt;br /&gt;
 cw2 = coroutine.wrap(f2)&lt;br /&gt;
 &lt;br /&gt;
 -- STEP 1: Run cw1 until it yields, starting it off with the value 1.&lt;br /&gt;
 print(1)&lt;br /&gt;
 value = cw1(1)&lt;br /&gt;
 &lt;br /&gt;
 -- In step 12, c1 should have yielded and returned the value 6.&lt;br /&gt;
 -- So now c1 and c2 should both be suspended.&lt;br /&gt;
 -- STEP 13: Check all that.&lt;br /&gt;
 print(13)&lt;br /&gt;
 assert(value == 6)&lt;br /&gt;
 &lt;br /&gt;
 -- STEP 14: Run c2 directly, NOT nested inside c1 this time, passing it the value 7.&lt;br /&gt;
 print(14)&lt;br /&gt;
 value = cw2(7)&lt;br /&gt;
 &lt;br /&gt;
 -- c2 should have exited normally, returning the value 8.&lt;br /&gt;
 -- Therefore c1 should still be suspended, but c2 should be dead.&lt;br /&gt;
 -- STEP 17: Check all that.&lt;br /&gt;
 print(17)&lt;br /&gt;
 assert(value == 8)&lt;br /&gt;
&lt;br /&gt;
== Interaction with Other APIs ==&lt;br /&gt;
Raw coroutines are not always safe to use with other API functions. The reason is that [[os.pullEventRaw]] (and therefore [[os.pullEvent]], which calls it) are themselves built using coroutines: &amp;lt;code&amp;gt;os.pullEventRaw&amp;lt;/code&amp;gt; actually invokes [[coroutine.yield]], passing the event type filter up to what it expects is the [[Parallel (API)|parallel API]], which would resume the coroutine once a matching event arrives. This is how the parallel API allows other code to run while one function is blocking waiting for an event. However, it means if you call &amp;lt;code&amp;gt;os.pullEventRaw&amp;lt;/code&amp;gt; ''or any other function that uses it'' while managing coroutines yourself, you will see a coroutine unexpectedly yield, with the parent [[coroutine.resume]] being passed as a return value the filter string passed to &amp;lt;code&amp;gt;os.pullEventRaw&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In this situation, it is essential that a developer carefully audit any APIs (s)he may wish to use to verify whether they could possibly block—many APIs, even those one might not expect, fall into this category. Some examples are:&lt;br /&gt;
* [[rednet.receive]] blocks until either a [[Rednet message (event)|rednet_message event]] or (if a timeout was requested) a matching [[Timer (event)|timer event]] occurs.&lt;br /&gt;
* [[Gps (API)|gps.locate]] blocks until either a number of [[Modem message (event)|modem_message events]] or (if a timeout was requested) a matching [[Timer (event)|timer event]] occurs.&lt;br /&gt;
* [[http.get]] blocks until an [[Http success (event)|HTTP success event]] or [[Http failure (event)|HTTP failure event]] occurs.&lt;br /&gt;
* [[IO (API)|io.read]] and the built-in [[read]] functions block waiting for, presumably, either [[Char (event)|char events]] or [[Key (event)|key events]].&lt;br /&gt;
* [[os.sleep]] blocks until a matching [[Timer (event)|timer event]] occurs.&lt;br /&gt;
* [[textutils.slowPrint]] calls [[os.sleep]].&lt;br /&gt;
* [[textutils.pagedPrint]] blocks until a [[Key (event)|key event]] occurs for each page.&lt;br /&gt;
* Most of the functions in the [[Turtle (API)|turtle API]] (with the exception of [[turtle.getItemCount]], [[turtle.getItemSpace]], and [[turtle.getFuelLevel]]) block waiting for a [[Turtle response (event)|turtle response event]].&lt;br /&gt;
&lt;br /&gt;
Although it is not always practical to do so, in some situations, the [[Parallel (API)|parallel API]] may be preferable to using coroutines directly, as it handles event dispatching properly. However, it does not allow chaining coroutine invocations, nor does it allow adding coroutines to the parallel set after parallel execution has started. If coroutines are to be used directly, an application may either ensure it avoids any blocking API calls, or may arrange to handle event dispatch the same way that the parallel API does so that the blocking functions work properly. For example, one might arrange the convention that the top-level coroutine in the application will call [[os.pullEvent]] and deliver any returned events to sub-coroutines, the same way that the parallel API does, thus allowing those sub-coroutines to themselves call [[os.pullEvent]], while insisting on a convention that more deeply nested coroutines never call [[os.pullEvent]] at all.&lt;br /&gt;
&lt;br /&gt;
[[Category:APIs]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Command_Block_(API)&amp;diff=5283</id>
		<title>Command Block (API)</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Command_Block_(API)&amp;diff=5283"/>
				<updated>2013-03-30T21:16:19Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Fix typo (Where does peripheral &amp;quot;warping&amp;quot; come from, anyhow?)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Command Block API allows you to run commands in a Command Block, using it as a peripheral.&lt;br /&gt;
(The peripheral can only be used if allowed in the config, which is default to false)&lt;br /&gt;
&lt;br /&gt;
Functions exposed by the Command Block, where commandBlock is wrapped to a command block:&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!style=&amp;quot;background:#EEE&amp;quot; width=&amp;quot;*&amp;quot;|Function&lt;br /&gt;
!style=&amp;quot;background:#EEE&amp;quot; width=&amp;quot;*&amp;quot;|Description&lt;br /&gt;
|-&lt;br /&gt;
|[[commandBlock.getCommand]]( )&lt;br /&gt;
|Returns a string containing the command currently inside the Command Block.&lt;br /&gt;
|-&lt;br /&gt;
|[[commandBlock.setCommand]]( [[string_(type)|string]] command )&lt;br /&gt;
|Sets the command in the Command Block. '''This does not run it.'''&lt;br /&gt;
|-&lt;br /&gt;
|[[commandBlock.runCommand]]( )&lt;br /&gt;
|Runs the command inside the Command Block previously set by [[commandBlock.setCommand]]( )&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Note==&lt;br /&gt;
All Command Block functions are to be used ''after'' wrapping the block in a peripheral.&lt;br /&gt;
'''example''':&lt;br /&gt;
&amp;lt;span&amp;gt;&lt;br /&gt;
 commandBlock = [[peripheral.wrap]](&amp;quot;left&amp;quot;)&lt;br /&gt;
 commandBlock.setCommand(&amp;quot;time set 1000&amp;quot;)&lt;br /&gt;
 commandBlock.runCommand()&lt;br /&gt;
 local currentCommand = commandBlock.getCommand()&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Peripheral APIs]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=OpenCCSensors&amp;diff=5197</id>
		<title>OpenCCSensors</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=OpenCCSensors&amp;diff=5197"/>
				<updated>2013-03-18T08:18:30Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Fix cubic dimension descriptions for block-based radii.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.computercraft.info/forums2/index.php?/topic/5996-144-cc-147-openccsensors/ OpenCCSensors] is a new, open-source, up to date replacement for [[CcSensors|CcSensors (outdated)]], allowing monitoring and gathering information from the Minecraft environment - including players, entities, proximity, world info, IndustrialCraft 2, BuildCraft 2, liquids, inventories - and more!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OpenCCSensors comes with its own API, and automatically installs a new program for you at /ocs/programs/sensorview. sensorview is a handy program for very quickly looking at the information gathered from your sensors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
http://www.youtube.com/watch?v=i8Bv7uKkIOM&amp;amp;feature=youtu.be&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: solid 1px black; margin: 2px; border-spacing: 0px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;font-weight: bold; font-size: large; padding-bottom: .3em; border-bottom: solid #C9C9C9 1px; background: #D3FFC2; line-height:28px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Grid_disk.png|24px]]&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
OpenCCSensors Peripherals&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;width: 350px; background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Name&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Description&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Sensor Peripheral&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Sensor Peripheral needs to be placed next to a computer and it has a single slot to insert a Sensor Card&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Obsidian |B1=Obsidian           |C1=Obsidian&lt;br /&gt;
 |A2=Redstone |B2=Obsidian        |C2=Redstone&lt;br /&gt;
 |A3=Stone |B3=Stone      |C3=Stone&lt;br /&gt;
 |Output=Sensor Peripheral&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
	&amp;lt;table style=&amp;quot;width: 100%; border-spacing: 0px;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;os.loadAPI(&amp;quot;ocs/apis/sensor&amp;quot;)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Load the sensor API&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;mySensor = sensor.wrap(side)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Returns the wrapped sensor on the side specified.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;mySensor.getTargets()&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Returns a a table of all the targets for mySensor, where the keys are used as a numerical index, and the values are each a table of basic details.&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;mySensor.getTargetDetails(key)&amp;lt;/td&amp;gt;&lt;br /&gt;
	&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Returns a table of full details for that particular target from the sensor mySensor - where the the &amp;quot;key&amp;quot; is the key returned from getTargets()&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;/table&amp;gt;&lt;br /&gt;
 &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Gauge Peripheral&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Gauge Peripheral can be placed onto the side of certain machines to get instant readings from them. Right now this only supports Batboxes, MFE's, MFSU, Mass fabricators and Nuclear reactors. We hope to expand this in the future as well as offer an API to re-program the gauge from a computer.&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=glass_pane |B1=Redstone           |C1=Monitor&lt;br /&gt;
 |Output=Gauge Peripheral&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: solid 1px black; margin: 2px; border-spacing: 0px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;font-weight: bold; font-size: large; padding-bottom: .3em; border-bottom: solid #C9C9C9 1px; background: #D3FFC2; line-height:28px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Grid_disk.png|24px]]&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
OpenCCSensors Sensor Cards&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;width: 350px; background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Name&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Description&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Inventory Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Inventory Sensor Card is capable of reading inventories of any chests or machines around the sensor. It gives full information about what item is in each slot.&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=wooden_plank           |C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Inventory Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Proximity Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Proximity Sensor Card is capable of detecting players and entities within it's range.&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=pressure_plate           |C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Proximity Sensor Card&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Industrial Craft 2 Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The IndustrialCraft Sensor Card is capable of interfacing and reading IC2 machine values (eg, EU in storage, etc).&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=copper_cable|C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Industrial Craft 2 Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;BuildCraft Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=lever           |C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Buildcraft Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Tank Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Tank sensor card is far more powerful than it first seems. This card not only reads actual tanks, but reads internal tanks within a variety of different machines, such as:&lt;br /&gt;
&lt;br /&gt;
Railcraft: Iron Tanks, Buildcraft: Tanks, Thermal Expansion: Aqueous Accumulator, Thermal Expansion: Igneous Extruder, Thermal Expansion: Glacial Precipitator, Thermal Expansion: Liquid Transposer, Thermal Expansion: Magma Crucible, Thermal Expansion: Magmatic Engine, Thermal Expansion: Steam Engine, Industrial Craft: Geothermal Generator, Thaumcraft: Crucible, Buildcraft: Tank, Buildcraft: Combustion Engine, Buildcraft: Pump, Buildcraft: Refinery, Forestry: Biogas Engine, Forestry: Fermenter, Forestry: Still, Forestry: Bottler, Forestry: Raintank, Forestry: Bio Generator, Forestry: Carpenter, Forestry: Moistener, Forestry: Squeezer, Forestry: Thermonic Fabricator, Extra Bees: Analyser, Extra Bees: Purifier, Extra Bees: Synthesizer, Extra Bees: Genepool, Extra Bees: Splicer, Railcraft: Hobbyist's Steam Engine, Railcraft: Commercial Steam Engine, Railcraft: Industrial Steam Engine, GregTech: Quantum Tank, GregTech: Thermal Generator&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=Bucket |C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Liquid Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;World Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The World Sensor Card is able to tell the time, weather, and more about the world.&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=ender_pearl |C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=World Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Dropped Item Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Dropped Item Sensor Card is able to locate and identify dropped items.&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=slime_ball |C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Dropped Item Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Sign Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Sign Sensor Card is capable of reading signs within it's range.&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=sign|C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Sign Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Thaumcraft Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Thaumcraft Card can read XP levels from a &amp;quot;brain in a jar&amp;quot; and read aspect levels from crucibles and jars&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=Goggles of Revealing|C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Thaumcraft Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Minecart Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Minecart Sensor Card can detect minecarts in the area and give basic information about them&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=Minecart|C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Minecart Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Sonic Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Sonic Sensor Card can detect blocks in the area and report if they're solid or liquid. &lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=Note Block|C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Sonic Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #E8E8E8;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Applied Energistics Sensor Card&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;This sensor card is similar to the inventory sensor card, but can read information from a ME Wireless Access Point in Applied Energistics. It also gives some other information regarding AE. New in OpenCCSensors 0.1.4b.&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Redstone |B1=Quartz Crystal|C1=Redstone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=paper |B3=paper      |C3=paper&lt;br /&gt;
 |Output=Applied Energistics Sensor Card&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: solid 1px black; margin: 2px; border-spacing: 0px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;font-weight: bold; font-size: large; padding-bottom: .3em; border-bottom: solid #C9C9C9 1px; background: #D3FFC2; line-height:28px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Grid_disk.png|24px]]&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
OpenCCSensors Sensor Card Upgrades&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;width: 350px; background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Name&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Description&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Range Extension Antenna&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Range Extension Antenna is used to upgrade sensor cards to Mk1, Mk2, and Mk3. &lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |B1=redstone_torch           &lt;br /&gt;
 |A2=stone |B2=Redstone        |C2=stone&lt;br /&gt;
 |A3=stone |B3=iron_ingot      |C3=stone&lt;br /&gt;
 |Output=Range Extension Antenna&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Signal Amplifier&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Signal Amplifier is used to upgrade sensor cards to Mk3 and Mk4. &lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=stone |B1=Gold_Ingot|C1=stone&lt;br /&gt;
 |A2=Redstone |B2=Redstone        |C2=Redstone&lt;br /&gt;
 |A3=stone |B3=Gold_Ingot     |C3=stone&lt;br /&gt;
 |Output=Signal Amplifier&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Advanced Amplifier&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The Advanced Amplifier is used to upgrade sensor cards to Mk4. &lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=iron_ingot |B1=Gold_Ingot|C1=iron_ingot&lt;br /&gt;
 |A2=Redstone |B2=Diamond        |C2=Redstone&lt;br /&gt;
 |A3=iron_ingot |B3=Gold_Ingot     |C3=iron_ingot&lt;br /&gt;
 |Output=Advanced Amplifier&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table style=&amp;quot;width: 100%; border: solid 1px black; margin: 2px; border-spacing: 0px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td colspan=&amp;quot;2&amp;quot; style=&amp;quot;font-weight: bold; font-size: large; padding-bottom: .3em; border-bottom: solid #C9C9C9 1px; background: #D3FFC2; line-height:28px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:Grid_disk.png|24px]]&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
Sensor Tiers&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td style=&amp;quot;width: 350px; background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Name&amp;lt;/td&amp;gt;&amp;lt;td style=&amp;quot;background: #E0E0E0; padding: .4em; font-weight:bold;&amp;quot;&amp;gt;Description&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;'''Mk 1'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;The recipes for Mk 1 sensors are all different. (See above sensor card lists) &lt;br /&gt;
Special-type sensor cards (Currently only the World Sensor Card) only exist as Mk 1, as they do not have a range. &lt;br /&gt;
&lt;br /&gt;
'''Ranges:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Type&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Range&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Sensor types&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Block&amp;lt;td&amp;gt;'''1''' block away (3x3x3)&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[File:Grid_Inventory_Sensor_Card.png|24px|Inventory Sensor]]&lt;br /&gt;
[[File:Grid_Industrial_Craft_2_Sensor_Card.png|24px|Industrial Craft 2 Sensor]]&lt;br /&gt;
[[File:Grid_Buildcraft_Sensor_Card.png|24px|Buildcraft Sensor]]&lt;br /&gt;
[[File:Grid_Liquid_Sensor_Card.png|24px|Liquid Sensor]]&lt;br /&gt;
[[File:Grid_Sign_Sensor_Card.png|24px|Sign Sensor]]&lt;br /&gt;
[[File:Grid_Thaumcraft_Sensor_Card.png|24px|Thaumcraft Sensor]]&lt;br /&gt;
[[File:Grid_Sonic_Sensor_Card.png|24px|Sonic Sensor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Entity&amp;lt;td&amp;gt;'''4''' block-radius sphere&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[File:Grid_Proximity_Sensor_Card.png|24px|Proximity Sensor]]&lt;br /&gt;
[[File:Grid_Dropped_Item_Sensor_Card.png|24px|Dropped Item Sensor]]&lt;br /&gt;
[[File:Grid_Minecart_Sensor_Card.png|24px|Minecart Sensor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Special&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N/A&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[File:Grid_World_Sensor_Card.png|24px|World Sensor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;'''Mk 2'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Mk 2 is the first upgrade to sensor cards. Simply combine a Range Extension Antenna with a Mk 1 sensor card (The recipe is shapeless)&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Inventory Sensor Card |B1=Range Extension Antenna&lt;br /&gt;
 |Output=Inventory Sensor Card Mk2&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ranges:'''&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Type&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Range&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Sensor types&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Block&amp;lt;td&amp;gt;'''3''' blocks away (7x7x7)&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[File:Grid_Inventory_Sensor_Card.png|24px|Inventory Sensor]]&lt;br /&gt;
[[File:Grid_Industrial_Craft_2_Sensor_Card.png|24px|Industrial Craft 2 Sensor]]&lt;br /&gt;
[[File:Grid_Buildcraft_Sensor_Card.png|24px|Buildcraft Sensor]]&lt;br /&gt;
[[File:Grid_Liquid_Sensor_Card.png|24px|Liquid Sensor]]&lt;br /&gt;
[[File:Grid_Sign_Sensor_Card.png|24px|Sign Sensor]]&lt;br /&gt;
[[File:Grid_Thaumcraft_Sensor_Card.png|24px|Thaumcraft Sensor]]&lt;br /&gt;
[[File:Grid_Sonic_Sensor_Card.png|24px|Sonic Sensor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Entity&amp;lt;td&amp;gt;'''12''' block-radius sphere&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[File:Grid_Proximity_Sensor_Card.png|24px|Proximity Sensor]]&lt;br /&gt;
[[File:Grid_Dropped_Item_Sensor_Card.png|24px|Dropped Item Sensor]]&lt;br /&gt;
[[File:Grid_Minecart_Sensor_Card.png|24px|Minecart Sensor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;'''Mk 3'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Mk 3 is the second upgrade to sensor cards. Note that the recipe is no longer shapeless.&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |A1=Range Extension Antenna |B1=Inventory Sensor Card Mk2|C1=Range Extension Antenna&lt;br /&gt;
 |B2=Signal Amplifier&lt;br /&gt;
 |Output=Inventory Sensor Card Mk3&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ranges:'''&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Type&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Range&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Sensor types&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Block&amp;lt;td&amp;gt;'''5''' blocks away (11x11x11)&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[File:Grid_Inventory_Sensor_Card.png|24px|Inventory Sensor]]&lt;br /&gt;
[[File:Grid_Industrial_Craft_2_Sensor_Card.png|24px|Industrial Craft 2 Sensor]]&lt;br /&gt;
[[File:Grid_Buildcraft_Sensor_Card.png|24px|Buildcraft Sensor]]&lt;br /&gt;
[[File:Grid_Liquid_Sensor_Card.png|24px|Liquid Sensor]]&lt;br /&gt;
[[File:Grid_Sign_Sensor_Card.png|24px|Sign Sensor]]&lt;br /&gt;
[[File:Grid_Thaumcraft_Sensor_Card.png|24px|Thaumcraft Sensor]]&lt;br /&gt;
[[File:Grid_Sonic_Sensor_Card.png|24px|Sonic Sensor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Entity&amp;lt;td&amp;gt;'''20''' block-radius sphere&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[File:Grid_Proximity_Sensor_Card.png|24px|Proximity Sensor]]&lt;br /&gt;
[[File:Grid_Dropped_Item_Sensor_Card.png|24px|Dropped Item Sensor]]&lt;br /&gt;
[[File:Grid_Minecart_Sensor_Card.png|24px|Minecart Sensor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tr style=&amp;quot;background-color: #FFFFFF;&amp;quot;&amp;gt;&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;'''Mk 4'''&amp;lt;/td&amp;gt;&lt;br /&gt;
&amp;lt;td style=&amp;quot;border-top: solid #C9C9C9 1px; padding: .4em;&amp;quot;&amp;gt;Mk 4 is the highest tier of sensor card upgrades&lt;br /&gt;
&lt;br /&gt;
{{Crafting grid&lt;br /&gt;
 |B1=Range Extension Antenna &lt;br /&gt;
|A2=Range Extension Antenna |B2=Inventory Sensor Card Mk3|C2=Range Extension Antenna&lt;br /&gt;
 |A3=Signal Amplifier|B3=Advanced Amplifier|C3=Signal Amplifier&lt;br /&gt;
 |Output=Inventory Sensor Card Mk4&lt;br /&gt;
 |Output-link=OpenCCSensors&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ranges:'''&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Type&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Range&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Sensor types&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Block&amp;lt;td&amp;gt;'''7''' blocks away (15x15x15)&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[File:Grid_Inventory_Sensor_Card.png|24px|Inventory Sensor]]&lt;br /&gt;
[[File:Grid_Industrial_Craft_2_Sensor_Card.png|24px|Industrial Craft 2 Sensor]]&lt;br /&gt;
[[File:Grid_Buildcraft_Sensor_Card.png|24px|Buildcraft Sensor]]&lt;br /&gt;
[[File:Grid_Liquid_Sensor_Card.png|24px|Liquid Sensor]]&lt;br /&gt;
[[File:Grid_Sign_Sensor_Card.png|24px|Sign Sensor]]&lt;br /&gt;
[[File:Grid_Thaumcraft_Sensor_Card.png|24px|Thaumcraft Sensor]]&lt;br /&gt;
[[File:Grid_Sonic_Sensor_Card.png|24px|Sonic Sensor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Entity&amp;lt;td&amp;gt;'''28''' block-radius sphere&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[File:Grid_Proximity_Sensor_Card.png|24px|Proximity Sensor]]&lt;br /&gt;
[[File:Grid_Dropped_Item_Sensor_Card.png|24px|Dropped Item Sensor]]&lt;br /&gt;
[[File:Grid_Minecart_Sensor_Card.png|24px|Minecart Sensor]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Usage Examples =&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=List all available targets on a Proximity Sensor on the left of the Computer.&lt;br /&gt;
|code=os.loadAPI(&amp;quot;ocs/apis/sensor&amp;quot;)&lt;br /&gt;
 local prox = sensor.wrap(&amp;quot;left&amp;quot;)&lt;br /&gt;
 print(textutils.serialize(prox.getTargets()))&lt;br /&gt;
|output=A huge blob of text with all nearby available targets to the sensor, and some basic details.&lt;br /&gt;
}}&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Turn on a Redstone lamp when a player is within a certain distance from it. The sensor is placed to the left of the computer and the lamp is placed on top of the computer.&lt;br /&gt;
|code=&lt;br /&gt;
  os.loadAPI(&amp;quot;ocs/apis/sensor&amp;quot;)&lt;br /&gt;
  &lt;br /&gt;
 -- the location of the redstone lamp relative to the sensor&lt;br /&gt;
 local offset = {&lt;br /&gt;
   X = 1,&lt;br /&gt;
   Y = 1,&lt;br /&gt;
   Z = 0&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 -- how close a player has to be to activate the lamp&lt;br /&gt;
 local radius = 5&lt;br /&gt;
 &lt;br /&gt;
  -- find the distance from the player position to the offset&lt;br /&gt;
 function distance(pos)&lt;br /&gt;
   local xd = pos.X - offset.X&lt;br /&gt;
   local yd = pos.Y - offset.Y&lt;br /&gt;
   local zd = pos.Z - offset.Z&lt;br /&gt;
   return math.sqrt(xd*xd + yd*yd + zd*zd)&lt;br /&gt;
 end&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
 local proximity = sensor.wrap(&amp;quot;left&amp;quot;)&lt;br /&gt;
 while true do&lt;br /&gt;
   local signal = false&lt;br /&gt;
   local targets = proximity.getTargets()&lt;br /&gt;
   for k, v in pairs(targets) do&lt;br /&gt;
         if distance(v.Position) &amp;lt; radius then&lt;br /&gt;
           signal = true   &lt;br /&gt;
         end&lt;br /&gt;
   end&lt;br /&gt;
   rs.setOutput(&amp;quot;top&amp;quot;, signal)&lt;br /&gt;
 end&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:User_Created_Peripherals]][[Category:Unofficial_APIs]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Talk:Fs.open/Mode:Read&amp;diff=4845</id>
		<title>Talk:Fs.open/Mode:Read</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Talk:Fs.open/Mode:Read&amp;diff=4845"/>
				<updated>2012-12-30T21:38:39Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Created page with &amp;quot;A-tab, what's going on with the formatting on this page?  Should the = =Examples= = bit be showing up as a header? ~~~~&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A-tab, what's going on with the formatting on this page?  Should the = =Examples= = bit be showing up as a header? [[User:Lyqyd|Lyqyd]] 01:38, 31 December 2012 (MSK)&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Fs.open/Mode:Read&amp;diff=4844</id>
		<title>Fs.open/Mode:Read</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Fs.open/Mode:Read&amp;diff=4844"/>
				<updated>2012-12-30T21:37:48Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Opening A File For Reading ==&lt;br /&gt;
&lt;br /&gt;
To read data from a saved file, one must use either of the read modes with [[fs.open]]().  The two read modes are textual read mode (&amp;quot;r&amp;quot;) and binary read mode (&amp;quot;rb&amp;quot;).  Most work with reading data from files in ComputerCraft will be done with textual read mode.&lt;br /&gt;
&lt;br /&gt;
All examples below will use a file at the path &amp;quot;file/name&amp;quot;, which contains this text:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;line 1&lt;br /&gt;
line 2&lt;br /&gt;
a third line&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Textual Read Mode ==&lt;br /&gt;
&lt;br /&gt;
{{Function&lt;br /&gt;
|name=&amp;lt;var&amp;gt;handle&amp;lt;/var&amp;gt;.readLine&lt;br /&gt;
|api=fs&lt;br /&gt;
|returns=[[string]] the next line read from the file, with the end-of-line character stripped; or nil if there are no more lines in the file&lt;br /&gt;
|desc=Reads the next line from the file&lt;br /&gt;
|examples=&amp;lt;pre&amp;gt;&lt;br /&gt;
local handle = fs.open(&amp;quot;file/name&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
if handle then&lt;br /&gt;
    text = handle.readLine()&lt;br /&gt;
    --text now contains: line 1&lt;br /&gt;
    text = handle.readLine()&lt;br /&gt;
    --text now contains: line 2&lt;br /&gt;
    text = handle.readLine()&lt;br /&gt;
    --text now contains: a third line&lt;br /&gt;
    handle.close()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Raw_key_events&amp;diff=4803</id>
		<title>Raw key events</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Raw_key_events&amp;diff=4803"/>
				<updated>2012-12-21T18:36:14Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Added left super, right super, and menu key codes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The built-in os has a function to read incoming keystrokes. But it also implements the functions to move the cursor while typing. This is not always a desired feature; imagine a case in which you want to make a menu with a controllable cursor around the menu entries. The current read() function won't let you.&lt;br /&gt;
&lt;br /&gt;
==Detecting keystrokes==&lt;br /&gt;
In case I made you think the OS sucks, it doesn't (all the time). Because this OS is not Windows, we can access lower-level functions, such as os.pullEvent(). And that's the one that we're going to use:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function rawread()&lt;br /&gt;
    bRead = true&lt;br /&gt;
    while(bRead) do&lt;br /&gt;
        local sEvent, param = os.pullEvent(&amp;quot;key&amp;quot;)&lt;br /&gt;
        if(sEvent == &amp;quot;key&amp;quot;) then&lt;br /&gt;
            break&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This function waits for any key, then exits.&lt;br /&gt;
&lt;br /&gt;
==Figuring out the key==&lt;br /&gt;
We can detect any key, but not which key. To find it out, we have to add some further logic to the code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
function rawread()&lt;br /&gt;
    while true do&lt;br /&gt;
        local sEvent, param = os.pullEvent(&amp;quot;key&amp;quot;)&lt;br /&gt;
        if sEvent == &amp;quot;key&amp;quot; then&lt;br /&gt;
            if param == 28 then&lt;br /&gt;
                print(&amp;quot;Enter detected&amp;quot;)&lt;br /&gt;
                break&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This function waits for the Enter key to be pressed. If so, it writes &amp;quot;Enter detected&amp;quot; to the screen and exits.&lt;br /&gt;
&lt;br /&gt;
==Key scan codes ==&lt;br /&gt;
The scan codes are typical DirectX numbers.&lt;br /&gt;
{|&lt;br /&gt;
|style=&amp;quot;vertical-align: top&amp;quot;|&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Key&lt;br /&gt;
! |Code&lt;br /&gt;
|-&lt;br /&gt;
| Escape&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| 2&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 3&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| 4&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 5&lt;br /&gt;
|-&lt;br /&gt;
| 5&lt;br /&gt;
| 6&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 7&lt;br /&gt;
|-&lt;br /&gt;
| 7&lt;br /&gt;
| 8&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 9&lt;br /&gt;
|-&lt;br /&gt;
| 9&lt;br /&gt;
| 10&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 11&lt;br /&gt;
|-&lt;br /&gt;
| Minus&lt;br /&gt;
| 12&lt;br /&gt;
|-&lt;br /&gt;
| Equals&lt;br /&gt;
| 13&lt;br /&gt;
|-&lt;br /&gt;
| Backspace&lt;br /&gt;
| 14&lt;br /&gt;
|-&lt;br /&gt;
| Tab&lt;br /&gt;
| 15&lt;br /&gt;
|-&lt;br /&gt;
| Q&lt;br /&gt;
| 16&lt;br /&gt;
|-&lt;br /&gt;
| W&lt;br /&gt;
| 17&lt;br /&gt;
|-&lt;br /&gt;
| E&lt;br /&gt;
| 18&lt;br /&gt;
|-&lt;br /&gt;
| R&lt;br /&gt;
| 19&lt;br /&gt;
|-&lt;br /&gt;
| T&lt;br /&gt;
| 20&lt;br /&gt;
|-&lt;br /&gt;
| Y&lt;br /&gt;
| 21&lt;br /&gt;
|-&lt;br /&gt;
| U&lt;br /&gt;
| 22&lt;br /&gt;
|-&lt;br /&gt;
| I&lt;br /&gt;
| 23&lt;br /&gt;
|-&lt;br /&gt;
| O&lt;br /&gt;
| 24&lt;br /&gt;
|-&lt;br /&gt;
| P&lt;br /&gt;
| 25&lt;br /&gt;
|}&lt;br /&gt;
|style=&amp;quot;vertical-align: top&amp;quot;|&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Key&lt;br /&gt;
! |Code&lt;br /&gt;
|-&lt;br /&gt;
| Left Bracket&lt;br /&gt;
| 26&lt;br /&gt;
|-&lt;br /&gt;
| Right Bracket&lt;br /&gt;
| 27&lt;br /&gt;
|-&lt;br /&gt;
| Enter&lt;br /&gt;
| 28&lt;br /&gt;
|-&lt;br /&gt;
| Left Control&lt;br /&gt;
| 29&lt;br /&gt;
|-&lt;br /&gt;
| A&lt;br /&gt;
| 30&lt;br /&gt;
|- &lt;br /&gt;
| S&lt;br /&gt;
| 31&lt;br /&gt;
|-&lt;br /&gt;
| D&lt;br /&gt;
| 32&lt;br /&gt;
|-&lt;br /&gt;
| F&lt;br /&gt;
| 33&lt;br /&gt;
|-&lt;br /&gt;
| G&lt;br /&gt;
| 34&lt;br /&gt;
|-&lt;br /&gt;
| H&lt;br /&gt;
| 35&lt;br /&gt;
|-&lt;br /&gt;
| J&lt;br /&gt;
| 36&lt;br /&gt;
|-&lt;br /&gt;
| K&lt;br /&gt;
| 37&lt;br /&gt;
|-&lt;br /&gt;
| L&lt;br /&gt;
| 38&lt;br /&gt;
|-&lt;br /&gt;
| Semicolon&lt;br /&gt;
| 39&lt;br /&gt;
|-&lt;br /&gt;
| Apostrophe&lt;br /&gt;
| 40&lt;br /&gt;
|-&lt;br /&gt;
| Tilde (~)&lt;br /&gt;
| 41&lt;br /&gt;
|-&lt;br /&gt;
| Left Shift&lt;br /&gt;
| 42&lt;br /&gt;
|-&lt;br /&gt;
| Back Slash&lt;br /&gt;
| 43&lt;br /&gt;
|-&lt;br /&gt;
| Z&lt;br /&gt;
| 44&lt;br /&gt;
|-&lt;br /&gt;
| X&lt;br /&gt;
| 45&lt;br /&gt;
|-&lt;br /&gt;
| C&lt;br /&gt;
| 46&lt;br /&gt;
|-&lt;br /&gt;
| V&lt;br /&gt;
| 47&lt;br /&gt;
|}&lt;br /&gt;
|style=&amp;quot;vertical-align: top&amp;quot;|&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Key&lt;br /&gt;
! |Code&lt;br /&gt;
|-&lt;br /&gt;
| B&lt;br /&gt;
| 48&lt;br /&gt;
|-&lt;br /&gt;
| N&lt;br /&gt;
| 49&lt;br /&gt;
|-&lt;br /&gt;
| M&lt;br /&gt;
| 50&lt;br /&gt;
|-&lt;br /&gt;
| Comma&lt;br /&gt;
| 51&lt;br /&gt;
|-&lt;br /&gt;
| Period&lt;br /&gt;
| 52&lt;br /&gt;
|-&lt;br /&gt;
| Forward Slash&lt;br /&gt;
| 53&lt;br /&gt;
|-&lt;br /&gt;
| Right Shift&lt;br /&gt;
| 54&lt;br /&gt;
|-&lt;br /&gt;
| Numpad *&lt;br /&gt;
| 55&lt;br /&gt;
|-&lt;br /&gt;
| Left Alt&lt;br /&gt;
| 56&lt;br /&gt;
|-&lt;br /&gt;
| Spacebar&lt;br /&gt;
| 57&lt;br /&gt;
|-&lt;br /&gt;
| Caps Lock&lt;br /&gt;
| 58&lt;br /&gt;
|-&lt;br /&gt;
| F1&lt;br /&gt;
| 59&lt;br /&gt;
|-&lt;br /&gt;
| F2&lt;br /&gt;
| 60&lt;br /&gt;
|-&lt;br /&gt;
| F3&lt;br /&gt;
| 61&lt;br /&gt;
|-&lt;br /&gt;
| F4&lt;br /&gt;
| 62&lt;br /&gt;
|-&lt;br /&gt;
| F5&lt;br /&gt;
| 63&lt;br /&gt;
|-&lt;br /&gt;
| F6&lt;br /&gt;
| 64&lt;br /&gt;
|-&lt;br /&gt;
| F7&lt;br /&gt;
| 65&lt;br /&gt;
|-&lt;br /&gt;
| F8&lt;br /&gt;
| 66&lt;br /&gt;
|-&lt;br /&gt;
| F9&lt;br /&gt;
| 67&lt;br /&gt;
|-&lt;br /&gt;
| F10&lt;br /&gt;
| 68&lt;br /&gt;
|}&lt;br /&gt;
|style=&amp;quot;vertical-align: top&amp;quot;|&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Key&lt;br /&gt;
! |Code&lt;br /&gt;
|-&lt;br /&gt;
| Num Lock&lt;br /&gt;
| 69&lt;br /&gt;
|-&lt;br /&gt;
| Scroll Lock&lt;br /&gt;
| 70&lt;br /&gt;
|-&lt;br /&gt;
| Numpad 7&lt;br /&gt;
| 71&lt;br /&gt;
|-&lt;br /&gt;
| Numpad 8&lt;br /&gt;
| 72&lt;br /&gt;
|-&lt;br /&gt;
| Numpad 9&lt;br /&gt;
| 73&lt;br /&gt;
|-&lt;br /&gt;
| Numpad -&lt;br /&gt;
| 74&lt;br /&gt;
|-&lt;br /&gt;
| Numpad 4&lt;br /&gt;
| 75&lt;br /&gt;
|-&lt;br /&gt;
| Numpad 5&lt;br /&gt;
| 76&lt;br /&gt;
|-&lt;br /&gt;
| Numpad 6&lt;br /&gt;
| 77&lt;br /&gt;
|-&lt;br /&gt;
| Numpad +&lt;br /&gt;
| 78&lt;br /&gt;
|-&lt;br /&gt;
| Numpad 1&lt;br /&gt;
| 79&lt;br /&gt;
|-&lt;br /&gt;
| Numpad 2&lt;br /&gt;
| 80&lt;br /&gt;
|-&lt;br /&gt;
| Numpad 3&lt;br /&gt;
| 81&lt;br /&gt;
|-&lt;br /&gt;
| Numpad 0&lt;br /&gt;
| 82&lt;br /&gt;
|-&lt;br /&gt;
| Numpad .&lt;br /&gt;
| 83&lt;br /&gt;
|-&lt;br /&gt;
| F11&lt;br /&gt;
| 87&lt;br /&gt;
|-&lt;br /&gt;
| F12&lt;br /&gt;
| 88&lt;br /&gt;
|-&lt;br /&gt;
| Numpad Enter&lt;br /&gt;
| 28 &amp;lt;s&amp;gt;156&amp;lt;/s&amp;gt; *&lt;br /&gt;
|-&lt;br /&gt;
| Right Control&lt;br /&gt;
| 157&lt;br /&gt;
|-&lt;br /&gt;
| Numpad /&lt;br /&gt;
| 181&lt;br /&gt;
|-&lt;br /&gt;
| Right Alt&lt;br /&gt;
| 184&lt;br /&gt;
|}&lt;br /&gt;
|style=&amp;quot;vertical-align: top&amp;quot;|&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! |Key&lt;br /&gt;
! |Code&lt;br /&gt;
|-&lt;br /&gt;
| Home&lt;br /&gt;
| 199&lt;br /&gt;
|-&lt;br /&gt;
| Up Arrow&lt;br /&gt;
| 200&lt;br /&gt;
|-&lt;br /&gt;
| Page Up&lt;br /&gt;
| 201&lt;br /&gt;
|-&lt;br /&gt;
| Left Arrow&lt;br /&gt;
| 203&lt;br /&gt;
|-&lt;br /&gt;
| Right Arrow&lt;br /&gt;
| 205&lt;br /&gt;
|-&lt;br /&gt;
| End&lt;br /&gt;
| 207&lt;br /&gt;
|-&lt;br /&gt;
| Down Arrow&lt;br /&gt;
| 208&lt;br /&gt;
|-&lt;br /&gt;
| Page Down&lt;br /&gt;
| 209&lt;br /&gt;
|-&lt;br /&gt;
| Insert&lt;br /&gt;
| 210&lt;br /&gt;
|-&lt;br /&gt;
| Delete&lt;br /&gt;
| 211&lt;br /&gt;
|-&lt;br /&gt;
| Left Super&lt;br /&gt;
| 219&lt;br /&gt;
|-&lt;br /&gt;
| Right Super&lt;br /&gt;
| 220&lt;br /&gt;
|-&lt;br /&gt;
| Menu&lt;br /&gt;
| 221&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
Source: [http://wiki.tesnexus.com/index.php/DirectX_Scancodes_And_How_To_Use_Them Nexus Wiki]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;i&amp;gt;Note: Items marked with * are not the correct keycode, but return a matching keycode for another button (eg, enter keys).&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Fs.open/Mode:Read&amp;diff=4799</id>
		<title>Fs.open/Mode:Read</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Fs.open/Mode:Read&amp;diff=4799"/>
				<updated>2012-12-19T17:01:27Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Initial rough entry.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Opening A File For Reading ==&lt;br /&gt;
&lt;br /&gt;
To read data from a saved file, one must use either of the read modes with [[fs.open]]().  The two read modes are textual read mode (&amp;quot;r&amp;quot;) and binary read mode (&amp;quot;rb&amp;quot;).  Most work with reading data from files in ComputerCraft will be done with textual read mode.&lt;br /&gt;
&lt;br /&gt;
All examples below will use a file at the path &amp;quot;file/name&amp;quot;, which contains this text:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;line 1&lt;br /&gt;
line 2&lt;br /&gt;
a third line&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Textual Read Mode ==&lt;br /&gt;
&lt;br /&gt;
{{Function&lt;br /&gt;
|name=&amp;lt;var&amp;gt;handle&amp;lt;/var&amp;gt;.readLine&lt;br /&gt;
|api=fs&lt;br /&gt;
|returns=[[string]] the next line read from the file, with the end-of-line character stripped; or nil if there are no more lines in the file&lt;br /&gt;
|desc=Reads the next line from the file&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local handle = fs.open(&amp;quot;file/name&amp;quot;, &amp;quot;r&amp;quot;)&lt;br /&gt;
if handle then&lt;br /&gt;
    text = handle.readLine()&lt;br /&gt;
    --text now contains: line 1&lt;br /&gt;
    text = handle.readLine()&lt;br /&gt;
    --text now contains: line 2&lt;br /&gt;
    text = handle.readLine()&lt;br /&gt;
    --text now contains: a third line&lt;br /&gt;
    handle.close()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Talk:Fs.open&amp;diff=4797</id>
		<title>Talk:Fs.open</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Talk:Fs.open&amp;diff=4797"/>
				<updated>2012-12-17T20:06:04Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Created page with &amp;quot;AfterLifeLochie, have read/write subpages been created?  I wouldn't mind starting to work on them if they exist, I just don't know what you want them named. ~~~~&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AfterLifeLochie, have read/write subpages been created?  I wouldn't mind starting to work on them if they exist, I just don't know what you want them named. [[User:Lyqyd|Lyqyd]] 00:06, 18 December 2012 (MSK)&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=File:Advanced-program.png&amp;diff=4480</id>
		<title>File:Advanced-program.png</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=File:Advanced-program.png&amp;diff=4480"/>
				<updated>2012-12-02T17:27:42Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: An image of an advanced program on the screen.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An image of an advanced program on the screen.&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=IO_(API)&amp;diff=4369</id>
		<title>IO (API)</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=IO_(API)&amp;diff=4369"/>
				<updated>2012-11-30T18:50:30Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: FS linking fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;IO is a reimplementation of the default Lua input / output API defined [http://www.lua.org/manual/5.1/manual.html#5.7 here], with some features trimmed. Most features should work. If you find a non-working feature, please list it here.&lt;br /&gt;
&lt;br /&gt;
List of non-working features from IO:&lt;br /&gt;
&lt;br /&gt;
* file:seek(...) - Doesn't exist.&lt;br /&gt;
* io.lines(...) - Doesn't exist either.&lt;br /&gt;
* io.read(&amp;quot;*all&amp;quot;) - read() does not work with &amp;quot;*all&amp;quot; argument; use &amp;quot;*a&amp;quot; instead.&lt;br /&gt;
* io.open(&amp;quot;FILE_NAME&amp;quot;, &amp;quot;a+&amp;quot;) - Append+ mode is unsupported.&lt;br /&gt;
* file:read(...) - Doesn't seem to exist in 1.43.&lt;br /&gt;
* file:read(number) - Doesn't exist as of 1.46.&lt;br /&gt;
&lt;br /&gt;
If any functions don't exist try the [[Fs (API)|Fs]] API instead.&lt;br /&gt;
[[Category:APIs]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Talk:Int_(type)&amp;diff=4363</id>
		<title>Talk:Int (type)</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Talk:Int_(type)&amp;diff=4363"/>
				<updated>2012-11-30T18:48:17Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: int/number confusion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I hate to bring this up at this point, but is this a potential source of confusion?  Lua uses the &amp;quot;number&amp;quot; type for all numbers.  Perhaps mentioning this explicitly would be a good idea. [[User:Lyqyd|Lyqyd]] 22:48, 30 November 2012 (MSK)&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Term.scroll&amp;diff=4359</id>
		<title>Term.scroll</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Term.scroll&amp;diff=4359"/>
				<updated>2012-11-30T18:46:30Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Int linking fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=term.scroll&lt;br /&gt;
|args=[[int (type)|int]] n&lt;br /&gt;
|returns=None&lt;br /&gt;
|api=term&lt;br /&gt;
|addon=ComputerCraft&lt;br /&gt;
|desc=Scrolls the terminal window.&lt;br /&gt;
|examples=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:API_Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Turtle.getItemSpace&amp;diff=4357</id>
		<title>Turtle.getItemSpace</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Turtle.getItemSpace&amp;diff=4357"/>
				<updated>2012-11-30T18:46:06Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Int linking fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=turtle.getItemSpace&lt;br /&gt;
|args=&lt;br /&gt;
|api=turtle&lt;br /&gt;
|returns=[[int (type)|int]] the amount of room for items found in the specified slot.&lt;br /&gt;
|addon=ComputerCraft&lt;br /&gt;
|desc=Prints the number of spaces remaining in the specified slot.&lt;br /&gt;
|examples=&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Prints the number of spaces remaining in the specified slot.&lt;br /&gt;
|code=print(turtle.getItemSpace())&lt;br /&gt;
|output=Integer 0 through 64 depending on number of items.&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua_Core_Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Turtle.getItemCount&amp;diff=4355</id>
		<title>Turtle.getItemCount</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Turtle.getItemCount&amp;diff=4355"/>
				<updated>2012-11-30T18:45:51Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Int linking fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=turtle.getItemCount&lt;br /&gt;
|args=slot&lt;br /&gt;
|api=turtle&lt;br /&gt;
|returns=[[int (type)|int]] the number of items found in the specified slot.&lt;br /&gt;
|addon=ComputerCraft&lt;br /&gt;
|desc=Return the number of items in the specified slot.&lt;br /&gt;
|examples=&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Prints the number of items in the specified slot.&lt;br /&gt;
|code=print(turtle.getItemCount(1))&lt;br /&gt;
|output=An integer 0 through 64 depending on number of items in slot 1.&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua_Core_Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Fs.open&amp;diff=4337</id>
		<title>Fs.open</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Fs.open&amp;diff=4337"/>
				<updated>2012-11-30T18:37:13Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Int linking fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=fs.open&lt;br /&gt;
|args=[[string (type)|string]] path, [[string (type)|string]]&lt;br /&gt;
 mode&lt;br /&gt;
|api=fs&lt;br /&gt;
|returns=[[table]] the file handle, or &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; if the mode was read-only or the file did not exist&lt;br /&gt;
|desc=Opens a file; &amp;lt;var&amp;gt;mode&amp;lt;/var&amp;gt; consists of a first character which is one of &lt;br /&gt;
&amp;quot;r&amp;quot; to open the file read-only, &lt;br /&gt;
&lt;br /&gt;
&amp;quot;w&amp;quot; to open it for writing and remove any existing data, or &lt;br /&gt;
&lt;br /&gt;
&amp;quot;a&amp;quot; to open for writing but keep existing data and append any writes to the end of the file, plus optionally the second character &lt;br /&gt;
&lt;br /&gt;
&amp;quot;b&amp;quot; to open the file for binary access instead of text access &lt;br /&gt;
(text mode will perform end-of-line conversions necessary to move text files between Windows, Linux, and Mac OS systems; binary files should not have these conversions applied as they will be corrupted)&lt;br /&gt;
|examples=&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Creates the file &amp;quot;abcd&amp;quot; and holds a file handle to it&lt;br /&gt;
|code=h = fs.open(&amp;quot;abcd&amp;quot;, &amp;quot;w&amp;quot;)&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== File Handles ==&lt;br /&gt;
&lt;br /&gt;
A file handle allows access to a file. A file handle is a table; the functions within the table are accessed with the dot operator (&amp;lt;em&amp;gt;not&amp;lt;/em&amp;gt; the colon operator, as may be more intuitive!). The examples below assume a file has already been opened and the handle stored in the variable &amp;lt;var&amp;gt;h&amp;lt;/var&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Files opened in text read mode ===&lt;br /&gt;
&lt;br /&gt;
A file opened in mode &amp;quot;r&amp;quot; (text read mode) exposes the following functions.&lt;br /&gt;
&lt;br /&gt;
{{Function&lt;br /&gt;
|name=&amp;lt;var&amp;gt;h&amp;lt;/var&amp;gt;.readLine&lt;br /&gt;
|api=fs&lt;br /&gt;
|returns=[[string]] the next line read from the file, with the end-of-line character stripped; or nil if there are no more lines in the file&lt;br /&gt;
|desc=Reads the next line from the file&lt;br /&gt;
}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=&amp;lt;var&amp;gt;h&amp;lt;/var&amp;gt;.readAll&lt;br /&gt;
|api=fs&lt;br /&gt;
|returns=[[string]] the entire rest of the file, with the end-of-line character on the very last line (if present) stripped&lt;br /&gt;
|desc=Reads the rest of the text in the file&lt;br /&gt;
}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=&amp;lt;var&amp;gt;h&amp;lt;/var&amp;gt;.close&lt;br /&gt;
|api=fs&lt;br /&gt;
|desc=Closes the file handle, after which it can no longer be used&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Files opened in text write/append mode ===&lt;br /&gt;
&lt;br /&gt;
A file opened in mode &amp;quot;w&amp;quot; (text write mode) or &amp;quot;a&amp;quot; (text append mode) exposes the following functions:&lt;br /&gt;
&lt;br /&gt;
{{Function&lt;br /&gt;
|name=&amp;lt;var&amp;gt;h&amp;lt;/var&amp;gt;.write&lt;br /&gt;
|args=[[string (type)|string]] data&lt;br /&gt;
|api=fs&lt;br /&gt;
|desc=Writes a string of characters to the file exactly as they appear in the string &amp;lt;var&amp;gt;data&amp;lt;/var&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=&amp;lt;var&amp;gt;h&amp;lt;/var&amp;gt;.writeLine&lt;br /&gt;
|args=[[string (type)|string]] data&lt;br /&gt;
|api=fs&lt;br /&gt;
|desc=Writes a string of characters to the file, then appends an end-of-line character&lt;br /&gt;
}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=&amp;lt;var&amp;gt;h&amp;lt;/var&amp;gt;.close&lt;br /&gt;
|api=fs&lt;br /&gt;
|desc=Closes the file handle, after which it can no longer be used&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Files opened in binary read mode ===&lt;br /&gt;
&lt;br /&gt;
A file opened in mode &amp;quot;rb&amp;quot; (binary read mode) exposes the following functions:&lt;br /&gt;
&lt;br /&gt;
{{Function&lt;br /&gt;
|name=&amp;lt;var&amp;gt;h&amp;lt;/var&amp;gt;.read&lt;br /&gt;
|api=fs&lt;br /&gt;
|returns=[[int (type)|int]] the byte read from the file, or &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; if there are no more bytes&lt;br /&gt;
|desc=Reads a single byte from the file and returns it&lt;br /&gt;
}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=&amp;lt;var&amp;gt;h&amp;lt;/var&amp;gt;.close&lt;br /&gt;
|api=fs&lt;br /&gt;
|desc=Closes the file handle, after which it can no longer be used&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Files opened in binary write/append mode ===&lt;br /&gt;
&lt;br /&gt;
A file opened in mode &amp;quot;wb&amp;quot; (binary write mode) or &amp;quot;ab&amp;quot; (binary append mode) exposes the following functions:&lt;br /&gt;
&lt;br /&gt;
{{Function&lt;br /&gt;
|name=&amp;lt;var&amp;gt;h&amp;lt;/var&amp;gt;.write&lt;br /&gt;
|args=[[int (type)|int]] byte&lt;br /&gt;
|api=fs&lt;br /&gt;
|desc=Writes a single byte into the file&lt;br /&gt;
}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=&amp;lt;var&amp;gt;h&amp;lt;/var&amp;gt;.close&lt;br /&gt;
|api=fs&lt;br /&gt;
|desc=Closes the file handle, after which it can no longer be used&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua_Core_Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Colors.subtract&amp;diff=4334</id>
		<title>Colors.subtract</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Colors.subtract&amp;diff=4334"/>
				<updated>2012-11-30T18:36:27Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Int linking fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=colors.subtract&lt;br /&gt;
|args=[[int (type)|int]] colors, [[int (type)|int]] color1, [[int (type)|int]] color2, …&lt;br /&gt;
|api=color&lt;br /&gt;
|returns=[[int (type)|int]] the set &amp;lt;var&amp;gt;colors&amp;lt;/var&amp;gt; after removing sets &amp;lt;var&amp;gt;color1&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;color2&amp;lt;/var&amp;gt;, …&lt;br /&gt;
|addon=ComputerCraft&lt;br /&gt;
|desc=Computes the difference of a set by removing colors from it; each parameter beyond the first may be a single color or may be a set of colors (in the latter case, all colors in the set are removed from the original set)&lt;br /&gt;
|examples=&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Beginning with white, magenta, and light blue, remove magenta to yield 9 (the bitwise combination of white and light blue)&lt;br /&gt;
|code=print(colors.subtract(colors.combine(colors.white, colors.magenta, colours.lightBlue), colors.magenta))&lt;br /&gt;
|output=9&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:API_Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Colors.combine&amp;diff=4333</id>
		<title>Colors.combine</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Colors.combine&amp;diff=4333"/>
				<updated>2012-11-30T18:36:08Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Int linking fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=colors.combine&lt;br /&gt;
|args=[[int (type)|int]] color1, [[int (type)|int]] color2, …&lt;br /&gt;
|api=color&lt;br /&gt;
|returns=[[int (type)|int]] the union of sets &amp;lt;var&amp;gt;color1&amp;lt;/var&amp;gt;, &amp;lt;var&amp;gt;color2&amp;lt;/var&amp;gt;, …&lt;br /&gt;
|addon=ComputerCraft&lt;br /&gt;
|desc=Computes the union of sets of colors; each parameter may be a single color or may be a set of colors&lt;br /&gt;
|examples=&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Combine white, magenta, and light blue to yield 13 (the bitwise combination of the colors)&lt;br /&gt;
|code=print(colors.combine(colors.white, colors.magenta, colours.lightBlue))&lt;br /&gt;
|output=13&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:API_Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Bit.bnot&amp;diff=4332</id>
		<title>Bit.bnot</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Bit.bnot&amp;diff=4332"/>
				<updated>2012-11-30T18:35:47Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Int linking fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=bit.bnot&lt;br /&gt;
|args=[[int (type)|int]] n&lt;br /&gt;
|api=bit&lt;br /&gt;
|returns=[[int (type)|int]] the value of NOT &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt;&lt;br /&gt;
|addon=ComputerCraft&lt;br /&gt;
|desc=Computes the bitwise NOT of a number, taken in the domain and range of 32-bit unsigned integers&lt;br /&gt;
|examples=&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=NOT the number 18 (10010), yielding 4294967277 (11111111111111111111111111101101, 32 bits in length)&lt;br /&gt;
|code=print(bit.bnot(18))&lt;br /&gt;
|output=4294967277&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Explanation ==&lt;br /&gt;
All bit operations operate in binary numeral system [http://en.wikipedia.org/wiki/Binary_numeral_system]. A NOT operation yields a 1 if its input is 0 and a 0 if its input is 1. This function produces an output by computing the NOT of each bit of its input independently. So, for the example above:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bit index:&lt;br /&gt;
| 31&lt;br /&gt;
| 30&lt;br /&gt;
| 29&lt;br /&gt;
| 28&lt;br /&gt;
| 27&lt;br /&gt;
| 26&lt;br /&gt;
| 25&lt;br /&gt;
| 24&lt;br /&gt;
| 23&lt;br /&gt;
| 22&lt;br /&gt;
| 21&lt;br /&gt;
| 20&lt;br /&gt;
| 19&lt;br /&gt;
| 18&lt;br /&gt;
| 17&lt;br /&gt;
| 16&lt;br /&gt;
| 15&lt;br /&gt;
| 14&lt;br /&gt;
| 13&lt;br /&gt;
| 12&lt;br /&gt;
| 11&lt;br /&gt;
| 10&lt;br /&gt;
| 9&lt;br /&gt;
| 8&lt;br /&gt;
| 7&lt;br /&gt;
| 6&lt;br /&gt;
| 5&lt;br /&gt;
| 4&lt;br /&gt;
| 3&lt;br /&gt;
| 2&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
! Input (18):&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
! Output (4294967277):&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:API_Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Bit.brshift&amp;diff=4331</id>
		<title>Bit.brshift</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Bit.brshift&amp;diff=4331"/>
				<updated>2012-11-30T18:35:24Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Int linking fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=bit.brshift&lt;br /&gt;
|args=[[int (type)|int]] n, [[int (type)|int]] bits&lt;br /&gt;
|api=bit&lt;br /&gt;
|returns=[[int (type)|int]] the value of &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; shifted right by &amp;lt;var&amp;gt;bits&amp;lt;/var&amp;gt; bits, which is equivalent to ⌊&amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt;÷2&amp;lt;sup&amp;gt;&amp;lt;var&amp;gt;bits&amp;lt;/var&amp;gt;&amp;lt;/sup&amp;gt;⌋&lt;br /&gt;
|addon=ComputerCraft&lt;br /&gt;
|desc=Shifts a number right by a specified number of bits&lt;br /&gt;
|examples=&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Shift the number 73 (1001001) right by 2 bits, yielding 18 (10010)&lt;br /&gt;
|code=print(bit.brshift(73, 2))&lt;br /&gt;
|output=18&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:API_Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Bit.blshift&amp;diff=4330</id>
		<title>Bit.blshift</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Bit.blshift&amp;diff=4330"/>
				<updated>2012-11-30T18:35:06Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Int linking fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=bit.blshift&lt;br /&gt;
|args=[[int (type)|int]] n, [[int (type)|int]] bits&lt;br /&gt;
|api=bit&lt;br /&gt;
|returns=[[int (type)|int]] the value of &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; shifted left by &amp;lt;var&amp;gt;bits&amp;lt;/var&amp;gt; bits, which is equivalent to &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt;×2&amp;lt;sup&amp;gt;&amp;lt;var&amp;gt;bits&amp;lt;/var&amp;gt;&amp;lt;/sup&amp;gt;&lt;br /&gt;
|addon=ComputerCraft&lt;br /&gt;
|desc=Shifts a number left by a specified number of bits&lt;br /&gt;
|examples=&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Shift the number 18 (10010) left by 2 bits, yielding 72 (1001000)&lt;br /&gt;
|code=print(bit.blshift(18, 2))&lt;br /&gt;
|output=72&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:API_Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=User:MathManiac0/Templates&amp;diff=4328</id>
		<title>User:MathManiac0/Templates</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=User:MathManiac0/Templates&amp;diff=4328"/>
				<updated>2012-11-30T18:34:16Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Int linking fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Look in the source code to see how the tables are made.''&lt;br /&gt;
&lt;br /&gt;
''These pieces of data isn't real; they are instead examples how the templates can be made.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
 Function Template&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
{{Function&lt;br /&gt;
|name=foo.Bar&lt;br /&gt;
|args= [[int (type)|int]] number&lt;br /&gt;
|returns=[[int (type)|int]] number&lt;br /&gt;
|api=[[peripherals]]&lt;br /&gt;
|addon=ComputerCraft&lt;br /&gt;
|desc=Returns the given number&lt;br /&gt;
|examples=&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Prints the number wrapped by foo.Bar()&lt;br /&gt;
|code=print(foo.Bar(2))&lt;br /&gt;
|output=2&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Disk.getID&amp;diff=4327</id>
		<title>Disk.getID</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Disk.getID&amp;diff=4327"/>
				<updated>2012-11-30T18:33:32Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Int linking fix; awkward phrasing re-phrased.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=disk.getDiskID&lt;br /&gt;
|args=[[string (type)|string]] side&lt;br /&gt;
|api=disk&lt;br /&gt;
|returns=[[int (type)|int]] disk ID&lt;br /&gt;
|addon=ComputerCraft&lt;br /&gt;
|examples=&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Prints the ID of the disk.&lt;br /&gt;
|code=print(disk.getDiskID(&amp;quot;bottom&amp;quot;))&lt;br /&gt;
|output=The ID of the disk (side varies).&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:API_Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Monitor.setTextScale&amp;diff=4325</id>
		<title>Monitor.setTextScale</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Monitor.setTextScale&amp;diff=4325"/>
				<updated>2012-11-30T18:32:49Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Int linking fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=monitor.setTextScale&lt;br /&gt;
|args=[[int (type)|int]] scale&lt;br /&gt;
|api=peripheral&lt;br /&gt;
|addon=ComputerCraft&lt;br /&gt;
|desc=Sets the size of the text on the monitor.&lt;br /&gt;
|examples=&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Sets the monitor's text scale to 2.&lt;br /&gt;
|code=monitor.setTextScale(2)&lt;br /&gt;
|output=none&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:API_Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Printer.setCursorPos&amp;diff=4324</id>
		<title>Printer.setCursorPos</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Printer.setCursorPos&amp;diff=4324"/>
				<updated>2012-11-30T18:32:29Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Int linking fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=printer.setCursorPos&lt;br /&gt;
|args=[[int (type)|int]] x, [[int (type)|int]] y&lt;br /&gt;
|returns=none&lt;br /&gt;
|api=peripheral&lt;br /&gt;
|addon=ComputerCraft&lt;br /&gt;
|desc=Sets the position of the printer cursor, similar to [[term.setCursorPos]], but on a printer.&lt;br /&gt;
|examples=&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Sets the cursor at the top of the page.&lt;br /&gt;
|code=printer.setCursorPos(1,1)&lt;br /&gt;
|output=none&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua_Core_Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Printer.getInkLevel&amp;diff=4323</id>
		<title>Printer.getInkLevel</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Printer.getInkLevel&amp;diff=4323"/>
				<updated>2012-11-30T18:31:57Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Int linking fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=printer.getInkLevel&lt;br /&gt;
|returns=[[int (type)|int]] Amount of ink in printer.&lt;br /&gt;
|api=peripheral&lt;br /&gt;
|addon=ComputerCraft&lt;br /&gt;
|desc=Tells you how much ink is in the printer.&lt;br /&gt;
|examples=&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Prints true if there's ink in the printer.&lt;br /&gt;
|code=print(printer.getInkLevel() &amp;gt; 0)&lt;br /&gt;
|output=true if there is ink in the printer, false if there isn't ink.&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua_Core_Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Term.setCursorPos&amp;diff=4322</id>
		<title>Term.setCursorPos</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Term.setCursorPos&amp;diff=4322"/>
				<updated>2012-11-30T18:31:25Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Int linking fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=term.setCursorPos&lt;br /&gt;
|args=[[int (type)|int]] x, [[int (type)|int]] y&lt;br /&gt;
|returns=none&lt;br /&gt;
|api=term&lt;br /&gt;
|addon=ComputerCraft&lt;br /&gt;
|desc=Sets the location of the cursor on screen.&lt;br /&gt;
|examples=&lt;br /&gt;
===Basic usage===&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Sets the location of the cursor on screen to the top&lt;br /&gt;
|code=term.setCursorPos(1,1)&lt;br /&gt;
}}&lt;br /&gt;
===Using the old cursor position to affect the new one===&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Sets the location of the cursor to the start of the line.&lt;br /&gt;
|code=oldx, oldy = term.getCursorPos()&amp;lt;br /&amp;gt;term.setCursorPos(1,oldy)&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:API_Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Rednet.send&amp;diff=4321</id>
		<title>Rednet.send</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Rednet.send&amp;diff=4321"/>
				<updated>2012-11-30T18:30:58Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Int linking fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=rednet.send&lt;br /&gt;
|args=[[int (type)|int]] receiverID, [[string]] message, [[boolean_(type)|boolean]] WaitUntilPortOpen&lt;br /&gt;
|returns=[[boolean_(type)|boolean]] success code. True if a message has been sent, false if not. &amp;quot;true&amp;quot; does not guarantee, that the destination was reachable!&lt;br /&gt;
|api=rednet&lt;br /&gt;
|addon=ComputerCraft&lt;br /&gt;
|desc=Sends a message to a specific Computer or Turtle. (see [[rednet.broadcast|rednet.broadcast( message )]] and [[rednet.receive|rednet.receive( timeout )]].&amp;lt;br /&amp;gt;To get the id from a computer see [[os.computerID|os.computerID()]]. Setting WaitUntilPortOpen to True can help when the server is not receiving a response from the responding client.&lt;br /&gt;
|examples=&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Sends a Message to the Computer with the ID 22 (assuming a modem is attached and open), and will wait until the port is available to use.&lt;br /&gt;
|code=rednet.send(22,&amp;quot;ComputerCraft&amp;quot;, true)&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:API_Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Redstone.setBundledOutput&amp;diff=4319</id>
		<title>Redstone.setBundledOutput</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Redstone.setBundledOutput&amp;diff=4319"/>
				<updated>2012-11-30T18:29:45Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Int linking fix.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=redstone.setBundledOutput&lt;br /&gt;
|args=[[string]] side, [[int (type)|int]] colors&lt;br /&gt;
|api=redstone&lt;br /&gt;
|returns=?&lt;br /&gt;
|addon=ComputerCraft&lt;br /&gt;
|examples=&lt;br /&gt;
===Basic usage===&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Toggles between the black and white wires every two seconds&lt;br /&gt;
|code=while(true) do&amp;lt;br /&amp;gt;    redstone.setBundledOutput(&amp;quot;back&amp;quot;, colors.black)&amp;lt;br /&amp;gt;    sleep(2)&amp;lt;br /&amp;gt;    redstone.setBundledOutput(&amp;quot;back&amp;quot;, colors.white)&amp;lt;br /&amp;gt;    sleep(2)&amp;lt;br /&amp;gt;end&lt;br /&gt;
|output=(nothing on the screen)&lt;br /&gt;
}}&lt;br /&gt;
===Combining outputs===&lt;br /&gt;
The value is passed as an integer, so sending multiple colors is as easy as adding them together:&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Toggles between the black/white and red/blue wires every two seconds&lt;br /&gt;
|code=while(true) do&amp;lt;br /&amp;gt;    redstone.setBundledOutput(&amp;quot;back&amp;quot;, colors.black+colors.white)&amp;lt;br /&amp;gt;    sleep(2)&amp;lt;br /&amp;gt;    redstone.setBundledOutput(&amp;quot;back&amp;quot;, colors.red+colors.blue)&amp;lt;br /&amp;gt;    sleep(2)&amp;lt;br /&amp;gt;end&lt;br /&gt;
|output=(nothing on the screen)&lt;br /&gt;
}}&lt;br /&gt;
===Clearing the output===&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Unsets the output (removes all power)&lt;br /&gt;
|code=function unsetAll(sSide)&amp;lt;br /&amp;gt;    redstone.setBundledOutput(sSide, 0)&amp;lt;br /&amp;gt;end&lt;br /&gt;
|output=(nothing on the screen)&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua_Core_Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	<entry>
		<id>https://www.computercraft.info/wiki/index.php?title=Tostring&amp;diff=4315</id>
		<title>Tostring</title>
		<link rel="alternate" type="text/html" href="https://www.computercraft.info/wiki/index.php?title=Tostring&amp;diff=4315"/>
				<updated>2012-11-30T18:26:57Z</updated>
		
		<summary type="html">&lt;p&gt;Lyqyd: Lua -&amp;gt; ComputerCraft, to match tonumber's entry.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{lowercase}}&lt;br /&gt;
{{Function&lt;br /&gt;
|name=tostring&lt;br /&gt;
|args=Object o&lt;br /&gt;
|returns=[[string (type)|string]] representation of the Object &amp;lt;var&amp;gt;o&amp;lt;/var&amp;gt;&lt;br /&gt;
|api=&lt;br /&gt;
|addon=ComputerCraft&lt;br /&gt;
|desc=Converts any passed object to it's string-representation.&lt;br /&gt;
|examples=&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Convert an [[int (type)|integer]] to a [[string (type)|string]]&lt;br /&gt;
|code=local a = tostring(1)&lt;br /&gt;
|output= a = &amp;quot;1&amp;quot; ([[string (type)|string]])&lt;br /&gt;
}}&lt;br /&gt;
{{Example&lt;br /&gt;
|desc=Convert a [[float (type)|float]] to a [[string (type)|string]]&lt;br /&gt;
|code=local b = tostring(3.1415)&lt;br /&gt;
|output= b = &amp;quot;3.1415&amp;quot; ([[string (type)|string]])&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Lua_Core_Functions]]&lt;/div&gt;</summary>
		<author><name>Lyqyd</name></author>	</entry>

	</feed>