Some way to improve this:
-you should use $wildsite inside events instead of $address($nick,2)
-you shouldn't halt the raws everytime, i don't want your script to disable any message.
-$hfind is slow, here $hfind(pnick,$+(!@,$4),1,n) is simply $hget(pnick,$+(!@,$4)) but i would remove that condition and add to the table every information from the /who, because actually it's not really storing every possible information (you are not using on text either to store information about the nick talking), i think you should
-the on start event has a problem, it /hload everytime, whatever if the table exists and whatever if the file exists
-you don't need to halt in the previous alias, why are you halting there?
-on *:join:#: who # < if a netsplit occurs, everyone using your code will be disconnected if used on some big channels, you should /who when $nick == $me only, and otherwise store the information