For registering the events -
A simpler method might be this:
registerInputEvent("fxDTSBrick", "onProjectileHit",
"Self fxDTSBrick" TAB
"Player Player" TAB
"Projectile Projectile" TAB
"Client GameConnection" TAB
"MiniGame MiniGame",
"datablock ProjectileData");
function fxDTSBrick::onProjectileHit(%obj,%projectile,%client)
{
...
%obj.processInputEvent("onProjectileHit", %projectile.dataBlock, %client);
}
When you register it, you specify a type it should be, then when it's triggered you put in the value it should check that against. In this case it checks a projectiledata against the one that hits its' datablock.
Not many types of fields would fit in that space, the most you could do is two boolean or integer fields - the rest would end up being too long.
Maybe check if function fxDTSBrick::onProjectileHit_Check exists and call it like yours in that case for more advanced checks than [datablock == selected value]. For datablock checks, "NONE" should be changed to "ANY" or "ALL" or something so it's clearer.
Apart from that, it looks very nice.