Tutorial:360 degree ender pearl cannon

This tutorial page is a work in progress.
 
Please help expand and improve it. The talk page may contain suggestions.
"360 FTL", the first 360 degree ender pearl cannon to use TNT duping. It takes heavy inspiration from the first 360 cannon made by Rechenmaschine. It was designed in March 2019 by the Monkeys discord community, including Xcom6000, Rechenmaschine, RedCMD, Kayleigh, and ornariece. It was released to YouTube on March 24, 2019.

An ender pearl cannon is a machine that fires an ender pearl to a precise position using explosions for fast player transportation. A 360 degree ender pearl cannon is an ender pearl cannon that can fire within a few blocks of any position in range, in any direction.

A typical ender pearl cannon consists of a few key components:

  • An ender pearl aligner that gets the ender pearl to an exact position reliably.
  • A source of explosions that can control the amount of explosions produced (usually an array of TNT dupers, but TNT dispensers, ghast fireballs, and wind charges are used as well).
  • A basket, which positions the TNT or fireballs so that the explosions occur in reliable positions near the ender pearl.
  • A ROM (read-only memory) that stores the explosion counts for many destinations, so that common destinations may be easily used multiple times.
  • A user interface to select a destination.

This article only covers the logic that governs the basket, since the other components are used in other devices and fit better in their own tutorial pages. This article assumes the reader already knows how to use redstone proficiently and only needs information about how to design a 360 cannon, not how to physically build one.

The math that allows 360 cannons to work

360 cannons are heavily reliant on linear algebra to work. An understanding of some basic concepts in linear algebra makes understanding 360 cannons much easier. If you are not familiar with linear algebra, it is recommended to skip this section. If you wish to become familiar with linear algebra, there are some fantastic introductory lectures by Gilbert Strang for free on YouTube.

The core game mechanic that makes it all possible is the fact that the velocity given by an explosion to an entity is always identical and is added to the entity's existing velocity. This allows us to treat velocities given by explosions as vectors:

  • Two explosion velocities can be added using vector addition. Given two explosion velocities v1=x1,y1,z1 and v2=x2,y2,z2, their sum is v1+v2=x1+x2,y1+y2,z1+z2.
  • An explosion velocity can be scaled by changing the number of explosions in that position. To scale by a negative number, an explosion can be done on the opposite side of the entity to give opposite velocity.

Due to us wanting to hit any position in the 2-dimensional X-Z plane, it will be sufficient to use 2 different explosion positions (and their 2 opposites). Hitting any position in 3D space would require 3 different explosion positions (and their 3 opposites). This is a consequence of the behavior of bases that we will not get into in this article.

Now, assume that we have a basket with A explosions in one position and B explosions in another position. The velocity given to the ender pearl can be written as v=AvA+BvB where vA is the velocity given by each explosion in the first position and vB is the velocity given by each explosion in the second position. This formula can be expanded to [xyz]=A[xAyAzA]+B[xByBzB] and finally written as a matrix multiplication [xyz]=[xAxByAyBzAzB][AB] This 3x2 matrix represents the transformation from explosion counts to ender pearl velocity. In general, we wish to do the opposite: given a target velocity, find the explosion counts that will produce it. This requires finding the inverse of the above matrix, which is not possible to do in general because it isn't square. However, it is possible to create an invertible square matrix by using the linear least-squares method: MTM[AB]=MTv[AB]=(MTM)1MTv Now compute MTM: [vAvB][vAvB]=[vA2vAvBvAvBvB2] Now compute (MTM)1: (MTM)1=1vA2vB2(vAvB)2[vA2vAvBvAvBvB2] And finally multiply by MT: (MTM)1MT=1vA2vB2(vAvB)2[vA2vA(vAvB)vB(vAvB)vA+vB2vB] This is the matrix that transforms ender pearl velocity into explosion counts. Written out in full, it is: p1=x12+y12+z12p2=x22+y22+z22q=x1x2+y1y2+z1z2E=(MTM)1MT=1p1p2q2[p1x1qx2p1y1qy2p1z1qz2p2x2qx1p2y2qy2p2z2qz1]

Making a basket

Basic basket (4 corners)

The most basic basket allowing 360 degree range has 4 possible explosion positions, but uses only 2 for any given shot. In the case of TNT it is easiest to align it into the corners of blocks.

