Resolution: Cannot Reproduce
Minecraft 1.8.8, Minecraft 15w35b, Minecraft 15w38a, Minecraft 15w38b, Minecraft 15w39c, Minecraft 15w40a, Minecraft 15w41b, Minecraft 15w42a, Minecraft 15w46a, Minecraft 15w47a, Minecraft 15w47b, Minecraft 15w47c, Minecraft 15w49a, Minecraft 15w49b, Minecraft 15w50a, Minecraft 15w51a, Minecraft 15w51b, Minecraft 16w02a, Minecraft 16w03a, Minecraft 16w04a, Minecraft 16w05a, Minecraft 16w05b, Minecraft 16w06a, Minecraft 1.9 Pre-Release 3, Minecraft 1.10.2, Minecraft 16w32a, Minecraft 16w32b, Minecraft 16w33a
The Fireball classes (including "Fireball", "SmallFireball", "DragonFireball", and "WitherSkull") are meant to kill themselves if they're inside the ground after 600 ticks. However, this does not happen automatically because the necessary requirements cannot be achieved without the aid of commands or third-party editors.
1. The "xTile", "yTile", and "zTile" values are meant to store its current location but do not, all defaulting to either -1 if created normally (ghast firing) or 0 if using the /summon command (and not specifying them manually). Those values are never updated automatically, staying at what they default to/are manually defined as.
2. The "inTile" tag is supposed to store the current block the fireball is within, defaulting to "minecraft:air". However, it also never updates, requiring the use of commands to change its value.
3. The "inGround" tag is supposed to state whether or not the fireball is inside the ground. This also never gets updated even if the fireball is in the ground, so requires the use of commands to set it to 1.
4. The "life" tag, new to 1.9, stores how long the fireball has been underground. Once this value reaches 600 after requirements are met, then the fireball is deleted.
1. "inGround" must be 1 (only achievable through commands).
2. "xTile", "yTile", and "zTile" must point to a block that has the same ID as the one defined in "inTile" (only changed by commands).
3. "life" must be 600 (works correctly, but only if the above functions).
4. Once all of the above are met, the fireball is killed.
Example (working, with aid):
Ensure that at (0,0,0) in your world, there is bedrock. Summon the following fireball, defaulting "xTile", "yTile", and "zTile" to 0:
After 3 seconds, the fireball will be deleted. Note that the xTile/yTile/zTile are pointing to (0,0,0) and yet the Fireball itself is at (0,15,0), showing that the tags do not update. Since there was bedrock where the tile tags were pointing to, and because the "inGround" tag is set to 1, the fireball is able to be deleted.
Example (not working, no aid):
Ensure that at (5,0,5) in your world, there is any non-air block, preferably bedrock for testing consistency. Summon the following fireball:
It will be summoned into the ground at the position of the bedrock. "inGround" will never become 1, "xTile", "yTile", and "zTile" will never change from (0,0,0), "inTile" will always be "minecraft:air", and "life" will remain at the defined 540.
Example 2 (not working, no aid, no /summon):
Summon a Ghast:
Go into survival mode, allow it to shoot a fireball at you, and then run the following command while the fireball still exists (or use a third-party NBT editor):
You will obtain the data of the entity, in that "xTile", "yTile", and "zTile" are always -1.
The fix, as implied already, is to correctly track xTile/yTile/zTile, inGround, and inTile. Projectile classes (arrows) do this same thing correctly, although they are tracking a maximum of 1200 ticks instead of 600. Note that fireball classes are not extending projectile classes; they are completely separate. The addition of the "life" tag in 1.9 for fireballs implies that this is an intentional feature (this problem occurs in 1.8 as well), but is not capable of running without the aid described above.