////////////////////////////////////////
// WCS - Warcraft:Source              //
// ---------------------------------- //
//  by kRypT0n!Te                     //
//      http://wc3source.de           //
// ---------------------------------- //
// Content of this subscript          //
// - all ultimates                    //
////////////////////////////////////////
// commands:
// wcs_mole_activate <userid>
// wcs_regeneration <userid> <amount> <time> <maxHP> <maxHeal> <radius>
// wcs_warden  <userid> <duration> <damage> <radius> <target team> <team target name> <x> <y> <z> <round>
//
////////////////////////////////////////
// You can define here new ultimates, then use the command
// es_xdoblock wcs/WCSultimates/wcs_YOURSCRIPT
// to execute wcs_YOURSCRIPT block.
//

block load
{
  es_xexists ex command wcs_mole_activate
  if (server_var(ex) = 0) then es_xregcmd wcs_mole_activate wcs/WCSultimates/wcs_mole_activate "A player becomes a mole"
  es_xexists ex command wcs_regeneration
  if (server_var(ex) = 0) then es_xregcmd wcs_regeneration wcs/WCSultimates/wcs_regeneration "wcs_regeneration <userid> <amount> <time> <maxHP> <maxHeal> <radius> - Regenerate player for the current round"
  es_xexists ex command wcs_warden
  if (server_var(ex) = 0) then es_xregcmd wcs_warden wcs/WCSultimates/wcs_warden "Warden, deals damage on nearby enemies"
  es_xset wcs_maxhp 0
  es_xset wcs_maxheal 0
  // new event
  es_xloadevents declare addons/eventscripts/wcs/WCSultimates/es_WCSultimates.res
}