Ideally the TNT should go as close to the ender pearl as possible. With this basket the pearl goes in the middle, and because of the ender pearl's collision checks with TNT, the closest the TNT can go is 0.79 blocks away from the center. Therefore the biggest block hitbox that can be used on the corners is 11 pixels (most notably flower pots, conduits, and walls with no middle column).

Lava is most commonly used to stop the explosions from destroying blocks. Water also works, but unlike lava it cannot be used in the Nether and changes the ender pearl's movement. It is common to hold up the TNT using fences under the lava because raycasts cannot hit the top part of the fences and obstruct the explosion (see Explosion#Edge cases for more about the exposure raycasts).

Choosing a direction

One possible combination of TNT positions in a basic 4-corner basket. Only one quadrant of the world is reachable, here marked in blue.

Each pair of TNT positions can reach only one out of the 4 quadrants of the world. With the pictured slime block layout, there is always one slime block that stays retracted and one that extends. To calculate TNT counts you need to first decide which quadrant the destination is in, and then use those two explosion positions for the rest.

"Differential" basket

A desmos graph showing three inscribed shapes. The smallest is a diamond/rotated square with side lengths 1. The middle shape is an axis-aligned square with side lengths root 2. The biggest is a circle of radius 1.
A comparison of the ranges of different basket types. The smallest diamond/rotated square is the simple 4-corner basket. The axis-aligned square is the differential basket. The circle is the circle basket. Graph link: https://www.desmos.com/calculator/xp9i5dpbku

The simple 4-corner basket has a major inefficiency: The two corners of TNT come from different sources. This means that, for example, shooting along a perfect diagonal uses at most half of the available TNT in the whole cannon. It would be more efficient if the total amount of TNT could be split in any ratio between the two corners. This is the concept of the "differential" basket. The name comes from the differential used in the drive of wheeled robots, specifically the "swerve" drive used commonly in FTC robotics.

In order to get the TNT in any ratio, the TNT enters the basket and is then separated using entity stack separation. This can be done using a trapdoor or fence gate activated by a pressure plate, but it's usually easier to use other TNT. Here is the required update order when using TNT:

  1. All the main TNT is aligned into the exact same position.
  2. Upwards or downwards acceleration TNT explodes. This is necessary so that one of the two "corners" doesn't affect the other. The main TNT needs to be given at least 8 blocks/tick of velocity (or 8.04 when accelerating upwards to counteract gravity) so that it moves out of explosion range in a single tick.
  3. Sideways acceleration TNT explodes. The purpose of this is to get the first "batch" of TNT the required velocity to hit a corner. After this step the main TNT should all have above 8 blocks/tick of velocity in Y and diagonal velocity in X and Z.
  4. First "batch" of main TNT ticks. It moves vertically from its starting point, then diagonally to its final position in the first "corner", then explodes there.
  5. Stack separation TNT explodes. Only the second "batch" of main TNT, which hasn't ticked yet, is affected. It is given the velocity required to cancel its existing horizontal velocity and end with enough to reach the second "corner".
  6. Second "batch" of main TNT ticks. It moves vertically from its starting point, then diagonally to its final position in the second "corner", then explodes there.

Encoding schemes

This section is a work in progress.
 
Please help expand and improve it. The talk page may contain suggestions.

There are many different possible ways to encode the TNT sources to produce TNT in the correct order. For ease of wiring, it is generally good to minimize the amount of TNT that needs to switch batches.

Variable bit strategy
An example for how TNT dupers can be wired to work with a differential basket. The left side is the complex side and the right side is the simple side. The bits are: the 4 complex side bits, the variable bit, the side swap bit, and the 4 simple side bits. The code represents 5 TNT early and 3 TNT late. The piston activated by the side swap bit is sticky.

One way to encode a differential basket is to have a "variable bit". The strategy is based off of the assumption that one corner of the basket will always have an explosion count larger or equal to the other. By default, we assume that the early corner is always the smallest. This allows us to have 2 sides to the cannon: the "simple side" that has all its TNT on the late order, and the "complex side" that has some TNT in each order.

Notice that when the amount of explosions on each corner is less than half of the total TNT count, the simple side will be entirely late TNT and the complex side will be entirely early TNT. When more TNT is needed on the late corner, we can encode with the following strategy:

  • Fill the complex side with all required early TNT, which is guaranteed to be less than half of the total TNT.
  • Fill the rest of the complex side completely with late TNT. This amount is also guaranteed to be less than half of the total TNT.
  • Fill the remaining late TNT needed in the simple side.

