Updating for 2 issues.

(A) This %no_reply1 handles the hello greeting for all channels, so if hello is said in 2 different channels within 600 seconds, your reply will not happen in that last channel

(B) The %no_reply1 variable exists as a temporary variable for 600 seconds, and then mIRC removes it. However, it's possible that sometime during that 600 seconds, mIRC could perform the occasional safety-save to disk of variables and settings. This can happen by using the /saveini command, and can even happen by simply going into the scripts editor. If that happens, then mIRC writes ALL the variables to disk, including these temporary variables.

If you then exit mIRC normally while this variable exists, mIRC writes the variables to disk as part of its EXIT cleanup, and at that time it does not write the temporary variable to disk.

However, if mIRC crashes or the computer itself crashes/reboots between that safety-save backup and when the 600 seconds period ends, the next time mIRC starts up, that %no_reply1 variable exists as a permanent variable that will never be unset, which means your script will never ever reply to anyone.

* *

There are several solutions:

1. To fix only the 2nd issue, create an ON START event, where you have an /unset command for all temporary variables used by all your scripts which are assuming these variable names will not exist without being temporary. Example:

Code
on *:START:{
  unset %no_reply1
}

2. You can have a separate variable for each channel by having the channelname be part of the variable name. For example %no_reply1#test %no_reply1#zalea etc. It's a little more complicated to create these compound variable names using $chan

So this solution will create your variables instead as item in a hashtable, where you can create temporary hashtable items that disappear after 600 seconds, and the syntax to create and access them is much simpler. The hashtable does not get saved to disk unless you specifically use the /hsave command, and does not get loaded up from disk without using the /hload command. And the /hsave command by default does not save the temporary items to disk unless you use a switch to override that.

This code also has a change where the variable contains the name of the network, so you can be in #channel1 and #channel2 at networks Network1 and Network2, and if someone says hello in all 4 channels near the same time, your script will reply to each channel, and each channel will have its own countdown.

Another change to make it work in several channels is that the name of the timer cannot be the same every time, or else someone's timer will replace an existing timer belonging to a different channel. This creates an item in the hashtable named 0increment that will ensure the timer name changes each time, and allows your script to be changed later so that you can say hello when someone queries you, and 0increment is not likely to be not a valid nick. Note that 0increment is not temporary, because we want this to never repeat the same number.

Code
ON *:TEXT:*Hello*:#:{
  if (!$hget(no_reply1,$+($network,$chan))) {
    hinc -m no_reply1 0increment
    .timerAUTOREPLY $+ $hget(no_reply1,0increment) 1 $rand(2,5) msg $unsafe($chan $nick $+ $chr(44) Hi dude!)
    hadd -mu600 no_reply1 $+($network,$chan) $true
  }
}

* *

Note that both the above scripts will reply to all channels, and some of them will find it annoying for you to answer hello every time someone says hello to anyone else, and this will easily get you banned. You can make the script behave only in a specific channel or in a specific list of channels by changing the :#: to instead list the channel/channels for this script. For example,

ON *:TEXT:*Hello*:#:
changes to

ON *:TEXT:*Hello*:#channel1:
or
ON *:TEXT:*Hello*:#channel1,#channel2:

If the script is limited to acting in only a specific list of channels, then the $unsafe is not needed. Though it's a good idea to get into the habit of using it when a timer contains text that someone else can control!