// >>>>>>>>>>>>>>>>> SPECIAL ULTIMATE SKILL CODE >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
block wcs_ulti_teleport
{
wcs_debuglog wcs_ulti_teleport start
  // alot of calculations....does anyone know what I'm doing here ?
  es_xset wcs_ok 1
  es est_GetViewCoord server_var(wcs_userid) wcs_x1 wcs_y1 wcs_z1
  es_getplayerlocation wcs_x2 wcs_y2 wcs_z2 server_var(wcs_userid)
  //es_mathparse wcs_x "abs ( wcs_x1 - wcs_x2 )"
  //es_mathparse wcs_y "abs ( wcs_y1 - wcs_y2 )"
  //es_mathparse wcs_z "abs ( wcs_z1 - wcs_z2 )"
  es_xcopy wcs_x wcs_x1
  es_xcopy wcs_y wcs_y1
  es_xcopy wcs_z wcs_z1
  es_math wcs_x - server_var(wcs_x2)
  es_math wcs_y - server_var(wcs_y2)
  es_math wcs_z - server_var(wcs_z2)
  if (server_var(wcs_x) < 0) then es_xmath wcs_x * -1
  if (server_var(wcs_y) < 0) then es_xmath wcs_y * -1
  if (server_var(wcs_z) < 0) then es_xmath wcs_z * -1
  ifx parse("(wcs_range < wcs_x) or (wcs_range < wcs_y) or (wcs_range < wcs_z)") do
  {
    es_xset wcs_ok 0
  }
  // invisible while teleporting! (thx Lupus)
  es_keygetvalue wcs_tmp WCSuserdata server_var(wcs_userid) invisp
  if (server_var(wcs_tmp) != 0) do
  {
    es_xmath wcs_tmp float
    es_xmath wcs_tmp - 100
    es_xmath wcs_tmp * -2.55;
    es est_rounddecimal wcs_tmp server_var(wcs_tmp) 0;
    es est_setplayercolor server_var(wcs_userid) 255 255 255 0 1
    es_delayed 1 est_setplayercolor server_var(wcs_userid) 255 255 255 server_var(wcs_tmp) 1
  }
  ifx true(wcs_ok) do
  {
    ifx false(wcs_noskywalking) do
    {
      es_exists ex command "ma_teleport"
      if (server_var(ex) = 1) then ma_teleport server_var(wcs_userid) server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1)
      if (server_var(ex) != 1) then est_Teleport server_var(wcs_userid) server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1)
    }
    if (server_var(wcs_noskywalking) = "1") then est_PushTo server_var(wcs_userid) server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1) "2"
    wcs_getlanguage "wcs_lng" "wcs_lng_teleported"
    es_tell server_var(wcs_userid) #multi server_var(wcs_lng)
    es est_Fade server_var(wcs_userid) 0 server_var(wcs_fadetimer) 1 0 0 0 250
  }
  es_xelse do
  {
    // one or more vectors are too long to teleport .... damn math...
    if (server_var(wcs_range) < server_var(wcs_x)) do
    {
      
      if (server_var(wcs_x2) >= 0) do
      {
        if (server_var(wcs_x1) >= 0) do
        {
          if (server_var(wcs_x2) <= server_var(wcs_x1)) then es_xmath wcs_x2 + server_var(wcs_range)
          if (server_var(wcs_x2) > server_var(wcs_x1)) then es_xmath wcs_x2 - server_var(wcs_range)
        }
        es_xelse do
        {
          es_math wcs_x2 - server_var(wcs_range)
        }
      }
      es_xelse do
      {
        if (server_var(wcs_x1) < 0) do
        {
          if (server_var(wcs_x2) <= server_var(wcs_x1)) then es_xmath wcs_x2 + server_var(wcs_range)
          if (server_var(wcs_x2) > server_var(wcs_x1)) then es_xmath wcs_x2 - server_var(wcs_range)
        }
        es_xelse do
        {
          es_math wcs_x2 + server_var(wcs_range)
        }        
      }
      es_xcopy wcs_x1 wcs_x2
    }
    if (server_var(wcs_range) < server_var(wcs_y)) do
    {
      if (server_var(wcs_y2) >= 0) do
      {
        if (server_var(wcs_y1) >= 0) do
        {
          if (server_var(wcs_y2) <= server_var(wcs_y1)) then es_xmath wcs_y2 + server_var(wcs_range)
          if (server_var(wcs_y2) > server_var(wcs_y1)) then es_xmath wcs_y2 - server_var(wcs_range)
        }
        es_xelse do
        {
          es_math wcs_y2 - server_var(wcs_range)
        }
      }
      es_xelse do
      {
        if (server_var(wcs_y1) < 0) do
        {
          if (server_var(wcs_y2) <= server_var(wcs_y1)) then es_xmath wcs_y2 + server_var(wcs_range)
          if (server_var(wcs_y2) > server_var(wcs_y1)) then es_xmath wcs_y2 - server_var(wcs_range)
        }
        es_xelse do
        {
          es_math wcs_y2 + server_var(wcs_range)
        }        
      }
      es_xcopy wcs_y1 wcs_y2
    }
    if (server_var(wcs_range) < server_var(wcs_z)) do
    {
      if (server_var(wcs_z2) >= 0) do
      {
        if (server_var(wcs_z1) >= 0) do
        {
          if (server_var(wcs_z2) <= server_var(wcs_z1)) then es_xmath wcs_z2 + server_var(wcs_range)
          if (server_var(wcs_z2) > server_var(wcs_z1)) then es_xmath wcs_z2 - server_var(wcs_range)
        }
        es_xelse do
        {
          es_math wcs_z2 - server_var(wcs_range)
        }
      }
      es_xelse do
      {
        if (server_var(wcs_z1) < 0) do
        {
          if (server_var(wcs_z2) <= server_var(wcs_z1)) then es_xmath wcs_z2 + server_var(wcs_range)
          if (server_var(wcs_z2) > server_var(wcs_z1)) then es_xmath wcs_z2 - server_var(wcs_range)
        }
        es_xelse do
        {
          es_math wcs_z2 + server_var(wcs_range)
        }        
      }
      es_xcopy wcs_z1 wcs_z2
    }
    ifx false(wcs_noskywalking) do
    {
      es_exists ex command "ma_teleport"
      if (server_var(ex) = 1) then ma_teleport server_var(wcs_userid) server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1)
      if (server_var(ex) != 1) then est_Teleport server_var(wcs_userid) server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1)
    }
    if (server_var(wcs_noskywalking) = "1") then est_PushTo server_var(wcs_userid) server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1) "1"
    wcs_getlanguage "wcs_lng" "wcs_lng_toofaraway"
    es_tell server_var(wcs_userid) #multi server_var(wcs_lng)
    es est_Fade server_var(wcs_userid) 0 server_var(wcs_fadetimer) 0.2 0 0 0 220
  }
wcs_debuglog wcs_ulti_teleport end
}