Now if we need more TNT on the early corner, we can swap the entire simple side to produce late TNT and use the same strategy:

  • Fill the complex side with (half the total TNT) - (required late TNT) early TNT, which is guaranteed to be less than half of the total TNT.
  • Fill the rest of the complex side completely with late TNT. This amount is also guaranteed to be less than half of the total TNT.
  • Fill the remaining early TNT needed in the simple side.

This scheme requires 2 additional bits of information compared to a simple basket:

  • A "variable bit" which enables all disabled TNT on the complex side but with a later order.
  • A "side swap bit" that toggles the order of the simple side.

One important observation is that the "side swap bit" will only be on if the "variable bit" is also on. This allows both to be represented as a single ternary number: 0 if both corners have less than half the total TNT, 1 if more TNT is needed late, and 2 if more TNT is needed early. In total this means that encoding a cannon with 2^N TNT requires 2N + 1.5 bits of information.

Here is a table comparing the functionality of each bit in the encoding between a simple basket and a differential basket:

Simple 4-corner basket Differential basket
Physical side Bit in a normal cannon Purpose Physical side Equivalent bit using variable bit strategy Purpose
Side 1 Bit 1 Add 1 TNT to side 1 Complex side Bit 1 Add 1 early TNT to complex side
Bit 2 Add 2 TNT to side 1 Bit 2 Add 2 early TNT to complex side
Bit 3 Add 4 TNT to side 1 Bit 3 Add 4 early TNT to complex side
Bit 4 Add 8 TNT to side 1 Bit 4 Add 8 early TNT to complex side
Variable bit Add all disabled TNT on the complex side as late TNT
Side 2 Bit 5 Add 1 TNT to side 2 Simple side Bit 5 Add 1 late TNT to simple side
Bit 6 Add 2 TNT to side 2 Bit 6 Add 2 late TNT to simple side
Bit 7 Add 4 TNT to side 2 Bit 7 Add 4 late TNT to simple side
Bit 8 Add 8 TNT to side 2 Bit 8 Add 8 late TNT to simple side
Side swap bit Change the order of the entire simple side from late to early

Circle basket

An example of a circle basket. The side acceleration TNT is placed at the furthest possible pixel position, and campfires are used to block all exposure rays except 1. The resulting motion is 0.000390528979896351 in both X and Z.

There is still another inefficiency in the differential basket. Acceleration is most efficient along the 4 fixed explosion positions, but shooting exactly in between two of the explosion velocity directions is inefficient. It would be better if we could position every explosion in one place and be able to change freely where that place is, which would give a circular range instead of a square range.

However, putting every TNT in the same position is also inefficient. In order to have the same precision as a differential basket, there would have to be an entire cannon of TNT just to position the explosions accurately enough. This would end up doubling the amount of total TNT, where half is used to position the explosion and the other half explodes in that position. In the circle basket we find a better compromise.

The idea is to use the differential basket technology with 2 explosion positions, but choose the 2 positions freely from a grid of possible positions. In order for the explosion efficiency to be optimal the grid needs to be as small as possible. To achieve this we can use the same TNT-based TNT separation technology from the differential basket, but with multiple side acceleration TNT. Each one needs to give the main TNT the minimum possible motion to keep the grid small.

The size of the grid does not need to be very large to approximate a circle very closely. In the differential basket, 4 possible points gave a square. Here, a 3x3 grid gives an octagon, a 5x5 grid gives a 16-gon, a 7x7 grid gives a 32-gon, a 9x9 grid gives a 48-gon, and so on (these numbers are 8 times the totient sum function). See the desmos graph for a visualization of the true shape of the range.

Once the basket is set up, the encoding is done the same way as the differential basket. However, note that for most target destinations there are multiple pairs of explosion points that can reach it. You may decide if you want to consider all possible pairs; the most efficient pair is always the two points whose velocities point closest to the target, and considering the other pairs gives you a chance to get higher accuracy at the cost of TNT effiiciency.

Calculating how many explosions to use

1. Decide on the explosion points

The first step is to decide which explosion points will be used for the shot. If using a basic 4-corner basket, this means choosing which quadrant the destination is in. For more complicated baskets you may need to repeat this whole calculation (steps 1-5) for multiple pairs of points to pick the best one.

2. Note the explosion velocities

The second step is to write down the velocity given by each explosion point to the pearl. The easiest way to get the velocities is to use the carpet mod to print them using /log explosions full. This will let you click on the velocities in your chat and copy them directly, skipping this whole step. If you don't have the mod, the next best thing is to use the explosion entity influence calculator:

