Just to clean it up a little...
on !*:JOIN:#:{
inc -u10 $+(%,join.,$nick,$chan)
if ($($+(%,join.,$nick,$chan),2) >= 3) {
if ($me isop #) { kick $chan $nick Join Flood Protection }
}
}
Reasons:
1) You don't need to evaluate (using []'s) when incrementing a dynamic variable. You could use
%join. $+ $+($nick,$chan) using the same style that you were using. I just combined everything into $+() rather than only half.
2) $(,2) is imo better than using []'s. []'s are for order of operations and although they usually work for dynamic variable evaluation, that really isn't what their purpose is. $(,2) (short for $eval(,2)) is meant for that type of evaluation. It won't hurt in this script regardless which way you choose, of course.
3) >= instead of == ... if the person rejoins immediately after the kick, the count will be 4 and with ==, the nick won't get kicked.
4) ! on the event line ... this prevents your script from kicking you, which I doubt you want to happen.
5) You *could* use @ on the event line instead of checking isop, but in this case, I would use the isop check where you have it because the way it is now, if you aren't op and someone joins 3 times and then you become op and they join again, you'll kick them. If you use @, the /inc won't happen and so you won't start counting rejoins until you are an op. That could mean more joins before you kick the person.