block wcs_ulti_suicide
{
wcs_debuglog wcs_ulti_suicide start
  es_xset wcs_team_target 0
  es_getplayerteam wcs_team server_var(wcs_userid)
  // check teams (T=2, CT=3)
  if (server_var(wcs_team) = 2) do
  {
    es_xset wcs_team_target 3
    es_xset wcs_team_targetn "#c!d"
  }
  if (server_var(wcs_team) = 3) do
  {
    es_xset wcs_team_target 2
    es_xset wcs_team_targetn "#t!d"
  }
  if (server_var(wcs_team_target) != "0") do
  {
    es_xset wcs_pcount 0
    es_getlivingplayercount wcs_pcount server_var(wcs_team_target)
    if (server_var(wcs_pcount) > 0) do
    {
      alias wcs_run_ulti_suicide1 "es_xset wcs_immunity 0;es_keygetvalue wcs_immunity WCSuserdata server_var(wcs_targetid) ulti_immunity;if (server_var(wcs_immunity) = 0) then wcs_run_ulti_suicide2;if (server_var(wcs_immunity) != 0) then es_xtell server_var(wcs_userid) #multi server_var(wcs_lng_ulti_immunity_a);if (server_var(wcs_immunity) != 0) then es_xtell server_var(wcs_targetid) #multi server_var(wcs_lng_ulti_immunity_v)"
      alias wcs_run_ulti_suicide2 "es_xmath wcs_counter + 1;es wcs_explode server_var(wcs_userid) server_var(wcs_targetid) server_var(wcs_magnitude) server_var(wcs_radius)"
      es_xset wcs_counter 0
      es est_Near wcs_targetid server_var(wcs_team_targetn) server_var(wcs_radius) server_var(wcs_userid) "es_exists ex userid server_var(wcs_targetid);if (server_var(ex) = 1) then wcs_run_ulti_suicide1"
      // no more needed
      //if (server_var(wcs_counter) > 0) then wcs_explode server_var(wcs_userid) server_var(wcs_userid) server_var(wcs_magnitude) server_var(wcs_radius)
    }
  }
wcs_debuglog wcs_ulti_suicide end
}

block wcs_ulti_flash
{
wcs_debuglog wcs_ulti_flash start
  es_xset wcs_team_target 0
  es_getplayerteam wcs_team server_var(wcs_userid)
  // check teams (T=2, CT=3)
  if (server_var(wcs_team) = 2) do
  {
    es_xset wcs_team_target 3
    es_xset wcs_team_targetn "#c!d"
  }
  if (server_var(wcs_team) = 3) do
  {
    es_xset wcs_team_target 2
    es_xset wcs_team_targetn "#t!d"
  }
  if (server_var(wcs_team_target) != "0") do
  {
    es_xset wcs_pcount 0
    es_getlivingplayercount wcs_pcount server_var(wcs_team_target)
    if (server_var(wcs_pcount) > 0) do
    {
      alias wcs_run_ulti_flash1 "es_xset wcs_immunity 0;es_keygetvalue wcs_immunity WCSuserdata server_var(wcs_targetid) ulti_immunity;if (server_var(wcs_immunity) = 0) then wcs_run_ulti_flash2;if (server_var(wcs_immunity) != 0) then es_xtell server_var(wcs_userid) #multi server_var(wcs_lng_ulti_immunity_a);if (server_var(wcs_immunity) != 0) then es_xtell server_var(wcs_targetid) #multi server_var(wcs_lng_ulti_immunity_v)"
      alias wcs_run_ulti_flash2 "es_xmath wcs_counter + 1;es est_fade server_var(wcs_targetid) 0 1.5 0 255 255 255 255"
      es_xset wcs_counter 0
      es est_Near wcs_targetid server_var(wcs_team_targetn) server_var(wcs_radius) server_var(wcs_userid) "es_exists ex userid server_var(wcs_targetid);if (server_var(ex) = 1) then wcs_run_ulti_flash1"
    }
  }
wcs_debuglog wcs_ulti_flash end
}