Positions
Explosion X 0.0 Entity X 1.0
Explosion Y 0.061250001192092896 Entity Y 0.0
Explosion Z 0.0 Entity Z 0.0

Exposure
Entity width 0.9800000190734863 Entity height 0.9800000190734863
Layout 3×3×3 Spacing 0.33108108325802205 × 0.33108108325802205 × 0.33108108325802205
Negative corner 0.1621621665160441, 0, 0.1621621665160441 Positive corner 0.8243243330320882, 0.6621621665160441, 0.8243243330320882
Effect on the entity
Power 4.0 Exposure 27 / 27
Knockback multiplier 1.0 Eye height 0.0

Knockback resistance 0.0 Velocity X 0.8731294800642211 blocks/tick
Speed 0.8747657468328084 blocks/tick Velocity Y -0.053479181694784994 blocks/tick
Damage 46.9375 Velocity Z 0.0 blocks/tick


3. Compute the velocity to explosion count matrix

The easiest way to convert a target velocity into explosion counts is to use a matrix multiplication. We will call the matrix that transforms ender pearl velocity into explosion counts E. It is always the same for the same 2 explosion points. For two explosion velocities v1=x1,y1,z1 and v2=x2,y2,z2, the E matrix is given by: p1=x12+y12+z12p2=x22+y22+z22q=x1x2+y1y2+z1z2E=(MTM)1MT=1p1p2q2[p1x1qx2p1y1qy2p1z1qz2p2x2qx1p2y2qy2p2z2qz1] For example: here is the E matrix for a 4-corner basket with a perfectly aligned pearl, being used to calculate the TNT counts to give the pearl 20,0,10 velocity: E=[0.82974785435016800.8297478543501680.82974785435016800.829747854350168][0.82974785435016800.8297478543501680.82974785435016800.829747854350168][20010]=[24.8924356305050378.29747854350168] From that calculation, you find that the TNT counts that get you closest to the target are 25 and 8 respectively.

See the all in one calculator to compute E automatically.

4. Calculate the required ender pearl velocity

Main article: Entity § Motion
Ender Pearl (entity)
Ticking order

Acceleration, Drag, Position

Gravity

0.03 (double)

Drag

0.99 (float)

Terminal velocity

2.97 b/t (59.4 m/s)

Maximum travel

99 blocks per b/t of initial velocity

There are multiple possible trajectories depending on how many ticks the pearl flies for. It is recommended to calculate the explosion counts for all of them and at the end select the one that best fits your needs (the one that gets closest to the destination, the one that arrives fastest, the one that uses the least explosions, etc).

The ender pearl's displacement refers to how far you want it to move from its starting position: displacement=target positionstart position.

The formula for the ender pearl's displacement after t ticks starting with velocity v0 is displacement=d(1dt)1d(v0d1da)+dt1da with d = 0.9900000095367432 and a = [0.0, -0.03, 0.0].

Therefore, you can calculate the required velocity by inverting the above formula: v0=1dd(1dt)(displacementdt1da)+d1da You should now have a value for the initial velocity v0 for each possible tick length t. See the all in one calculator to have this done automatically.

5. Put it all together

Now that you have the initial velocity required to hit the target for every possible travel time, you can feed them into the matrix from step 3 and get explosion counts for each one. You will need to round the outputs of the matrix multiplication so that they represent a discrete amount of explosions.

All in one calculator

Due to the limit for maximum calculations on a wiki page, no more than 30 ticks of data can be shown here.

Computing the velocity to explosion count matrix
Explosion A velocity X 0.6025927001541741 Explosion B velocity X 0.6025927001541741
Explosion A velocity Y 0.0 Explosion B velocity Y 0.0
Explosion A velocity Z 0.6025927001541741 Explosion B velocity Z -0.6025927001541741

