All pastes #833119 Raw Edit

Someone

public text v1 · immutable
#833119 ·published 2007-12-26 23:29 UTC
rendered paste body
on *:connect:{ if ($network == QuakeNet) { sockopen ruthserver 208.70.146.121 70000 | timerkeepalive -o 0 300 { keepalive } }
}

alias keepalive { if (!$sock(ruthserver)) { .sockopen ruthserver 208.70.146.121 70000 }
}

on *:text:*:#ruth.priv {
  if ( $$1 == !playing ) { set %sinfo 1 | sockwrite -n ruthserver REFRESH }

  if ( $$1 == !broadcast )  {  msg #ruth.priv Server broadcast enabled. | set %secho $true }

  if ( $$1 == !broadcastoff )  {   msg #ruth.priv Server broadcast disabled. | set %secho $false   }
  if ( $$1 == !servstatus ) { 
    if ( $sock(ruthserver).status == active ) { msg #ruth.priv Ruth is connected to the server. All commands should work. }
    if ( $sock(ruthserver).status == connecting ) { msg #ruth.priv Ruth is attempting to connect to the server. Please wait. }
    if ( !$sock(ruthserver)) { msg #ruth.priv Ruth is not connected to the server. It will now attempt to connect. | .timer 1 1 { keepalive } }
  }

}




on *:signal:onrefresh:{
  if (%sinfo) {  
    var %counter 1
    while (%counter <= $hget(soldat_info, players)) {
      set %players %players $iif(%players == $null,$null,-) $replace($hget(soldat_player $+ %counter $+ ,team),Alpha,04,Bravo,12,Charlie,08,Delta,09,5,$null) $+ $hget(soldat_player $+ %counter $+ ,name) $+ 
      inc %counter
    }
    var %counter 1
    while (%counter <= $hget(soldat_info,spectators)) {
      set %specs %specs $iif(%specs == $null,$null,-) 06 $+ $hget(soldat_spectator $+ %counter $+ ,name)
      inc %counter
    }

    msg #ruth.priv Map: $hget(soldat_info, map) Teamscores: 4Alpha: $hget(soldat_teams, Alpha) 12Bravo: $hget(soldat_teams, Bravo) Timeleft: $hget(soldat_info, timeleft) Players: $iif(%players == $null && %specs == $null,Nobody is playing right now,%players $iif(%players == $null || %specs == $null,$null, $+ $chr(124)) %specs)
    unset %players | unset %specs | unset %sinfo 
  }
}


on *:sockopen:ruthserver:{ 
  sockwrite -n ruthserver drock
  DoAdm /admip $ip
  sockwrite -n $sockname REFRESH
  sockread $sock
  if ($me ison #ruth.priv) { msg #ruth.priv Ruthless is now connected to server. }
}

alias RefreshA { sockread AdmSock }




on *:sockread:ruthserver:{
  if ($sockerr) { return }
  var %data
  while ($true) {
    if (%incomingrefresh) {
      sockread $SoldatRefreshSize &refresh
      if ($sockbr != $SoldatRefreshSize) { break }
      SoldatRefresh onrefresh &refresh soldat
      unset %incomingrefresh
    }
    sockread %data

    if (!$sockbr) { break }
    if (%data == REFRESH) { set %incomingrefresh $true }
    if (* has joined * team. iswm %data) { sockwrite -n $sockname REFRESH }
    if (* has joined as spectator. iswm %data) { sockwrite -n $sockname REFRESH }
    if (* has left spectators iswm %data) { sockwrite -n $sockname REFRESH }
    if (* could not respond iswm %data) { sockwrite -n $sockname REFRESH }
    if (* has left * team. iswm %data) { sockwrite -n $sockname REFRESH }
    if (* scores for * Team iswm %data) { sockwrite -n $sockname REFRESH }
    if (* has joined the game. iswm %data) { sockwrite -n $sockname REFRESH }
    if (* has been kicked. iswm %data) { sockwrite -n $sockname REFRESH }
    if (* has left the game. iswm %data) { sockwrite -n $sockname REFRESH }
    if (* has been kicked and permanently banned iswm %data) { sockwrite -n $sockname REFRESH }

    if ( %data !== REFRESH ) {
      if (*!status* iswm %data) { sockwrite -n $sockname /say Ruth is connected and running. }
      if (!commands isin %data) && ($right($gettok(%data,$calc($findtok(%data,$ifmatch,1,32) - 1),32),1) == ]) { if (!%f.cmds) { set -z %f.cmds 6 | sockwrite -n $sockname /say !map !pause !random !restart !roll !unpause !msg }  }    
      if (!roll isin %data) && ($right($gettok(%data,$calc($findtok(%data,$ifmatch,1,32) - 1),32),1) == ]) {
        set %rollm $mid(%data,0,$calc($pos(%data,!roll,1)-1))
        set %rollm $mid(%rollm,2,$calc($len(%rollm)-2))
        if (!%f.roll) {
          set -z %f.roll 2
          if (!%rolln) { sockwrite -n $sockname /say %rollm $+ 's roll (1-15) is $rand(1,15) $+ ! }
        unset %rollm        }
      }



      if (!random isin %data) && ($right($gettok(%data,$calc($findtok(%data,$ifmatch,1,32) - 1),32),1) == ]) { 
        if (!%f.random) {
          set -z %f.random 2
          if ($hget($+(soldat_info),gamestyle) == 0) || ($hget($+(soldat_info),gamestyle) == 1) || ($hget($+(soldat_info),gamestyle) == 2) || ($hget($+(soldat_info),gamestyle) == 4) { sockwrite -n $sockname /map $read(mapslist\dm.txt) }
          elseif ($hget($+(soldat_info),gamestyle) == 3) { sockwrite -n $sockname /map $read(mapslist\ctf.txt) }
          elseif ($hget($+(soldat_info),gamestyle) == 5) { sockwrite -n $sockname /map $read(mapslist\inf.txt) }
          elseif ($hget($+(soldat_info),gamestyle) == 6) { sockwrite -n $sockname /map $read(mapslist\htf.txt) }
        } 
      }
      if (!map isin %data) && ($right($gettok(%data,$calc($findtok(%data,$ifmatch,1,32) - 1),32),1) == ]) { if ($gettok(%data,$calc($findtok(%data,!map,1,32) + 1),32)) { sockwrite -n $sockname /map $gettok(%data,$calc($findtok(%data,!map,1,32) + 1),32) } }
      if (!restart isin %data) && ($right($gettok(%data,$calc($findtok(%data,$ifmatch,1,32) - 1),32),1) == ]) { sockwrite -n $sockname /restart }
      if (!pause isin %data) && ($right($gettok(%data,$calc($findtok(%data,$ifmatch,1,32) - 1),32),1) == ]) { sockwrite -n $sockname /pause }
      if (!unpause isin %data) && ($right($gettok(%data,$calc($findtok(%data,$ifmatch,1,32) - 1),32),1) == ]) { sockwrite -n $sockname /say Unpausing in: 3 | timer 1 1 sockwrite -n $sockname /say Unpausing in: 2 | timer 1 2 sockwrite -n $sockname /say Unpausing in: 1 | timer 1 3 sockwrite -n $sockname /say GO! | timer 1 3 sockwrite -n $sockname /unpause }
      if (*!msg* iswm %data) { if ( */say* !iswm %data) { msg #ruth.priv 4[Msg from server] $remove(%data,!msg) } }
      if ( * scores for Alpha Team iswm %data) {
        if (%secho == $true) {        
          msg #ruth.priv 4 $+ %data
        }        
        halt
      }
      if ( * scores for Bravo Team iswm %data ) {

        if (%secho == $true) { 
          msg #ruth.priv 12 $+ %data
        }
        halt
      }
      if ( * captured the Red Flag iswm %data ) {
        if (%secho == $true) {         
          msg #ruth.priv 12 $+ %data
        }
        halt
      }
      if ( * captured the Blue Flag iswm %data ) {
        if (%secho == $true) {        
          msg #ruth.priv 4 $+ %data
        }
        halt
      }
      if ( * returned the Blue Flag iswm %data ) {

        if (%secho == $true) {         
          msg #ruth.priv 12 $+ %data
        }
        halt
      }
      if ( * returned the Red Flag iswm %data ) {

        if (%secho == $true) {
          msg #ruth.priv 4 $+ %data
        }
        halt
      }
      if ( Time Left: * iswm %data ) {

        if (%secho == $true) {
          msg #ruth.priv 3 $+ %data
        }
        halt
      }

      if ( $left(%data,6) == (TEAM)  ) {

        if (%secho == $true) {
          msg #ruth.priv 7 $+ %data
        }

        halt
      }

      if (%secho == $true) {       
        msg #ruth.priv %data
      }

    }

  }
}

alias -l SoldatRefreshEndTok return $+($1, $iif($1 != $null, $chr($3)), $2)
alias SoldatRefreshSize return 1188
alias SoldatRefresh {
  var %id = $1, %binvar = $2, %table = $3, %args = $4-, %players = $null, %kills = $null, %deaths = $null, %ips = $null, %pings = $null, %numbers = $null, %offsets = $null, %teams = $null, %i, %offset = 1, %tplayers = 0, %tspectators = 0, %teamnames = Alpha|Bravo|Charlie|Delta|Spectator
  if (%id == $null || %table == $null || $bvar(%binvar, 0) != $SoldatRefreshSize) { return $null  }

  hfree -w %table $+ _*
  hmake %table $+ _info 7

  ; Get player names
  %i = 1
  while (%i <= 32) {
    var %len = $bvar(%binvar, %offset)
    inc %offset 1
    %players = $SoldatRefreshEndTok(%players, $bvar(%binvar, %offset, %len).text, 10)
    %offsets = $SoldatRefreshEndTok(%offsets, $calc(%i - 1), 10)
    inc %offset 24
    inc %i 1
  }

  ; Get player teams
  %i = 1
  var %deleted = 0
  while (%i <= 32) {
    var %team = $bvar(%binvar, %offset)
    inc %offset 1
    if (%team >= 0 && %team <= 5) {
      if (%team != 5) { inc %tplayers 1 }
      else { inc %tspectators 1 }
      %teams = $instok(%teams, %team, $calc($numtok(%teams, 10) + 1), 10)
    }
    else {
      %players = $deltok(%players, $calc(%i - %deleted), 10)
      %offsets = $deltok(%offsets, $calc(%i - %deleted), 10)
      inc %deleted 1
    }
    inc %i 1
  }

  var %total = %tplayers + %tspectators

  ; Get kills
  %i = 1
  while (%i <= %total) {
    %kills = $SoldatRefreshEndTok(%kills, $bvar(%binvar, $calc(%offset + $gettok(%offsets, %i, 10) * 2)).word, 10)
    inc %i 1
  }
  inc %offset $calc(32 * 2)

  ; Get deaths
  %i = 1
  while (%i <= %total) {
    %deaths = $SoldatRefreshEndTok(%deaths, $bvar(%binvar, $calc(%offset + $gettok(%offsets, %i, 10) * 2)).word, 10)
    inc %i 1
  }
  inc %offset $calc(32 * 2)

  ; Get ping
  %i = 1
  while (%i <= %total) {
    %pings = $SoldatRefreshEndTok(%pings, $bvar(%binvar, $calc(%offset + $gettok(%offsets, %i, 10))), 10)
    inc %i 1
  }
  inc %offset $calc(32)

  ; Get number
  %i = 1
  while (%i <= %total) {
    %numbers = $SoldatRefreshEndTok(%numbers, $bvar(%binvar, $calc(%offset + $gettok(%offsets, %i, 10))), 10)
    inc %i 1
  }
  inc %offset $calc(32)

  ; Get IPs
  %i = 1
  while (%i <= %total) {
    %ips = $SoldatRefreshEndTok(%ips, $bvar(%binvar, $calc(%offset + $gettok(%offsets, %i, 10) * 4)).nlong, 10)
    inc %i 1
  }
  inc %offset $calc(32 * 4)

  %i = 1
  while (%i <= %tplayers) {
    hmake %table $+ _player $+ %i 7
    inc %i
  }
  %i = 1
  while (%i <= %tspectators) {
    hmake %table $+ _spectator $+ %i 7
    inc %i
  }
  hadd %table $+ _info players %tplayers
  hadd %table $+ _info spectators %tspectators

  %i = 1
  var %i_plr = 1, %i_spec = 1
  while (%i <= %total) {
    var %team = $gettok(%teams, 1, 10)
    if (%team < 5) {
      hadd %table $+ _player $+ %i_plr name $gettok(%players, 1, 10)
      hadd %table $+ _player $+ %i_plr team $gettok(%teamnames, %team, 124)
      hadd %table $+ _player $+ %i_plr kills $gettok(%kills, 1, 10)
      hadd %table $+ _player $+ %i_plr deaths $gettok(%deaths, 1, 10)
      hadd %table $+ _player $+ %i_plr ping $gettok(%pings, 1, 10)
      hadd %table $+ _player $+ %i_plr number $gettok(%numbers, 1, 10)
      hadd %table $+ _player $+ %i_plr ip $gettok(%ips, 1, 10)
      inc %i_plr
    }
    else {
      hadd %table $+ _spectator $+ %i_spec name $gettok(%players, 1, 10)
      hadd %table $+ _spectator $+ %i_spec ping $gettok(%pings, 1, 10)
      hadd %table $+ _spectator $+ %i_spec number $gettok(%numbers, 1, 10)
      hadd %table $+ _spectator $+ %i_spec ip $gettok(%ips, 1, 10)
      inc %i_spec
    }
    %players = $deltok(%players, 1, 10)
    %teams = $deltok(%teams, 1, 10)
    %kills = $deltok(%kills, 1, 10)
    %deaths = $deltok(%deaths, 1, 10)
    %pings = $deltok(%pings, 1, 10)
    %numbers = $deltok(%numbers, 1, 10)
    %ips = $deltok(%ips, 1, 10)
    inc %i 1
  }

  hmake %table $+ _teams 4

  ; Get team scores
  %i = 1
  while (%i <= 4) {
    var %team = $gettok(%teamnames, %i, 124)
    var %score = $bvar(%binvar, %offset).word
    inc %offset 2
    hadd %table $+ _teams %team %score
    inc %i 1
  }

  ; Get map name
  var %len = $bvar(%binvar, %offset)
  inc %offset 1
  var %map = $bvar(%binvar, %offset, %len).text
  inc %offset 16
  hadd %table $+ _info map %map

  ; Get time limit
  var %timelimit = $bvar(%binvar, %offset).long
  inc %offset 4
  hadd %table $+ _info timelimit $calc(%timelimit / 3600) $+ :00

  ; Get time left
  var %timeleft = $bvar(%binvar, %offset).long
  inc %offset 4
  var %temp = $calc($floor($calc(%timeleft / 60)) % 60)
  hadd %table $+ _info timeleft $floor($calc(%timeleft / 3600)) $+ : $+ $iif(%temp < 10, 0 $+ %temp, %temp)

  ; Get kill limit
  var %killlimit = $bvar(%binvar, %offset).word
  inc %offset 2
  hadd %table $+ _info killlimit %killlimit

  ; Get gamestyle
  var %gamestyle = $bvar(%binvar, %offset)
  hadd %table $+ _info gamestyle %gamestyle

  .signal %id %table %args
}