block wcs_ulti_chain
{
wcs_debuglog wcs_ulti_chain start
  es_xset wcs_team_target 0
  es_getplayerteam wcs_team server_var(wcs_userid)
  // check teams (T=2, CT=3)
  if (server_var(wcs_team) = 2) do
  {
    es_xset wcs_team_target 3
    es_xset wcs_team_targetn "#c!d"
  }
  if (server_var(wcs_team) = 3) do
  {
    es_xset wcs_team_target 2
    es_xset wcs_team_targetn "#t!d"
  }
  if (server_var(wcs_team_target) != "0") do
  {
    es_xset wcs_pcount 0
    es_getlivingplayercount wcs_pcount server_var(wcs_team_target)
    if (server_var(wcs_pcount) > 0) do
    {
      es est_Fade server_var(wcs_userid) 0 2 1 240 240 240 100
      es_xset wcs_wall "1"
      alias wcs_run_ulti_chain1 "es_getplayerlocation wcs_x1 wcs_y1 wcs_z1 server_var(wcs_userid);es_getplayerlocation wcs_x2 wcs_y2 wcs_z2 server_var(wcs_targetid);es_xmath wcs_z1 + 50;es_xmath wcs_z2 + 50;es est_getwallbetween wcs_wall server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1) server_var(wcs_x2) server_var(wcs_y2) server_var(wcs_z2);if (server_var(wcs_wall) = 0) then wcs_run_ulti_chain2"
      alias wcs_run_ulti_chain2 "es_xset wcs_immunity 0;es_keygetvalue wcs_immunity WCSuserdata server_var(wcs_targetid) ulti_immunity;if (server_var(wcs_immunity) = 0) then wcs_run_ulti_chain3;if (server_var(wcs_immunity) != 0) then es_xtell server_var(wcs_userid) #multi server_var(wcs_lng_ulti_immunity_a);if (server_var(wcs_immunity) != 0) then es_xtell server_var(wcs_targetid) #multi server_var(wcs_lng_ulti_immunity_v)"
      alias wcs_run_ulti_chain3 "es_xmath wcs_counter + 1;if (server_var(wcs_graphicfx) = 1) then est_effect 3 #a 0 sprites/lgtning.vmt server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1) server_var(wcs_x2) server_var(wcs_y2) server_var(wcs_z2) 1 10 10 200 255 255 255;es wcs_dealdamage server_var(wcs_userid) server_var(wcs_targetid) 32"
      es_xset wcs_counter 0
      es est_Near wcs_targetid server_var(wcs_team_targetn) server_var(wcs_radius) server_var(wcs_userid) "es_exists ex userid server_var(wcs_targetid);if (server_var(ex) = 1) then es_xif (server_var(wcs_counter) < server_var(wcs_maxtargets)) then wcs_run_ulti_chain1"
      if (server_var(wcs_counter) > 0) do
      {
        wcs_getlanguage "wcs_lng" "wcs_lng_chainlightning"
        wcs_getlanguage "wcs_lng2" "wcs_lng_playersdamaged"
        esnq est_csay server_var(wcs_userid) server_var(wcs_lng) : server_var(wcs_counter) server_var(wcs_lng2)
      }
      es_xelse do
      {
        es_xset wcs_ultinotexec 1
      }
    }
    es_xelse do
    {
      es_xset wcs_ultinotexec 1
    }
  }
  wcs_getlanguage "wcs_lng" "wcs_lng_chainfailed"
  if (server_var(wcs_ultinotexec) = 1) then es_xtell server_var(wcs_userid) #multi server_var(wcs_lng)
wcs_debuglog wcs_ulti_chain end
}

