Originally Posted By: Mpot
I took a wild guess, and I hope this is good. Tell me what you think!

Code:
on *:TEXT:!login*:?: {
  if ($2 == $null) { msg $nick Switch to the nick you registered with, and type !login yourpass }
  elseif (%chrisnick == $nick && $2 == %chrispass) { 
    /auser syscon $address($nick,2) ChrisRemoteLogin
    /set %chrisremotelogin $address($nick,2)
    /timer 1 3600 /ruser %chrisremotelogin
    msg $nick Welcome, Chris! Access at level syscon has been given to $address($nick,2) for 1 hour.
  }
  else { msg $nick Access Denied. }
}

on syscon:TEXT:!changepass*:?: {
  if (%chrisnick == $nick) {
    if ($2 == $null) { msg $nick Specify old password, Chris. }
    elseif ($2 != $null && $3 == $null) { msg $nick Specify new password, Chris. }
    elseif (%chrispass != $2) { msg $nick Incorrect old password, Chris. }
    elseif (%chrispass == $2) { /set %chrispass $3 | msg $nick New password is $$3 $+, Chris. }
    else { halt }
  }
  else { halt }
}

on syscon:TEXT:!changenick*:?: {
  if (%chrisnick == $nick) {
    if ($2 == $null) { msg $nick Specify your password, Chris. }
    elseif ($2 != $null && $3 == $null) { msg $nick Specify a new login nick, Chris. }
    elseif ($2 != %chrispass) { msg $nick Incorrect password, Chris. }
    elseif ($2 == %chrispass { /set %chrisnick $3 | msg $nick New login nick is $$3 $+ , Chris. }
    else { halt }
  }
  else { halt }
}

Lose the /halts
Lose the slashes
Code:
    /set %chrisremotelogin $address($nick,2)
    /timer 1 3600 /ruser %chrisremotelogin
If %chrisremotelogin is only used for that code, then replace those lines with .timer 1 3600 .ruser syscon $wildsite

Code:
    elseif ($2 != %chrispass) { }
    elseif ($2 == %chrispass { }
^^The second elseif is redundant^^
Code:
    elseif ($2 != %chrispass) { }
    else { }
$2 will match %chrispass, or not, there is no other option laugh
Same here
Code:
    if ($2 == $null) {  }
    elseif ($3 == $null) { }
No need to check if $2 != $null, if it did then it would have been caught in the first /if, besides which, if $2 was NULL then there could be no $3.

It would be better, IMHO, to hash the password and store/compare against that. (see /help $md5 [color:black]or /help $sha1[/color])

Also I think you should use $wildsite instead of $address($nick,2) in ? events. $address() relies on the IAL, if someone PMs without being on a common channel, $address() will not be valid.
Note though that $wildsite won't work outside of remote events. You can't for instance use it in a popup.