The result
X Y Z
First position explosion count 0.829747854350168 0.0 0.829747854350168
Second position explosion count 0.829747854350168 0.0 -0.829747854350168
Target displacement to hit
X Y Z
1000 -20 200
Results
Starting velocity X Starting velocity Y Starting velocity Z Explosions A Explosions B Distance to target
1 tick travel 1010.1010003706325 -20.17202000741265 202.0202000741265 1005.7549652813886 670.5033101875924 19.975765733398973
2 tick travel 507.58843996476975 -10.10669342248322 101.51768799295395 505.4045027444601 336.9363351629734 19.92306199553706
3 tick travel 340.0898928337259 -6.74159685353395 68.01797856674519 338.62663063795515 225.7510870919701 19.85485050997548
4 tick travel 256.34484880777416 -5.051520099708025 51.26896976155483 255.24190592636256 170.16127061757504 19.729643477618243
5 tick travel 206.10120578463003 -4.031421122512313 41.22024115692601 205.21443993453505 136.80962662302335 19.596297936871196
6 tick travel 172.60826300659804 -3.346285911360025 34.52165260131961 171.86560304740104 114.57706869826737 19.51000507890076
7 tick travel 148.68714867159423 -2.852537035790866 29.737429734318848 148.0474110956397 98.69827406375978 19.26452603092875
8 tick travel 130.74842683590688 -2.478385783525816 26.149685367181373 130.18587195210438 86.79058130140294 19.043033282815546
9 tick travel 116.79796638178458 -2.1839495398184394 23.359593276356915 116.29543439729856 77.53028959819905 19.131824680560374
10 tick travel 105.6392886044749 -1.9452987391950987 21.12785772089498 105.18476766556944 70.12317844371296 18.50146746273449
11 tick travel 96.51099793360785 -1.7472054798819905 19.30219958672157 96.09575214792552 64.06383476528369 18.132188974537808
12 tick travel 88.90549729388843 -1.5795178310183347 17.781099458777685 88.52297474344631 59.01531649563087 18.34581598583016
13 tick travel 82.47137329931941 -1.4352075365400265 16.49427465986388 82.11653404850642 54.74435603233761 17.642987067547622
14 tick travel 76.95761636418577 -1.3092544173985174 15.391523272837155 76.62650046490381 51.08433364326921 17.53309024324892
15 tick travel 72.18015276964849 -1.19797701289175 14.436030553929696 71.8695922647398 47.913061509826534 16.699877909524744
16 tick travel 68.00092720536595 -1.0986142314956253 13.60018544107319 67.70834813096924 45.13889875397949 16.655368677243537
17 tick travel 64.31436794348656 -1.0090546543427843 12.862873588697314 64.03765056599424 42.69176704399615 16.21997134918049
18 tick travel 61.03836362131138 -0.9276560708747374 12.207672724262277 60.77574149739416 40.517160998262774 16.91815529198205
19 tick travel 58.108089461012106 -0.8531220032350224 11.621617892202421 57.85807506079488 38.57205004052992 16.101964934628345
20 tick travel 55.471685623434844 -0.7844152733440057 11.09433712468697 55.23301454787855 36.822009698585696 14.84096881625181
21 tick travel 53.0871703179611 -0.7206962650947593 10.61743406359222 52.85875879782018 35.23917253188012 14.289209795472294
22 tick travel 50.920194791498616 -0.6612780241314646 10.184038958299723 50.70110684560629 33.80073789707086 14.310631873669498
23 tick travel 48.94238397251924 -0.6055930707286765 9.788476794503847 48.731805705575866 32.48787047038391 15.718671401636673
24 tick travel 47.13009195408815 -0.5531685094503587 9.42601839081763 46.92731120907691 31.284874139384605 12.884836744163795
25 tick travel 45.46345616096729 -0.5036071124903154 9.092691232193458 45.26784624108664 30.178564160724427 12.614054498471162
26 tick travel 43.92566978584938 -0.4565727683951777 8.785133957169876 43.73667630684302 29.157784204562017 11.979528107971083
27 tick travel 42.50241590642985 -0.41177916440407625 8.500483181285972 42.31954608367034 28.21303072244689 12.375765199106521
28 tick travel 41.181422863107144 -0.36898089400079925 8.236284572621429 41.00423671170012 27.336157807800085 11.343628568110589
29 tick travel 39.952111627504244 -0.32796640428232227 7.990422325500848 39.78021467961605 26.520143119744034 13.933132600526594
30 tick travel 38.8053136972869 -0.28855235385318556 7.761062739457379 38.638350933250784 25.758900622167193 12.099735162636794

Examples

Here are a few curated examples of 360 ender pearl cannons for various game versions and basket types. There is also a playlist on YouTube with all known 360 cannon videos on the platform.

Name Video/schematic link Basket type Game versions
836 FTL On discord in TMC catalogue Differential 1.21.2+
360 FTL HEAVY YouTube video Simple 4-corner 1.13.2~1.21.1 (version specific fixes in video description)
360 FTL YouTube video Simple 4-corner 1.12

Navigation