block wcs_ulti_roots
{
wcs_debuglog wcs_ulti_roots start
  es_xset wcs_team_target 0
  es_getplayerteam wcs_team server_var(wcs_userid)
  // check teams (T=2, CT=3)
  if (server_var(wcs_team) = 2) do
  {
    es_xset wcs_team_target 3
    es_xset wcs_team_targetn "#c!d"
  }
  if (server_var(wcs_team) = 3) do
  {
    es_xset wcs_team_target 2
    es_xset wcs_team_targetn "#t!d"
  }
  if (server_var(wcs_team_target) != "0") do
  {
    es_xset wcs_pcount 0
    es_getlivingplayercount wcs_pcount server_var(wcs_team_target)
    if (server_var(wcs_pcount) > 0) do
    {
      es est_Fade server_var(wcs_userid) 0 1 1 10 55 5 200
      es_xset wcs_wall "1"
      alias wcs_run_ulti_roots1 "es_getplayerlocation wcs_x1 wcs_y1 wcs_z1 server_var(wcs_userid);es_getplayerlocation wcs_x2 wcs_y2 wcs_z2 server_var(wcs_targetid);es_xmath wcs_z1 + 50;es_xmath wcs_z2 + 50;es est_getwallbetween wcs_wall server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1) server_var(wcs_x2) server_var(wcs_y2) server_var(wcs_z2);if (server_var(wcs_wall) = 0) then wcs_run_ulti_roots2"
      alias wcs_run_ulti_roots2 "es_xset wcs_immunity 0;es_keygetvalue wcs_immunity WCSuserdata server_var(wcs_targetid) ulti_immunity;if (server_var(wcs_immunity) = 0) then wcs_run_ulti_roots3;if (server_var(wcs_immunity) != 0) then es_xtell server_var(wcs_userid) #multi server_var(wcs_lng_ulti_immunity_a);if (server_var(wcs_immunity) != 0) then es_xtell server_var(wcs_targetid) #multi server_var(wcs_lng_ulti_immunity_v)"
      alias wcs_run_ulti_roots3 "es_xmath wcs_counter + 1;es est_Freeze server_var(wcs_targetid) 1;es_delayed server_var(wcs_freezetime) wcs_removefx freeze server_var(wcs_targetid);if (server_var(wcs_graphicfx) = 1) then est_effect 3 #a 0 sprites/lgtning.vmt server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1) server_var(wcs_x2) server_var(wcs_y2) server_var(wcs_z2) 1 10 10 0 255 0 255"
      es_xset wcs_counter 0
      es est_Near wcs_targetid server_var(wcs_team_targetn) server_var(wcs_radius) server_var(wcs_userid) "es_exists ex userid server_var(wcs_targetid);if (server_var(ex) = 1) then wcs_run_ulti_roots1"
      if (server_var(wcs_counter) > 0) do
      {
        wcs_getlanguage "wcs_lng" "wcs_lng_entangleroots"
        esnq est_csay server_var(wcs_userid) server_var(wcs_lng) : server_var(wcs_counter)
      }
      es_xelse do
      {
        es_xset wcs_ultinotexec 1
      }
    }
    es_xelse do
    {
      es_xset wcs_ultinotexec 1
    }
  }
  wcs_getlanguage "wcs_lng" "wcs_lng_entanglefailed"
  if (server_var(wcs_ultinotexec) = 1) then es_xtell server_var(wcs_userid) #multi server_var(wcs_lng)
wcs_debuglog wcs_ulti_roots end
}

block wcs_regeneration
{
if (server_var(wcs_debug) = 1) then profile begin regeneration
  es_xgetargv wcs_uid 1
  es_xgetargv wcs_amount 2
  es_xgetargv wcs_time 3
  es_xgetargv wcs_maxhp 4
  es_xgetargv wcs_maxheal 5
  es_xgetargv wcs_radius 6
  es_exists ex key WCSuserdata server_var(wcs_uid)
  ifx parse("(ex == 1) and (wcs_time >= 1)") do
  {
    es_xset wcs_regenerate 0
    es_keygetvalue wcs_regenerate WCSuserdata server_var(wcs_uid) regeneration
    es_keygetvalue wcs_round WCSuserdata server_var(wcs_uid) regen_round
    ifx parse("(wcs_regenerate == 1) and (wcs_roundcounter == wcs_round)") do
    {
      es_getplayerprop wcs_dead server_var(wcs_uid) "CCSPlayer.baseclass.pl.deadflag"
      ifx parse("((wcs_maxheal > 0) or (wcs_maxheal == -1)) and (wcs_dead == 0)") do
      {
        es_getplayerlocation wcs_x1 wcs_y1 wcs_z1 server_var(wcs_uid)
        if (server_var(wcs_maxheal) != -1) then es_xif (server_var(wcs_maxheal) != 0) then es_xmath wcs_maxheal - 1
        // check for team healing or single person
        ifx true(wcs_radius) do
        {
          es_getplayerteam wcs_team server_var(wcs_uid)
          // check teams (T=2, CT=3)
          if (server_var(wcs_team) = 2) then es_xset wcs_team "#t!d"
          if (server_var(wcs_team) = 3) then es_xset wcs_team "#c!d"
          es_xmath wcs_z1 + 50
          wcs_getlanguage "wcs_lng" "wcs_lng_healed"
          alias wcs_run_heal "es est_sethealth server_var(wcs_targetid) server_var(wcs_health);es_tell server_var(wcs_targetid) #multi server_var(wcs_lng);es est_fade server_var(wcs_targetid) 0 0.4 0 0 200 25 50;es_getplayerlocation wcs_x2 wcs_y2 wcs_z2 server_var(wcs_targetid);es_xmath wcs_z2 + 50;es est_effect 3 #a 0 sprites/lgtning.vmt server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1) server_var(wcs_x2) server_var(wcs_y2) server_var(wcs_z2) 1 2 2 0 255 0 255"
          es est_Near wcs_targetid server_var(wcs_team) server_var(wcs_radius) server_var(wcs_uid) "es est_gethealth wcs_health server_var(wcs_targetid);es_math wcs_health + server_var(wcs_amount);if (server_var(wcs_maxhp) > 0) then es_xif (server_var(wcs_maxhp) >= server_var(wcs_health)) then wcs_run_heal;if (server_var(wcs_maxhp) = 0) then wcs_run_heal"
          es_delayed server_var(wcs_time) wcs_regeneration server_var(wcs_uid) server_var(wcs_amount) server_var(wcs_time) server_var(wcs_maxhp) server_var(wcs_maxheal) server_var(wcs_radius)
        }
        es_xelse do
        {
          es est_GetHealth wcs_health server_var(wcs_uid)
          es_math wcs_health + server_var(wcs_amount)
          if (server_var(wcs_maxhp) > 0) then es_xif (server_var(wcs_maxhp) >= server_var(wcs_health)) then est_SetHealth server_var(wcs_uid) server_var(wcs_health)
          if (server_var(wcs_maxhp) = 0) then est_SetHealth server_var(wcs_uid) server_var(wcs_health)
          es_getplayerlocation wcs_x2 wcs_y2 wcs_z2 server_var(wcs_uid)
          es_xmath wcs_z2 + 200
          es est_effect 3 #a 0 sprites/lgtning.vmt server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1) server_var(wcs_x2) server_var(wcs_y2) server_var(wcs_z2) 1 2 2 0 255 0 255
          wcs_getlanguage "wcs_lng" "wcs_lng_healed"
          es_tell server_var(wcs_uid) #multi server_var(wcs_lng)
          es_delayed server_var(wcs_time) wcs_regeneration server_var(wcs_uid) server_var(wcs_amount) server_var(wcs_time) server_var(wcs_maxhp) server_var(wcs_maxheal) "0"
        }
      }
    }
    es_xelse do
    {
      es_keysetvalue WCSuserdata server_var(wcs_uid) regen_round 0
    }
  }
if (server_var(wcs_debug) = 1) then profile end regeneration
}

