OnNotice, OnPerception, OnSight... they all work the same way, at different radius size "bubbles".
I would think that you could use a generic OnPerception script with an additional logic check to verify that which has been noticed is what you actually want noticed.
int nEvent = GetUserDefinedEventNumber(); // OnPerception
if (nEvent == 1002) && (GetObjectByTag(oNoticed) == yournoticedtag)
This would work fine for K1, I would think it should work for TSL as well.