It is because n is not available in globalspace when the timer triggers..
This requires an in-depth understanding of the command and variable substitutions done by the tcl interpreter. Roughly put however, any parameter enclosed with {} will not be processed for variable nor command substitutions, but instead passed on to the command as is.
In your case, both the condition and if_true parameters are enclosed with {}, and neither have any variable substitutions within the proc. When the timer triggers, the commandline is executed. The if-command then evaluates the first parameter (in the same fashion as calling eval) and tests the result; this will trigger both command and variable substitutions. However, neither n or c are now available, as the nameless space in the proc that created the timer has now been destroyed. Same applies for the if_true parameter.
Solving this, unfortunately, is not as easy as replacing {} with "", as it is very easy to accidentally pass the content of c and n to the interpreter, and unwanted substitutions are done - possibly leading to both your eggdrop and shell being compromised.
One way around this could be to save the values into some globalspace variable or array, and only pass an id to the timer-code rather than the variable contents. Since you're in control of the id, you could craft it in such manner that it is "safe". This would of course add some overhead to your script in order to maintain and clear this "storage"...