block wcs_warden
{
wcs_debuglog wcs_warden start
  es_xset wcs_uid 0
  es_xset wcs_duration 0
  es_xset wcs_dmg 0
  es_xset wcs_radius 0
  es_xset wcs_team_target 0
  es_xset wcs_wardenround 0
  es_xgetargv wcs_uid 1
  es_xgetargv wcs_duration 2
  es_xgetargv wcs_dmg 3
  es_xgetargv wcs_radius 4
  es_xgetargv wcs_team_target 5
  es_xgetargv wcs_team_targetn 6
  es_xgetargv wcs_x1 7
  es_xgetargv wcs_y1 8
  es_xgetargv wcs_z1 9
  es_xgetargv wcs_wardenround 10
  es_exists ex userid server_var(wcs_uid)
  es_getlivingplayercount wcs_alive server_var(wcs_team_target)
  ifx parse("(wcs_alive >= 1) and (wcs_wardenround == wcs_wardencounter) and ex and (wcs_duration > 0) and (wcs_radius != 0) and (wcs_team_target != 0)") do
  {
    es wcs_debuglog warden deals damage round server_var(wcs_wardenround) duration server_var(wcs_duration)
  	es_xset wcs_sward_invul 0
		es_xset wcs_sward_resist 0
   	es est_Effect 10 #a 0 sprites/lgtning.vmt server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1) 20 server_var(wcs_radius) 1 20 100 1 255 150 70 100 10
    //es est_Near wcs_targetid server_var(wcs_team_targetn) server_var(wcs_radius) server_var(wcs_uid) "es wcs_dealdamage server_var(wcs_uid) server_var(wcs_targetid) server_var(wcs_dmg);es_tell server_var(wcs_targetid) #multi server_var(wcs_lng_wardenhit);es_getplayerlocation wcs_x2 wcs_y2 wcs_z2 server_var(wcs_targetid);es est_effect 3 #a 0 sprites/lgtning.vmt server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1) server_var(wcs_x2) server_var(wcs_y2) server_var(wcs_z2) 1 10 20 255 150 70 255"
    es_xset wcs_wall 1
    wcs_getlanguage "wcs_lng" "wcs_lng_wardenhit"
    alias wcs_run_warden "es_getplayerlocation wcs_x2 wcs_y2 wcs_z2 server_var(wcs_targetid);es est_getwallbetween wcs_wall server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1) server_var(wcs_x2) server_var(wcs_y2) server_var(wcs_z2);es_keygetvalue wcs_sward_invul WCSuserdata server_var(wcs_targetid) swardinvul;es_keygetvalue wcs_sward_resist WCSuserdata server_var(wcs_targetid) swardresist;if (server_var(wcs_sward_invul) = 1) then shopalias_asw1_off;if (server_var(wcs_wall) = 0) then es_xif (server_var(wcs_sward_invul) = 0) then wcs_run_warden2"
	  alias wcs_run_warden2 "es_xcopy wcs_damage wcs_dmg;if (server_var(wcs_sward_resist) != 0) then es_xmath wcs_damage / 2;es est_speed server_var(wcs_targetid) 0.7;if (server_var(wcs_speed) != 0) then es_xdelayed 2 wcs_removefx speed server_var(wcs_targetid);es wcs_dealdamage server_var(wcs_uid) server_var(wcs_targetid) server_var(wcs_damage);es_tell server_var(wcs_targetid) #multi server_var(wcs_lng);es est_effect 3 #a 0 sprites/lgtning.vmt server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1) server_var(wcs_x2) server_var(wcs_y2) server_var(wcs_z2) 1 10 20 255 150 70 255"
    es nearcoord wcs_targetid server_var(wcs_team_targetn) server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1) server_var(wcs_radius) server_var(wcs_radius) server_var(wcs_radius) "es_getplayerprop wcs_dead server_var(wcs_targetid) CCSPlayer.baseclass.pl.deadflag;if (server_var(wcs_dead) = 0) then wcs_run_warden"
    es_xmath wcs_duration - 1
    es_delayed 1 wcs_warden server_var(wcs_uid) server_var(wcs_duration) server_var(wcs_dmg) server_var(wcs_radius) server_var(wcs_team_target) server_var(wcs_team_targetn) server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1) server_var(wcs_wardenround)
  }
