--- /dev/null
+move free target check after the snircd chanmode checks - dont use up a free target when the message never had a chance
+
+diff -r 03afb3a4d053 ircd/ircd_relay.c
+--- a/ircd/ircd_relay.c Sat Mar 20 14:53:39 2010 +0100
++++ b/ircd/ircd_relay.c Sat Mar 20 15:03:03 2010 +0100
+@@ -103,9 +103,6 @@
+ send_reply(sptr, ERR_CANNOTSENDTOCHAN, chptr->chname);
+ return;
+ }
+- if ((chptr->mode.mode & MODE_NOPRIVMSGS) &&
+- check_target_limit(sptr, chptr, chptr->chname, 0))
+- return;
+
+ /* +T check */
+ if ((chptr->mode.mode & MODE_NOMULTITARGET) && (targetc > 1)) {
+@@ -128,6 +125,10 @@
+ return;
+ }
+
++ if ((chptr->mode.mode & MODE_NOPRIVMSGS) &&
++ check_target_limit(sptr, chptr, chptr->chname, 0))
++ return;
++
+ RevealDelayedJoinIfNeeded(sptr, chptr);
+ sendcmdto_channel_butone(sptr, CMD_PRIVATE, chptr, cli_from(sptr),
+ SKIP_DEAF | SKIP_BURST, "%H :%s", chptr, text);
+@@ -156,10 +157,6 @@
+ if (!client_can_send_to_channel(sptr, chptr, 0))
+ return;
+
+- if ((chptr->mode.mode & MODE_NOPRIVMSGS) &&
+- check_target_limit(sptr, chptr, chptr->chname, 0))
+- return;
+-
+ if ((chptr->mode.mode & MODE_NONOTICE))
+ return;
+
+@@ -178,6 +175,10 @@
+ if (*ch++==1)
+ return;
+
++ if ((chptr->mode.mode & MODE_NOPRIVMSGS) &&
++ check_target_limit(sptr, chptr, chptr->chname, 0))
++ return;
++
+ RevealDelayedJoinIfNeeded(sptr, chptr);
+ sendcmdto_channel_butone(sptr, CMD_NOTICE, chptr, cli_from(sptr),
+ SKIP_DEAF | SKIP_BURST, "%H :%s", chptr, text);
+diff -r 03afb3a4d053 ircd/m_wallchops.c
+--- a/ircd/m_wallchops.c Sat Mar 20 14:53:39 2010 +0100
++++ b/ircd/m_wallchops.c Sat Mar 20 15:03:03 2010 +0100
+@@ -118,9 +118,6 @@
+
+ if (IsChannelName(parv[1]) && (chptr = FindChannel(parv[1]))) {
+ if (client_can_send_to_channel(sptr, chptr, 0) && !(chptr->mode.mode & MODE_NONOTICE)) {
+- if ((chptr->mode.mode & MODE_NOPRIVMSGS) &&
+- check_target_limit(sptr, chptr, chptr->chname, 0))
+- return 0;
+
+ /* +cC checks */
+ if (chptr->mode.mode & MODE_NOCOLOUR)
+@@ -135,6 +132,10 @@
+ return 0;
+ }
+
++ if ((chptr->mode.mode & MODE_NOPRIVMSGS) &&
++ check_target_limit(sptr, chptr, chptr->chname, 0))
++ return 0;
++
+ RevealDelayedJoinIfNeeded(sptr, chptr);
+ sendcmdto_channel_butone(sptr, CMD_WALLCHOPS, chptr, cptr,
+ SKIP_DEAF | SKIP_BURST | SKIP_NONOPS,
+diff -r 03afb3a4d053 ircd/m_wallvoices.c
+--- a/ircd/m_wallvoices.c Sat Mar 20 14:53:39 2010 +0100
++++ b/ircd/m_wallvoices.c Sat Mar 20 15:03:03 2010 +0100
+@@ -117,9 +117,6 @@
+
+ if (IsChannelName(parv[1]) && (chptr = FindChannel(parv[1]))) {
+ if (client_can_send_to_channel(sptr, chptr, 0) && !(chptr->mode.mode & MODE_NONOTICE)) {
+- if ((chptr->mode.mode & MODE_NOPRIVMSGS) &&
+- check_target_limit(sptr, chptr, chptr->chname, 0))
+- return 0;
+
+ /* +cC checks */
+ if (chptr->mode.mode & MODE_NOCOLOUR)
+@@ -134,6 +131,10 @@
+ return 0;
+ }
+
++ if ((chptr->mode.mode & MODE_NOPRIVMSGS) &&
++ check_target_limit(sptr, chptr, chptr->chname, 0))
++ return 0;
++
+ RevealDelayedJoinIfNeeded(sptr, chptr);
+ sendcmdto_channel_butone(sptr, CMD_WALLVOICES, chptr, cptr,
+ SKIP_DEAF | SKIP_BURST | SKIP_NONVOICES,