wcs_debuglog wcs_warden end
}

block wcs_mole_activate
{
wcs_debuglog wcs_mole_activate start
  es_xset wcs_uid 0
  es_xgetargv wcs_uid 1
  es_exists ex userid server_var(wcs_uid)
  if (server_var(ex) = 1) do
  {
    es_xset wcs_team_target 0
    es_getplayerteam wcs_team server_var(wcs_uid)
    // check teams (T=2, CT=3)
    if (server_var(wcs_team) = 2) do
    {
      es_xset wcs_team_target 3
      es_xset wcs_team_targetn "#c!d"
    }
    if (server_var(wcs_team) = 3) do
    {
      es_xset wcs_team_target 2
      es_xset wcs_team_targetn "#t!d"
    }
    if (server_var(wcs_team_target) != "0") do
    {
      es_xset wcs_pcount 0
      es_getlivingplayercount wcs_pcount server_var(wcs_team_target)
      if (server_var(wcs_pcount) > 0) do
      {
        es_xset wcs_player 0
        if(server_var(wcs_game) = server_var(wcs_game_css)) then es_xif (server_var(wcs_team) = 3) then est_SetModel server_var(wcs_uid) "player/t_phoenix"
        if(server_var(wcs_game) = server_var(wcs_game_css)) then es_xif (server_var(wcs_team) = 2) then est_SetModel server_var(wcs_uid) "player/ct_urban"
        if(server_var(wcs_game) = server_var(wcs_game_dods)) then es_xif (server_var(wcs_team) = 2) then est_SetModel server_var(wcs_uid) "player/german_assault"
        if(server_var(wcs_game) = server_var(wcs_game_dods)) then es_xif (server_var(wcs_team) = 3) then est_SetModel server_var(wcs_uid) "player/american_assault"
        es est_RandPlayer wcs_player server_var(wcs_team_targetn)
        es_exists ex userid server_var(wcs_player)
        if (server_var(ex) = 1) do
        {
          //es_getplayerlocation wcs_x wcs_y wcs_z server_var(wcs_player)
          //es_xmath wcs_x + 40
          //es_xmath wcs_y + 40
          // new pos
          if (server_var(wcs_team) = 2) do
          {
            if (server_var(wcs_location_c) != "0") do
            {
            es_token wcs_x server_var(wcs_location_c) 1 |
            es_token wcs_y server_var(wcs_location_c) 2 |
            es_token wcs_z server_var(wcs_location_c) 3 |
            }
            es_xelse do
            {
              es_getplayerlocation wcs_x wcs_y wcs_z server_var(wcs_player)
            }
          }
          if (server_var(wcs_team) = 3) do
          {
            if (server_var(wcs_location_t) != "0") do
            {
            es_token wcs_x server_var(wcs_location_t) 1 |
            es_token wcs_y server_var(wcs_location_t) 2 |
            es_token wcs_z server_var(wcs_location_t) 3 |
            }
            es_xelse do
            {
              es_getplayerlocation wcs_x wcs_y wcs_z server_var(wcs_player)
            }
          }
          // new, delayed teleport
          es_set wcs_tmp server_var(mp_freezetime)
          es_xmath wcs_tmp + 3
          wcs_getlanguage "wcs_lng" "wcs_lng_moledelay"
          es_tell server_var(wcs_uid) #multi server_var(wcs_lng)
          es_delayed server_var(mp_freezetime) es_xtell server_var(wcs_uid) #multi server_var(wcs_lng)
          es_delayed server_var(wcs_tmp) est_Teleport server_var(wcs_uid) server_var(wcs_x) server_var(wcs_y) server_var(wcs_z)
          es_keysetvalue "WCSuserdata" server_var(wcs_uid) "ismole" "1"
        }
        wcs_getlanguage "wcs_lng" "wcs_lng_mole"
        es_delayed server_var(mp_freezetime) es_xtell server_var(wcs_uid) #multi server_var(wcs_lng)
      }
      es_xelse do
      {
        wcs_getlanguage "wcs_lng" "wcs_lng_molefailed"
        es_tell server_var(wcs_uid) #multi server_var(wcs_lng)
      }
    }
    es_xelse do
    {
      wcs_getlanguage "wcs_lng" "wcs_lng_molefailed"
      es_tell server_var(wcs_uid) #multi server_var(wcs_lng)
    }
  }
wcs_debuglog wcs_mole_activate end
}

block wcs_ability_warden
{
  es_xset wcs_params 0
  es_keygetvalue wcs_params WCSuserdata server_var(wcs_userid) "ability_parameter"
  if (server_var(wcs_params) != "0") do
  {
  es_getplayerteam wcs_team server_var(wcs_userid)
  // colored wards, thanks to Sol | Pikachu
  es_xset wcs_color "10 0 255 70"
  ifx parse("wcs_team == 2") do
  {
    es_xset wcs_team_target 3
    es_xset wcs_team_targetn "#ct"
    es_xset wcs_color "255 0 10 150"
  }
  ifx parse("wcs_team == 3") do
  {
    es_xset wcs_team_target 2
    es_xset wcs_team_targetn "#t"
    es_xset wcs_color "10 0 255 150"
  }
              es_getplayerlocation wcs_x1 wcs_y1 wcs_z1 server_var(wcs_userid)
              es_xset wcs_duration 0
              es_token wcs_duration server_var(wcs_params) 1 "_"
              ifx true(wcs_graphicfx) do
              {
                es_xcopy wcs_x2 wcs_x1
                es_xcopy wcs_y2 wcs_y1
                es_xcopy wcs_z2 wcs_z1
                es_xmath wcs_z1 + 120
                esnq est_Effect 11 #a 0 "sprites/purpleglow1.vmt" server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1) server_var(wcs_duration) 2 50
                esnq est_Effect 3 #a 0 "sprites/lgtning.vmt" server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1) server_var(wcs_x2) server_var(wcs_y2) server_var(wcs_z2) server_var(wcs_duration) 20 20 server_var(wcs_color)
                es_xmath wcs_z1 - 120
              }
              es_token wcs_dmg server_var(wcs_params) 2 "_"
              es_token wcs_radius server_var(wcs_params) 3 "_"
              es wcs_warden server_var(wcs_userid) server_var(wcs_duration) server_var(wcs_dmg) server_var(wcs_radius) server_var(wcs_team_target) server_var(wcs_team_targetn) server_var(wcs_x1) server_var(wcs_y1) server_var(wcs_z1) server_var(wcs_wardencounter)
              wcs_getlanguage "wcs_lng" "wcs_lng_wardencreated"
              es_tell server_var(wcs_userid) #multi server_var(wcs_lng)
            }
}
// <<<<<<<<<<<<<<<<< END ULTIMATE SKILL CODE <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
