////////////////////////////////////////
// WCS - Warcraft:Source              //
// ---------------------------------- //
//  by kRypT0n!Te                     //
//      http://wc3source.de           //
// ---------------------------------- //
// Content of this subscript          //
// - many functions...                //
////////////////////////////////////////
// say commands:
// - wcshelp (or warcraft)
// - savexp
// - feedback text...
// - wcsmenu (or wcs)
// - levi (DOD:S only)
//
// admin/internal commands:
// - wcs_givecredits <userid> <amount> <reason> <forced>
// - wcs_menuzero <userid>
// - wcs_flash <userid> <targetid>
// - wcs_showcredits <userid>
// - wcs_removefx <userid> <effectype>
// - wcs_setfx <userid> <effectype> [<time>]
// - wcs_giveitem <userid> <item>
// - wcs_explode <userid> <targetid> <magnitude> <radius>
// - wcs_dealdamage <userid> <targetid> <magnitude> <radius>
// - wcs_saveplayer <userid> <full>
// - wcs_getplayer <userid> <full>
// - wcs_checkevents <userid> <type>
// - wcs_showinfohandle <type>
// - wcs_notice <userid> <text>
// - wcs_debuglog <text>
//
////////////////////////////////////////

block load
{
  es_xload wcs/WCSfunctions/WCSxp
  es_xload wcs/WCSfunctions/WCSskills
  es_xload wcs/WCSfunctions/WCSrestrict
  es_xkeygroupcreate WCSfeedback
  es_xkeygroupload WCSfeedback |wcs
  es_xexists ex command wcs_checkevents
  if (server_var(ex) = 0) then es_xregcmd wcs_checkevents wcs/WCSfunctions/wcs_checkevents "wcs_checkevents - usage: wcs_checkevents <userid> <type>"
  es_xexists ex command wcs_givecredits
  if (server_var(ex) = 0) then es_xregcmd wcs_givecredits wcs/WCSfunctions/wcs_givecredits "wcs_givecredits - usage: wcs_givecredits <userid> <amount> <reason> <forced>"
  es_xexists ex saycommand wcshelp
  if (server_var(ex) = 0) then es_xregsaycmd wcshelp wcs/WCSfunctions/wcs_help "Shows help message"
  es_xexists ex saycommand warcrafthelp
  if (server_var(ex) = 0) then es_xregsaycmd warcraft wcs/WCSfunctions/wcs_help "Shows help message"
  es_xexists ex command wcs_menuzero
  if (server_var(ex) = 0) then es_xregcmd wcs_menuzero wcs/WCSfunctions/wcs_menuzero "Resets the menu"
  es_xexists ex saycommand savexp
  if (server_var(ex) = 0) then es_xregsaycmd savexp wcs/WCSfunctions/wcs_savexp "savexp"
  es_xexists ex saycommand feedback
  if (server_var(ex) = 0) then es_xregsaycmd feedback wcs/WCSfunctions/wcs_feedback "Enables users to send feedback"
  es_xexists ex command wcs_flash
  if (server_var(ex) = 0) then es_xregcmd wcs_flash wcs/WCSfunctions/wcs_flash "wcs_flash <userid> <targetid>"
  es_xexists ex command wcs_showcredits
  if (server_var(ex) = 0) then es_xregcmd wcs_showcredits wcs/WCSfunctions/wcs_showcredits "wcs_showcredits - usage: wcs_showcredits <userid> (DOD:S only)"
  es_xexists ex command wcs_showinfohandle
  if (server_var(ex) = 0) then es_xregcmd wcs_showinfohandle wcs/WCSfunctions/wcs_showinfohandle "a handler..."
  es_xexists ex saycommand wcsmenu
  if (server_var(ex) = 0) then es_xregsaycmd wcsmenu wcs/WCSfunctions/wcs_wcsmenu "Shows a menu where you can reach all other menus"
  es_xexists ex saycommand wcs
  if (server_var(ex) = 0) then es_xregsaycmd wcs wcs/WCSfunctions/wcs_wcsmenu "Shows a menu where you can reach all other menus"
  es_xexists ex command wcs_removefx
  if (server_var(ex) = 0) then es_xregcmd wcs_removefx wcs/WCSfunctions/wcs_removefx "wcs_removefx <userid> <type> - Takes an effect from a player (type: freeze, speed, god)"
  es_xexists ex command wcs_setfx
  if (server_var(ex) = 0) then es_xregcmd wcs_setfx wcs/WCSfunctions/wcs_setfx "wcs_setfx <userid> <type> [<time>]- Gives an effect for a player (type: freeze, speed, god)"
  es_xexists ex command wcs_giveitem
  if (server_var(ex) = 0) then es_xregcmd wcs_giveitem wcs/WCSfunctions/wcs_giveitem "wcs_giveitem <id> <item name> - Gives a custom item, checks for death and stacks grenades"
  es_xexists ex command wcs_explode
  if (server_var(ex) = 0) then es_xregcmd wcs_explode wcs/WCSfunctions/wcs_explode "wcs_explode - usage: wcs_explode <userid> <targetid> <magnitude> <radius>"
  es_xexists ex command wcs_dealdamage
  if (server_var(ex) = 0) then es_xregcmd wcs_dealdamage wcs/WCSfunctions/wcs_dealdamage "wcs_dealdamage - usage: wcs_dealdamage <userid> <targetid> <damage>"
  es_xexists ex command wcs_saveplayer
  if (server_var(ex) = 0) then es_xregcmd wcs_saveplayer wcs/WCSfunctions/wcs_saveplayer "save a single player to the DB"
  es_xexists ex command wcs_getplayer
  if (server_var(ex) = 0) then es_xregcmd wcs_getplayer wcs/WCSfunctions/wcs_getplayer "get the player record from the DB"
  es_xexists ex command wcs_notice
  if (server_var(ex) = 0) then es_xregcmd wcs_notice wcs/WCSfunctions/wcs_notice "shows a small notice at the bottom"
  es_xexists ex command wcs_playercheck
  if (server_var(ex) = 0) then es_xregcmd wcs_playercheck wcs/WCSfunctions/wcs_playercheck "checks if the player is correctly setup"
  // one special command for DOD:S bugfix (theres no player_jump event)
  if (server_var(wcs_game) != server_var(wcs_game_css)) do
  {
    es_xexists ex saycommand levi
    if (server_var(ex) = 0) then es_xregsaycmd levi wcs/WCSfunctions/wcs_levi_reactivate "Re-activate your levitation (used after climbing ladders)"
  }
  es_xexists ex command wcs_debuglog
  if (server_var(ex) = 0) then es_xregcmd wcs_debuglog wcs/WCSfunctions/wcs_debuglog "logs a debug message to the log or console output"
  // new SQLite
  es_xsql open wcsdata |wcs/WCSusers
  es_xsql query wcsdata "CREATE TABLE IF NOT EXISTS `WCSusers` (`id` TEXT NOT NULL, `race` TEXT NOT NULL, `level` NUMERIC DEFAULT 0, `xp` NUMERIC DEFAULT 0, `skills` TEXT NOT NULL, PRIMARY KEY (`id`, `race`))"
  es_xsql query wcsdata "CREATE TABLE IF NOT EXISTS `WCStop10` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `race` TEXT NOT NULL, `totallevel` NUMERIC DEFAULT 0, `curlevel` DEFAULT 0, PRIMARY KEY (`id`))"
  es_xset wcs_itemdescrslot 0
  es_xset wcs_itemslot 0
  es_xset wcs_fxtype 0 "type of the effect, for wcs_setfx"
}

block unload
{
  es_xunload wcs/WCSfunctions/WCSxp
  es_xunload wcs/WCSfunctions/WCSskills
  es_xkeygroupsave WCSfeedback |wcs
  es_xkeygroupdelete WCSfeedback
  es_xsql close wcsdata
}

block wcs_playercheck
{
// fixes invalid race setting or gives a random race
if (server_var(wcs_debug) = 1) then profile begin playercheck
	es_xgetargv wcs_uid 1
  es_exists ex userid server_var(wcs_uid)
  ifx true(ex) do
  {
    es_exists ex key WCSuserdata server_var(wcs_uid)
    ifx true(ex) do
    {
      es_keygetvalue wcs_race WCSuserdata server_var(wcs_uid) race
      if (server_var(wcs_race) = "0") do
      {
        // random start race, but not a restricted one (NEW PLAYER !)
        es_rand wcs_race 1 server_var(wcs_numberofraces)
        es_keygetvalue wcs_tmp "WCSraces" server_var(wcs_race) "required_level"
        if (server_var(wcs_tmp) != "0") then es_xset wcs_race "1"
        es_keygetvalue wcs_tmp "WCSraces" server_var(wcs_race) "allow_only"
        if (server_var(wcs_tmp) != "0") then es_xset wcs_race "1"
        es_keysetvalue "WCSuserdata" server_var(wcs_uid) "race" server_var(wcs_race)
        es wcs_menuzero server_var(wcs_uid)
        es_getplayersteamid wcs_id server_var(wcs_uid)
        if ("BOT" notin server_var(wcs_id)) then es_xdelayed 11 wcs_race_menu server_var(wcs_uid)
        if (server_var(wcs_showtotalplayers) = "1") then es_xmath wcs_totalplayers + 1
      es_keygetvalue wcs_numberofskills WCSraces server_var(wcs_race) numberofskills
      es_xset wcs_counter 1
      while "server_var(wcs_counter) <= server_var(wcs_numberofskills)" "es_xformatv wcs_skillnumber skill_%1 wcs_counter;es_keysetvalue WCSuserdata server_var(wcs_uid) server_var(wcs_skillnumber) 0;es_xmath wcs_counter + 1"
    }
  }
  }
if (server_var(wcs_debug) = 1) then profile end playercheck
}

// >>>>>>>>>>>>>>>>> BEGIN CUSTOM COMMANDS >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
block wcs_givecredits
{
if (server_var(wcs_debug) = 1) then profile begin givecredits
  // usage:  wcs_givecredits <userid> <amount> <reason> <forced>
  // userid: give a VALID userid
  // amount: how many credits to add
  // reason: text (optional)
  // forced: 0/1 (optional)

  es_xset wcs_giveuserid 0
  es_xset wcs_amount 0
  es_xset wcs_reason 0
  es_xset wcs_forced 0

  es_xgetargv wcs_giveuserid 1
  es_xgetargv wcs_amount 2
  es_xgetargv wcs_reason 3
  es_xgetargv wcs_forced 4

  es_exists ex userid server_var(wcs_giveuserid)
  if (server_var(wcs_cfg_dods_noshopmenu) != 0) do
  {
    es_xmath wcs_amount / 10
    es est_rounddecimal wcs_amount server_var(wcs_amount) 0
    es wcs_givexp server_var(wcs_giveuserid) server_var(wcs_amount) server_var(wcs_reason) server_var(wcs_forced)
    es_xset ex 0
  }
  if (server_var(ex) = 1) do
  {
    es_xset wcs_credits 0
    es_exists ex key WCSuserdata server_var(wcs_giveuserid)
    if (server_var(ex) = 1) do
    {
      // check playercount if not forced
      if (server_var(wcs_forced) = 0) do
      {
        es_xset wcs_playercount 0
        es_getplayercount wcs_playercount
      }
      es_xelse do
      {
        es_set wcs_playercount server_var(wcs_minplayers)
      }

      if (server_var(wcs_playercount) >= server_var(wcs_minplayers)) do
      {
        es_keygetvalue wcs_credits WCSuserdata server_var(wcs_giveuserid) credits
        // add the credits
        es_math wcs_credits + server_var(wcs_amount)
        // 16000 credits is the limit !
        if (server_var(wcs_credits) > 16000) then es_xset wcs_credits 16000
        es_keysetvalue WCSuserdata server_var(wcs_giveuserid) credits server_var(wcs_credits)
        if (server_var(wcs_reason) != "0") do
        {
          wcs_getlanguage "wcs_lng" "wcs_lng_gained"
          wcs_getlanguage "wcs_lng2" "wcs_lng_credits"
          es_format wcs_text "#lightgreen%1 #green%2 #lightgreen%3 : %4" server_var(wcs_lng) server_var(wcs_amount) server_var(wcs_lng2) server_var(wcs_reason)
          es_tell server_var(wcs_giveuserid) #multi server_var(wcs_text)
        }
      }
      es_xelse do
      {
        wcs_getlanguage "wcs_lng" "wcs_lng_minplayers"
        es_format wcs_text server_var(wcs_lng) server_var(wcs_minplayers)
        es_tell server_var(wcs_giveuserid) #multi server_var(wcs_text)
      }
    }
  }
if (server_var(wcs_debug) = 1) then profile end givecredits
}



block wcs_help
{
wcs_debuglog wcs_help start
  es_xgetcmduserid wcs_userid
  es_exists ex userid server_var(wcs_userid)
  if (server_var(ex) = 1) do
  {
    es wcs_menuzero server_var(wcs_userid)
    // prints the wchelp menu out
    if (server_var(wcs_game) != server_var(wcs_game_css)) then wcs_getlanguage "wcs_text" "wcs_lng_help_dods"
    if (server_var(wcs_game) = server_var(wcs_game_css)) then wcs_getlanguage "wcs_text" "wcs_lng_help_css"
    es_format wcs_text "%1 \n [ %2 by kRypT0n!Te - http://wc3source.de ]" server_var(wcs_text) server_var(wcs_version)
    es_strlen wcs_strlen server_var(wcs_text)
    if (server_var(wcs_strlen) > 1) then es_xif (server_var(wcs_strlen) < 900) then es_xmenu 30 server_var(wcs_userid) server_var(wcs_text)
  }
wcs_debuglog wcs_help end
}

block wcs_checkevents
{
if (server_var(wcs_debug) = 1) then profile begin checkevents
  // custom command
  es_xgetargv wcs_userid 1
  es_xgetargv wcs_type 2
  es_exists ex userid server_var(wcs_userid)
  // check for item activation
  es_keygetvalue wcs_itemactivate WCSuserdata server_var(wcs_userid) "itemactivate"
  if (server_var(wcs_itemactivate) = "0") then es_xset ex 0
  if (server_var(ex) = 1) do
  {
    es_exists ex keygroup server_var(wcs_type)
    if (server_var(ex) = 1) do
    {
      es_exists ex key server_var(wcs_type) server_var(wcs_userid)
      if (server_var(ex) = 1) do
      {
        es_keygetvalue wcs_sid server_var(wcs_type) server_var(wcs_userid) id
        es_keygetvalue wcs_id "WCSuserdata" server_var(wcs_userid) "id"
        // Check if user id belongs to the steamid/ip, if not remove
        if (server_var(wcs_sid) = server_var(wcs_id)) do
        {
          es_xset wcs_cmd 0
          es_xset wcs_descr 0
          es_xset wcs_number 0
          // critical bugfix: event_var(userid) was wrong
          es_foreachval wcs_val in server_var(wcs_type) server_var(wcs_userid) "if (icmd_ in server_var(wcs_val)) then es_xdoblock wcs/WCSfunctions/wcs_checkevents2"
        }
        es_xelse do
        {
          es_keydelete server_var(wcs_type) server_var(wcs_userid)
        }
      }
    }
  }
if (server_var(wcs_debug) = 1) then profile end checkevents
}

block wcs_checkevents2
{
  es wcs_debuglog CHECKEVENTS2: server_var(wcs_type) uid: server_var(wcs_userid) val: server_var(wcs_val)
  es_keygetvalue wcs_cmd server_var(wcs_type) server_var(wcs_userid) server_var(wcs_val)
  if (server_var(wcs_cmd) != "0") do
  {
    es_token wcs_number server_var(wcs_val) 1 icmd_
    es_xformatv wcs_descr "idescr_%1" wcs_number
    es_xcopy wcs_itemdescrslot wcs_descr
    es_keygetvalue wcs_descr server_var(wcs_type) server_var(wcs_userid) server_var(wcs_descr)
    // dont spam for say commands
    if (server_var(wcs_type) = "WCSpsay") then es_xset wcs_descr 0
    if (server_var(wcs_descr) != "0") do
    {
      es alias wcs_runcmd server_var(wcs_descr)
      wcs_runcmd
    }
    es_xcopy wcs_itemslot wcs_val
    es alias wcs_runcmd server_var(wcs_cmd)
    wcs_runcmd
  }
}

block wcs_giveweapons
{
  es_xset wcs_wa 0
  es_xset wcs_wb 0
  es_keygetvalue wcs_wa WCSuserdata event_var(userid) "wa"
  es_keygetvalue wcs_wb WCSuserdata event_var(userid) "wb"
  if (server_var(wcs_wa) != "0") then es_xdelayed 1 est_Give event_var(userid) server_var(wcs_wa)
  if (server_var(wcs_wb) != "0") then es_xdelayed 1.2 est_Give event_var(userid) server_var(wcs_wb)
  if (server_var(wcs_wa) != "0") then es_xdelayed 1.4 est_SetAmmo event_var(userid) 1 50
  if (server_var(wcs_wb) != "0") then es_xdelayed 1.6 est_SetAmmo event_var(userid) 2 50
}

block wcs_menuzero
{
  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_keycreate "WCSuserdata" server_var(wcs_uid)
    es_keysetvalue "WCSuserdata" server_var(wcs_uid) "menu" "0"
    es_keysetvalue "WCSuserdata" server_var(wcs_uid) "page" "0"
    es_keysetvalue "WCSuserdata" server_var(wcs_uid) "confirm" "0"
  }
}

block wcs_checkff
{
  if (server_var(mp_friendlyfire) != server_var(wcs_friendlyfire)) do
  {
    es mp_friendlyfire server_var(wcs_friendlyfire)
    wcs_getlanguage "wcs_lng" "wcs_lng_checkff"
    es_msg #green server_var(wcs_lng)
  }
}

// only for backwards compatibility, use wcs_setfx in future!!
block wcs_removefx
{
if (server_var(wcs_debug) = 1) then profile begin removefx
  // type: freeze, speed, god
  es_xgetargv wcs_type 1
  es_xgetargv wcs_removeid 2
  es_exists ex userid server_var(wcs_removeid)
  ifx true(ex) do
  {
    es_xset wcs_dead 1
    es_getplayerprop wcs_dead server_var(wcs_removeid) "CCSPlayer.baseclass.pl.deadflag"
    ifx false(wcs_dead) do
    {
      if (server_var(wcs_type) = "freeze") do
      {
        es est_Freeze server_var(wcs_removeid) 0
        es_setplayerprop server_var(wcs_removeid) CBasePlayer.m_fFlags 1
      }
      if (server_var(wcs_type) = "speed") do
      {
        es_xset wcs_speed 1.0
        es_keygetvalue wcs_speed WCSuserdata server_var(wcs_removeid) speed
        if (server_var(wcs_speed) != "0") then est_Speed server_var(wcs_removeid) server_var(wcs_speed)
      }
      if (server_var(wcs_type) = "god") then est_God server_var(wcs_removeid) 0
    }
  }
if (server_var(wcs_debug) = 1) then profile end removefx
}

//es_xset a 0
//es_xset b 0.0
//while "server_var(a) < 1000" "wcs_removefx freeze 2;es_math b + server_var(removefx);es_xmath a + 1"
//"b" = "0.000759966" ( def. "" )
//while "server_var(a) < 1000" "wcs_setfx freeze 2 = 0;es_math b + server_var(setfx);es_xmath a + 1"
//"b" = "0.001354198" ( def. "" )


block wcs_setfx
{
if (server_var(wcs_debug) = 1) then profile begin setfx
  // types: freeze speed god invis(0-255) invisp(in %) health armor gravity disguiser 1stclip 2ndclip longjump
  es_xgetargv wcs_fxtype 1
  es_xgetargv wcs_uid 2
  es_xgetargv wcs_op 3
  if (server_var(wcs_op) notin "=-+") then es_xset wcs_op "="
  es_xgetargv wcs_params 4
  es_xgetargv wcs_time 5
  es_exists ex key WCSuserdata server_var(wcs_uid)
  es_xset wcs_dead 1
  if (server_var(ex) = 1) then es_xgetplayerprop wcs_dead server_var(wcs_uid) "CCSPlayer.baseclass.pl.deadflag"
  if (server_var(wcs_dead) = 1) then es_xset ex 0
  if (server_var(wcs_fxtype) notin "freeze|speed|god|invis|invisp|health|armor|gravity|disguiser|1stclip|2ndclip|longjump") then es_xset ex 0
  ifx true(ex) do
  {
    if (server_var(wcs_fxtype) = "freeze") do
    {
      ifx true(wcs_params) do
      {
        es est_freeze server_var(wcs_uid) 1
        if (server_var(wcs_time) > 0) then es_xdelayed server_var(wcs_time) wcs_setfx server_var(wcs_fxtype) server_var(wcs_uid) = 0 0
      }
      es_xelse do
      {
        es est_freeze server_var(wcs_uid) 0
        es_setplayerprop server_var(wcs_uid) CBasePlayer.m_fFlags 1
        if (server_var(wcs_time) > 0) then es_xdelayed server_var(wcs_time) wcs_setfx server_var(wcs_fxtype) server_var(wcs_uid) = 1 0
      }
    }
    if (server_var(wcs_fxtype) = "speed") do
    {
      // get saved value, watch out for FLOAT and es_math!!
      es_xset wcs_effectdata 1.0
      es_keygetvalue wcs_effectdata WCSuserdata server_var(wcs_uid) speed
      es_xmath wcs_effectdata float
      if (server_var(wcs_effectdata) = 0) then es_xset wcs_effectdata 1.0
      // reset to old value if timed effect
      if (server_var(wcs_time) > 0) then es_xdelayed server_var(wcs_time) wcs_setfx server_var(wcs_fxtype) server_var(wcs_uid) = server_var(wcs_effectdata) 0
      // check the operators
      if (server_var(wcs_op) = "=") do
      {
        es est_speed server_var(wcs_uid) server_var(wcs_params)
        es_keysetvalue WCSuserdata server_var(wcs_uid) speed server_var(wcs_params)
      }
      if (server_var(wcs_op) = "-") do
      {
        es_math wcs_effectdata - server_var(wcs_params)
        if (server_var(wcs_effectdata) <= 0) then es_xset wcs_effectdata 0
        es est_speed server_var(wcs_uid) server_var(wcs_effectdata)
        es_keysetvalue WCSuserdata server_var(wcs_uid) speed server_var(wcs_effectdata)
      }
      if (server_var(wcs_op) = "+") do
      {
        es_math wcs_effectdata + server_var(wcs_params)
        es est_speed server_var(wcs_uid) server_var(wcs_effectdata)
        es_keysetvalue WCSuserdata server_var(wcs_uid) speed server_var(wcs_effectdata)
      }
      es wcs_debuglog WCS_FX SPEED op: server_var(wcs_op) DATA server_var(wcs_effectdata) PARAM server_var(wcs_params) TIME server_var(wcs_time)
    }
    if (server_var(wcs_fxtype) = "god") do
    {
      ifx true(wcs_params) do
      {
        es est_god server_var(wcs_uid) 1
        if (server_var(wcs_time) > 0) then es_xdelayed server_var(wcs_time) wcs_setfx server_var(wcs_fxtype) server_var(wcs_uid) = 0 0
      }
      es_xelse do
      {
        es est_god server_var(wcs_uid) 0
        if (server_var(wcs_time) > 0) then es_xdelayed server_var(wcs_time) wcs_setfx server_var(wcs_fxtype) server_var(wcs_uid) = 1 0
      }
    }
    if (server_var(wcs_fxtype) = "invis") do
    {
      alias wcs_invischeck "if (server_var(wcs_effectdata) > 100) then es_xset wcs_effectdata 100.0;if (server_var(wcs_effectdata) <= 0) then es_xset wcs_effectdata 0.0;if (server_var(wcs_invis) > 255) then es_xset wcs_invis 255;if (server_var(wcs_invis) <= 0) then es_xset wcs_invis 0;es_xmath wcs_effectdata float;es_xmath wcs_invis float"
      // get saved value, watch out for FLOAT and es_math!! EFFECTDATA = PERCENT, INVIS = ABSOLUTE
      es_xset wcs_effectdata 0.0
      es_keygetvalue wcs_effectdata WCSuserdata server_var(wcs_uid) invisp
      if (server_var(wcs_effectdata) = 0) then es_xset wcs_effectdata 0
      // calculate percentage and absolute value
      es_xmathparse wcs_invis "(wcs_effectdata - 100.0) * -2.55"
      wcs_invischeck
      // reset to old value if timed effect
      if (server_var(wcs_time) > 0) then es_xdelayed server_var(wcs_time) wcs_setfx server_var(wcs_fxtype) server_var(wcs_uid) = server_var(wcs_invis) 0
      // check the operators
      if (server_var(wcs_op) = "=") do
      {
        es_xmathparse wcs_effectdata "(wcs_params / -2.55) + 100"
        wcs_invischeck
        es est_setplayercolor server_var(wcs_uid) 255 255 255 server_var(wcs_params) 1
        es_keysetvalue WCSuserdata server_var(wcs_uid) invisp server_var(wcs_effectdata)
      }
      if (server_var(wcs_op) = "-") do
      {
        es_math wcs_invis - server_var(wcs_params)
        es_xmathparse wcs_effectdata "(wcs_invis / -2.55) + 100"
        wcs_invischeck
        es est_setplayercolor server_var(wcs_uid) 255 255 255 server_var(wcs_invis) 1
        es_keysetvalue WCSuserdata server_var(wcs_uid) invisp server_var(wcs_effectdata)
      }
      if (server_var(wcs_op) = "+") do
      {
        es_math wcs_invis + server_var(wcs_params)
        es_xmathparse wcs_effectdata "(wcs_invis / -2.55) + 100"
        wcs_invischeck
        es est_setplayercolor server_var(wcs_uid) 255 255 255 server_var(wcs_invis) 1
        es_keysetvalue WCSuserdata server_var(wcs_uid) invisp server_var(wcs_effectdata)
      }
      es wcs_debuglog WCS_FX INVIS op: server_var(wcs_op) INVIS_PERC server_var(wcs_effectdata) INVIS_ASB server_var(wcs_invis) PARAM server_var(wcs_params) TIME server_var(wcs_time)
    }
    if (server_var(wcs_fxtype) = "invisp") do
    {
      alias wcs_invischeck "if (server_var(wcs_effectdata) > 100) then es_xset wcs_effectdata 100.0;if (server_var(wcs_effectdata) <= 0) then es_xset wcs_effectdata 0.0;if (server_var(wcs_invis) > 255) then es_xset wcs_invis 255;if (server_var(wcs_invis) <= 0) then es_xset wcs_invis 0;es_xmath wcs_effectdata float;es_xmath wcs_invis float"
      // get saved value, watch out for FLOAT and es_math!! EFFECTDATA = PERCENT, INVIS = ABSOLUTE
      es_xset wcs_effectdata 0.0
      es_keygetvalue wcs_effectdata WCSuserdata server_var(wcs_uid) invisp
      if (server_var(wcs_effectdata) = 0) then es_xset wcs_effectdata 0
      // calculate percentage and absolute value
      es_xmathparse wcs_invis "(wcs_effectdata - 100.0) * -2.55"
      wcs_invischeck
      // reset to old value if timed effect
      if (server_var(wcs_time) > 0) then es_xdelayed server_var(wcs_time) wcs_setfx server_var(wcs_fxtype) server_var(wcs_uid) = server_var(wcs_effectdata) 0
      // check the operators
      if (server_var(wcs_op) = "=") do
      {
        es_xmathparse wcs_invis "(wcs_params - 100.0) * -2.55"
        wcs_invischeck
        es est_setplayercolor server_var(wcs_uid) 255 255 255 server_var(wcs_invis) 1
        es_keysetvalue WCSuserdata server_var(wcs_uid) invisp server_var(wcs_params)
      }
      if (server_var(wcs_op) = "-") do
      {
        es_math wcs_effectdata - server_var(wcs_params)
        es_xmathparse wcs_invis "(wcs_effectdata - 100.0) * -2.55"
        wcs_invischeck
        es est_setplayercolor server_var(wcs_uid) 255 255 255 server_var(wcs_invis) 1
        es_keysetvalue WCSuserdata server_var(wcs_uid) invisp server_var(wcs_effectdata)
      }
      if (server_var(wcs_op) = "+") do
      {
        es_math wcs_effectdata + server_var(wcs_params)
        es_xmathparse wcs_invis "(wcs_effectdata - 100.0) * -2.55"
        wcs_invischeck
        es est_setplayercolor server_var(wcs_uid) 255 255 255 server_var(wcs_invis) 1
        es_keysetvalue WCSuserdata server_var(wcs_uid) invisp server_var(wcs_effectdata)
      }
      es wcs_debuglog WCS_FX INVISP op: server_var(wcs_op) INVIS_PERC server_var(wcs_effectdata) INVIS_ASB server_var(wcs_invis) PARAM server_var(wcs_params) TIME server_var(wcs_time)
    }
    if (server_var(wcs_fxtype) = "health") do
    {
      es est_gethealth wcs_health server_var(wcs_uid)
      if (server_var(wcs_time) > 0) then es_xdelayed server_var(wcs_time) wcs_setfx server_var(wcs_fxtype) server_var(wcs_uid) = server_var(wcs_health) 0
      es_math wcs_health server_var(wcs_op) server_var(wcs_params)
      if (server_var(wcs_health) > 0) then est_health server_var(wcs_uid) = server_var(wcs_health)
      if (server_var(wcs_health) <= 0) then est_slay server_var(wcs_uid)
      es wcs_debuglog WCS_FX HEALTH set to server_var(wcs_health)
    }
    if (server_var(wcs_fxtype) = "armor") do
    {
      es est_getarmor wcs_armor server_var(wcs_uid)
      if (server_var(wcs_time) > 0) then es_xdelayed server_var(wcs_time) wcs_setfx server_var(wcs_fxtype) server_var(wcs_uid) = server_var(wcs_armor) 0
      es_math wcs_armor server_var(wcs_op) server_var(wcs_params)
      if (server_var(wcs_armor) > 0) then est_armor server_var(wcs_uid) server_var(wcs_op) server_var(wcs_armor)
      if (server_var(wcs_armor) <= 0) then est_armor server_var(wcs_uid) = 0
      es wcs_debuglog WCS_FX ARMOR set to server_var(wcs_armor)
    }
    if (server_var(wcs_fxtype) = "gravity") do
    {
      // get saved value, watch out for FLOAT and es_math!!
      es_xset wcs_effectdata 1.0
      es_keygetvalue wcs_effectdata WCSuserdata server_var(wcs_uid) gravity
      es_xmath wcs_effectdata float
      if (server_var(wcs_effectdata) = 0) then es_xset wcs_effectdata 1.0
      // reset to old value if timed effect
      if (server_var(wcs_time) > 0) then es_xdelayed server_var(wcs_time) wcs_setfx server_var(wcs_fxtype) server_var(wcs_uid) = server_var(wcs_effectdata) 0
      // check the operators
      if (server_var(wcs_op) = "=") do
      {
        es est_setgravity server_var(wcs_uid) server_var(wcs_params)
        es_keysetvalue WCSuserdata server_var(wcs_uid) gravity server_var(wcs_params)
      }
      if (server_var(wcs_op) = "-") do
      {
        es_math wcs_effectdata - server_var(wcs_params)
        if (server_var(wcs_effectdata) <= 0) then es_xset wcs_effectdata 0
        es est_setgravity server_var(wcs_uid) server_var(wcs_effectdata)
        es_keysetvalue WCSuserdata server_var(wcs_uid) gravity server_var(wcs_effectdata)
      }
      if (server_var(wcs_op) = "+") do
      {
        es_math wcs_effectdata + server_var(wcs_params)
        es est_setgravity server_var(wcs_uid) server_var(wcs_effectdata)
        es_keysetvalue WCSuserdata server_var(wcs_uid) gravity server_var(wcs_effectdata)
      }
      es wcs_debuglog WCS_FX GRAVITY op: server_var(wcs_op) DATA server_var(wcs_effectdata) PARAM server_var(wcs_params) TIME server_var(wcs_time)
    }
    if (server_var(wcs_fxtype) = "disguiser") do
    {
      es_xset wcs_model_a 0 "Foreign model"
      es_xset wcs_model_b 0 "Team model"
      es_getplayerteam wcs_team server_var(wcs_uid)
      if(server_var(wcs_game) = server_var(wcs_game_css)) then es_xif (server_var(wcs_team) = 3) then es_xset wcs_model_a player/t_phoenix
      if(server_var(wcs_game) = server_var(wcs_game_css)) then es_xif (server_var(wcs_team) = 2) then es_xset wcs_model_a player/ct_urban
      if(server_var(wcs_game) = server_var(wcs_game_dods)) then es_xif (server_var(wcs_team) = 2) then es_xset wcs_model_a player/german_assault
      if(server_var(wcs_game) = server_var(wcs_game_dods)) then es_xif (server_var(wcs_team) = 3) then es_xset wcs_model_a player/american_assault
      if(server_var(wcs_game) = server_var(wcs_game_css)) then es_xif (server_var(wcs_team) = 3) then es_xset wcs_model_b player/ct_urban
      if(server_var(wcs_game) = server_var(wcs_game_css)) then es_xif (server_var(wcs_team) = 2) then es_xset wcs_model_b player/t_phoenix
      if(server_var(wcs_game) = server_var(wcs_game_dods)) then es_xif (server_var(wcs_team) = 2) then es_xset wcs_model_b player/american_assault
      if(server_var(wcs_game) = server_var(wcs_game_dods)) then es_xif (server_var(wcs_team) = 3) then es_xset wcs_model_b player/german_assault
      ifx true(wcs_params) do
      {
        es est_setmodel server_var(wcs_uid) server_var(wcs_model_a)
        if (server_var(wcs_time) > 0) then es_xdelayed server_var(wcs_time) wcs_setfx server_var(wcs_fxtype) server_var(wcs_uid) = 0 0
      }
      es_xelse do
      {
        es est_setmodel server_var(wcs_uid) server_var(wcs_model_b)
        if (server_var(wcs_time) > 0) then es_xdelayed server_var(wcs_time) wcs_setfx server_var(wcs_fxtype) server_var(wcs_uid) = 1 0
      }
      es wcs_debuglog WCS_FX DISGUISER switch server_var(wcs_params) -> models for 0: server_var(wcs_model_b) 1: server_var(wcs_model_a)
    }
    if (server_var(wcs_fxtype) = "longjump") do
    {
      es_xset wcs_effectdata 0
      es_keygetvalue wcs_effectdata WCSuserdata server_var(wcs_uid) longjump
      es_xmath wcs_effectdata float
      if (server_var(wcs_effectdata) = 0) then es_xset wcs_effectdata 0
      if (server_var(wcs_time) > 0) then es_xdelayed server_var(wcs_time) wcs_setfx server_var(wcs_fxtype) server_var(wcs_uid) = server_var(wcs_effectdata) 0
      if (server_var(wcs_op) = "=") do
      {
        es_keysetvalue WCSuserdata server_var(wcs_uid) longjump server_var(wcs_params)
      }
      if (server_var(wcs_op) = "-") do
      {
        es_math wcs_effectdata - server_var(wcs_params)
        if (server_var(wcs_effectdata) <= 0) then es_xset wcs_effectdata 0
        es_keysetvalue WCSuserdata server_var(wcs_uid) longjump server_var(wcs_effectdata)
      }
      if (server_var(wcs_op) = "+") do
      {
        es_math wcs_effectdata + server_var(wcs_params)
        es_keysetvalue WCSuserdata server_var(wcs_uid) longjump server_var(wcs_effectdata)
      }
      es wcs_debuglog WCS_FX LONGJUMP op: server_var(wcs_op) DATA server_var(wcs_effectdata) PARAM server_var(wcs_params) TIME server_var(wcs_time)
    }
    if (server_var(wcs_fxtype) = "1stclip") do
    {
      es_xset wcs_effectdata 0
      es_keygetvalue wcs_effectdata WCSuserdata server_var(wcs_uid) 1stclip
      es_xmath wcs_effectdata float
      if (server_var(wcs_effectdata) = 0) then est_getclipammo wcs_effectdata server_var(wcs_uid) 1
      if (server_var(wcs_time) > 0) then es_xdelayed server_var(wcs_time) wcs_setfx server_var(wcs_fxtype) server_var(wcs_uid) = server_var(wcs_effectdata) 0
      if (server_var(wcs_op) = "=") do
      {
        es_keysetvalue WCSuserdata server_var(wcs_uid) 1stclip server_var(wcs_params)
        es est_setclipammo server_var(wcs_uid) 1 server_var(wcs_params)
      }
      if (server_var(wcs_op) = "-") do
      {
        es_math wcs_effectdata - server_var(wcs_params)
        if (server_var(wcs_effectdata) <= 0) then es_xset wcs_effectdata 0
        es_keysetvalue WCSuserdata server_var(wcs_uid) 1stclip server_var(wcs_effectdata)
        es est_setclipammo server_var(wcs_uid) 1 server_var(wcs_effectdata)
      }
      if (server_var(wcs_op) = "+") do
      {
        es_math wcs_effectdata + server_var(wcs_params)
        es_keysetvalue WCSuserdata server_var(wcs_uid) 1stclip server_var(wcs_effectdata)
        es est_setclipammo server_var(wcs_uid) 1 server_var(wcs_effectdata)
      }
      es wcs_debuglog WCS_FX 1stCLIP op: server_var(wcs_op) DATA server_var(wcs_effectdata) PARAM server_var(wcs_params) TIME server_var(wcs_time)
    }
    if (server_var(wcs_fxtype) = "2ndclip") do
    {
      es_xset wcs_effectdata 0
      es_keygetvalue wcs_effectdata WCSuserdata server_var(wcs_uid) 2ndclip
      es_xmath wcs_effectdata float
      if (server_var(wcs_effectdata) = 0) then est_getclipammo wcs_effectdata server_var(wcs_uid) 2
      if (server_var(wcs_time) > 0) then es_xdelayed server_var(wcs_time) wcs_setfx server_var(wcs_fxtype) server_var(wcs_uid) = server_var(wcs_effectdata) 0
      if (server_var(wcs_op) = "=") do
      {
        es_keysetvalue WCSuserdata server_var(wcs_uid) 2ndclip server_var(wcs_params)
        es est_setclipammo server_var(wcs_uid) 2 server_var(wcs_params)
      }
      if (server_var(wcs_op) = "-") do
      {
        es_math wcs_effectdata - server_var(wcs_params)
        if (server_var(wcs_effectdata) <= 0) then es_xset wcs_effectdata 0
        es_keysetvalue WCSuserdata server_var(wcs_uid) 2ndclip server_var(wcs_effectdata)
        es est_setclipammo server_var(wcs_uid) 2 server_var(wcs_effectdata)
      }
      if (server_var(wcs_op) = "+") do
      {
        es_math wcs_effectdata + server_var(wcs_params)
        es_keysetvalue WCSuserdata server_var(wcs_uid) 2ndclip server_var(wcs_effectdata)
        es est_setclipammo server_var(wcs_uid) 2 server_var(wcs_effectdata)
      }
      es wcs_debuglog WCS_FX 2ndCLIP op: server_var(wcs_op) DATA server_var(wcs_effectdata) PARAM server_var(wcs_params) TIME server_var(wcs_time)
    }
  }
if (server_var(wcs_debug) = 1) then profile end setfx
}

block wcs_giveitem
{
  es_xset wcs_uid 0
  es_xset wcs_item 0
  es_xgetargv wcs_uid 1
  es_xgetargv wcs_item 2
  es_exists ex userid server_var(wcs_uid)
  es_getplayerprop wcs_dead server_var(wcs_uid) "CCSPlayer.baseclass.pl.deadflag"
  if (server_var(wcs_dead) = "1") then es_xset ex 0
  if (server_var(wcs_item) notin server_var(wcs_wpn_all)) then es_xset ex 0
  if (server_var(ex) = 1) do
  {
    // special HE/Flash/Smoke handling
    es_xset wcs_stack 0
    if ("grenade" in server_var(wcs_item)) then es_xset wcs_stack 1
    if ("weapon_flashbang" = server_var(wcs_item)) then es_xset wcs_stack 1
    if ("frag_" in server_var(wcs_item)) then es_xset wcs_stack 1
    if (server_var(wcs_stack) = 1) do
    {
      es_xset wcs_ammo 0
      es est_GetAmmo wcs_ammo server_var(wcs_uid) server_var(wcs_item)
      es_xmath wcs_ammo + 1
      es_give server_var(wcs_uid) server_var(wcs_item)
      if (server_var(wcs_ammo) > 1) then est_SetAmmo server_var(wcs_uid) server_var(wcs_item) server_var(wcs_ammo)
    }
    es_xelse do
    {
      es_give server_var(wcs_uid) server_var(wcs_item)
    }
    es_xstring wcs_item replace "weapon_" " "
    wcs_getlanguage "wcs_lng" "wcs_lng_gained"
    es_format wcs_text "#lightgreen%1 : #green%2" server_var(wcs_lng) server_var(wcs_item)
    es_tell server_var(wcs_uid) #multi server_var(wcs_text)
  }
}
// <<<<<<<<<<<<<<<<< END CUSTOM COMMANDS <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// >>>>>>>>>>>>>>>>> BEGIN DAMAGE EFFECTS >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
block wcs_dealdamage
{
if (server_var(wcs_debug) = 1) then profile begin dealdamage
  // usage:    wcs_dealdamage <userid> <targetid> <damage>
  // userid:   give a VALID userid
  // targetid: id of the target
  // damage:   damage to do

  es_xset wcs_dduserid 0
  es_xset wcs_ddtargetid 0
  es_xset wcs_dddamage 0

  es_xgetargv wcs_dduserid 1
  es_xgetargv wcs_ddtargetid 2
  es_xgetargv wcs_dddamage 3

  es_exists ex userid server_var(wcs_dduserid)
  if (server_var(wcs_dddamage) < 1) then es_xset ex 0
  if (server_var(ex) = 1) do
  {
    es_exists ex userid server_var(wcs_ddtargetid)
    if (server_var(ex) = 1) do
    {
      es est_GetHealth wcs_health server_var(wcs_ddtargetid)
      if (server_var(wcs_health) > server_var(wcs_dddamage)) do
      {
        // doesnt work yet (EST bug) !!!
        //es est_damage server_var(wcs_dduserid) server_var(wcs_ddtargetid) server_var(wcs_dddamage)
        es_math wcs_health - server_var(wcs_dddamage)
        es est_sethealth server_var(wcs_ddtargetid) server_var(wcs_health)
      }
      es_xelse do
      {
        // new method, player will die !
        es_give server_var(wcs_ddtargetid) point_hurt
        es_fire server_var(wcs_ddtargetid) !self addoutput "targetname badboy"
        es_fire server_var(wcs_ddtargetid) point_hurt addoutput "targetname rps_damage"
        es_format wcs_hurt_damage "Damage %1" server_var(wcs_dddamage)
        es_fire server_var(wcs_ddtargetid) rps_damage addoutput server_var(wcs_hurt_damage)
        es_fire server_var(wcs_ddtargetid) rps_damage addoutput "DamageType 1"
        es_fire server_var(wcs_dduserid) rps_damage addoutput "DamageTarget badboy"
        es_fire server_var(wcs_ddtargetid) rps_damage TurnOn
        es_fire server_var(wcs_dduserid) rps_damage Hurt
        es_fire server_var(wcs_ddtargetid) rps_damage kill
        es_fire server_var(wcs_ddtargetid) !self addoutput "targetname taco"
      }
    }
  }
if (server_var(wcs_debug) = 1) then profile end dealdamage
}

block wcs_explode
{
  // usage:     wcs_explode <userid> <targetid> <magnitude> <radius>
  // userid:    give a VALID userid
  // targetid:  id of the target
  // magnitude: strenght of explosion
  // radius:    size of the effect
  es_xset wcs_userid 0
  es_xset wcs_targetid 0
  es_xset wcs_explodemagnitude 0
  es_xset wcs_exploderadius 0
  es_xgetargv wcs_userid 1
  es_xgetargv wcs_targetid 2
  es_xgetargv wcs_explodemagnitude 3
  es_xgetargv wcs_exploderadius 4
  es_exists ex userid server_var(wcs_userid)
  es_xset wcs_tmp "0"
  es_keygetvalue wcs_tmp "WCSuserdata" server_var(wcs_userid) "ismole"
  if (server_var(wcs_tmp) = "1") then es_xset ex "0"
  if (server_var(ex) = 1) do
  {
    es_exists ex userid server_var(wcs_targetid)
    if (server_var(ex) = 1) do
    {
      // set to default if missing parameters
      if (server_var(wcs_explodemagnitude) = 0) then es_xset wcs_explodemagnitude 10
      if (server_var(wcs_exploderadius) = 0) then es_xset wcs_exploderadius 10
      es_xset wcs_x 0
      es_xset wcs_y 0
      es_xset wcs_z 0
      es_getplayerlocation wcs_x wcs_y wcs_z server_var(wcs_targetid)
      // random explosion sound
      es_xset wcs_exrand 0
      es_xrand wcs_exrand 1 6
      if (server_var(wcs_exrand) = 1) then es_xset wcs_sound "weapons\explode3.wav"
      if (server_var(wcs_exrand) = 2) then es_xset wcs_sound "weapons\explode4.wav"
      if (server_var(wcs_exrand) = 3) then es_xset wcs_sound "weapons\explode5.wav"
      if (server_var(wcs_exrand) = 4) then es_xset wcs_sound "weapons\mortar\mortar_explode1.wav"
      if (server_var(wcs_exrand) = 5) then es_xset wcs_sound "weapons\mortar\mortar_explode2.wav"
      if (server_var(wcs_exrand) = 6) then es_xset wcs_sound "weapons\mortar\mortar_explode3.wav"
      if (server_var(wcs_cfg_friendlyexplosion) = "1") do
      {
        //set explosion variables
        es_give server_var(wcs_userid) env_explosion
        //Origin
        es_format wcs_format "origin %1 %2 %3" server_var(wcs_x) server_var(wcs_y) server_var(wcs_z)
        es_fire server_var(wcs_userid) env_explosion addoutput server_var(wcs_format)
        es_format wcs_format "%1,%2,%3" server_var(wcs_x) server_var(wcs_y) server_var(wcs_z)
        es_setindexprop server_var(eventscripts_lastgive) CBaseEntity.m_vecOrigin server_var(wcs_format)
        //Power
        es_format wcs_format "imagnitude %1" server_var(wcs_explodemagnitude)
        es_fire server_var(wcs_userid) env_explosion addoutput server_var(wcs_format)
        //Range
        es_format wcs_format "iradiusoverride %1" server_var(wcs_exploderadius)
        es_fire server_var(wcs_userid) env_explosion addoutput server_var(wcs_format)
        // Set the owner of the explosion.
        es_xset owner 0
        es_getplayerhandle owner server_var(wcs_userid)
        es_xexists ex keygroup wcs_explosions
        if (server_var(ex) = 1) then es_xkeygroupdelete wcs_explosions
        es_xcreateentitylist wcs_explosions env_explosion
        es_xset wcs_expindex 0
        es_xforeachkey wcs_expindex in wcs_explosions "esnq es_xsetindexprop server_var(wcs_expindex) CBaseEntity.m_hOwnerEntity server_var(owner)"
        // This is it... time to explode!
        if (server_var(wcs_soundfx) = 1) then es_xemitsound entity server_var(eventscripts_lastgive) server_var(wcs_sound) 1 0.60
        es_fire server_var(wcs_userid) env_explosion explode
        es_fire server_var(wcs_userid) env_explosion kill
      }
      es_xelse do
      {
        // no area damage effect
        es_xset wcs_exdmg 0
        es_xcopy wcs_exdmg wcs_explodemagnitude
        es_math wcs_exdmg * server_var(wcs_exploderadius)
        es_xmath wcs_exdmg / 150
        es est_RoundDecimal wcs_exdmg server_var(wcs_exdmg) 0
        es wcs_dealdamage server_var(wcs_userid) server_var(wcs_targetid) server_var(wcs_exdmg)
        if (server_var(wcs_soundfx) = 1) then est_PlayPlayer server_var(wcs_targetid) server_var(wcs_sound)
      }
    }
    es_xelse do
    {
      wcs_debuglog "WARNING: called wcs_explode with non-existing targetid !"
    }
  }
}
// <<<<<<<<<<<<<<<<< END DAMAGE EFFECTS <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// >>>>>>>>>>>>>>>>> CLEANUP >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
block wcs_cleanup
{
  // a try to implement a cleanup script, but Eventscripts cannot handle large files ...
  es_xset wcs_lastplayed 0
  es_xset wcs_time 0
  es_xgettime wcs_time
  es_xset wcs_removetime 0
  es_set wcs_deletetime server_var(wcs_deletedays)
  es_xmath wcs_deletetime * 86400
  if (server_var(wcs_deletetime) > 0) do
  {
    if (server_var(wcs_debug) = 1) then profile begin cleanup_duration
    es_xforeachkey wcs_key in WCSusers "if (server_var(wcs_key) != bot) then es_xif (server_var(wcs_key) != 0) then es_xdoblock wcs/WCSfunctions/wcs_cleanupcheck"
    // delete every key with deleteflag = 1
    es_keygroupfilter WCSusers not "deleteflag" 1
    // save xp to file
    es_keygroupsave WCSusers "|wcs/WCSusers"
    if (server_var(wcs_debug) = 1) then profile end cleanup_duration
    es_msg Cleanup successfull, duration: server_var(cleanup_duration)
  }
  es_xelse do
  {
    wcs_debuglog "WARNING: cleanup executed, but deletetime is 0 !! All players would have beed deleted ..."
  }
}

block wcs_cleanupcheck
{
  es_set wcs_removetime server_var(wcs_time)
  es_keygetvalue wcs_lastplayed WCSusers server_var(wcs_key) lastplayed
  es_math wcs_removetime - server_var(wcs_lastplayed)
  if (server_var(wcs_removetime) >= server_var(wcs_deletetime)) then es_xkeysetvalue WCSusers server_var(wcs_key) "deleteflag" "1"
}
// <<<<<<<<<<<<<<<<< END CLEANUP <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


// >>>>>>>>>>>>>>>>> START COMMON INFO >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
block wcs_showinfohandle
{
if (server_var(wcs_debug) = 1) then profile begin showinfohandle
  // custom command - argument is type of showinfo
  es_xset wcs_type 0
  es_xgetargv wcs_type 1
  es_exists ex key "WCSuserdata" event_var(userid)
  if (server_var(wcs_type) notin "raceinfo|playerinfo") then es_xset ex 0
  if (server_var(ex) = 1) do
  {
    es_keygetvalue wcs_page "WCSuserdata" event_var(userid) "page"
    // handle back
    if (event_var(commandstring) = "8") do
    {
      if (server_var(wcs_page) > 1) do
      {
        es_xmath wcs_page - 2
        es_keysetvalue "WCSuserdata" event_var(userid) "page" server_var(wcs_page)
        if (server_var(wcs_type) = "raceinfo") then wcs_showraceinfo event_var(userid)
        if (server_var(wcs_type) = "playerinfo") then wcs_showplayerinfo event_var(userid)
      }
      es_xelse do
      {
        es_keysetvalue "WCSuserdata" event_var(userid) "page" "0"
        es_keysetvalue "WCSuserdata" event_var(userid) "menu" "0"
      }
    }
    // handle next
    if (event_var(commandstring) = "9") do
    {
      es_xset wcs_next 0
      if (server_var(wcs_type) != "playerinfo") then es_xkeygetvalue wcs_next "WCSinfo" server_var(wcs_type) server_var(wcs_page)
      if (server_var(wcs_type) = "playerinfo") do
      {
        es_xgetplayercount wcs_playercount
        es_xcopy wcs_tmp wcs_page
        es_xmath wcs_tmp * 7
        if (server_var(wcs_playercount) > server_var(wcs_tmp)) then es_xset wcs_next "ok"
      }
      if (server_var(wcs_next) != "0") do
      {
        es_xmath wcs_page + 1
        if (server_var(wcs_type) = "raceinfo") then wcs_showraceinfo event_var(userid)
        if (server_var(wcs_type) = "playerinfo") then wcs_showplayerinfo event_var(userid)
      }
      es_xelse do
      {
        es_keysetvalue WCSuserdata event_var(userid) "page" "0"
        es_keysetvalue WCSuserdata event_var(userid) "menu" "0"
      }
    }
    if (event_var(commandstring) != "9") do
    {
      if (event_var(commandstring) != "8") do
      {
        if (server_var(wcs_type) = "playerinfo") do
        {
          if (event_var(commandstring) != "10") do
          {
            es_xcopy wcs_target wcs_page
            es_xmath wcs_target * 7
            es_xmath wcs_target - 7
            es_math wcs_target + event_var(commandstring)
            es_xset wcs_scounter 1
            es_xforeachkey wcs_key in "WCSuserdata" "if (server_var(wcs_target) = server_var(wcs_scounter)) then es_xdoblock wcs/WCSusers/wcs_playerinfo_details;es_xmath wcs_scounter + 1"
          }
        }
        if (server_var(wcs_type) != "shopinfo") do
        {
          if (server_var(wcs_type) != "playerinfo") do
          {
            es_keysetvalue "WCSuserdata" event_var(userid) "page" "0"
            es_keysetvalue "WCSuserdata" event_var(userid) "menu" "0"
          }
        }
      }
    }
  }
  es_xelse do
  {
    es_keycreate "WCSuserdata" event_var(userid)
  }
if (server_var(wcs_debug) = 1) then profile end showinfohandle
}
// <<<<<<<<<<<<<<<<< END COMMON INFO <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

block wcs_levi_reactivate
{
  // fix for losing gravity when climbing ladders
  es_exists ex key "WCSuserdata" event_var(userid)
  if (server_var(ex) = 1) do
  {
    es_keygetvalue wcs_gravity "WCSuserdata" event_var(userid) "gravity"
    if (server_var(wcs_gravity) != "0") do
    {
      es_getplayerprop wcs_dead event_var(userid) "CCSPlayer.baseclass.pl.deadflag"
      if (server_var(wcs_dead) = "0") then est_SetGravity event_var(userid) server_var(wcs_gravity)
    }
  }
}

block wcs_flash
{
  es_xgetargv wcs_uid 1
  es_xgetargv wcs_targetid 2
  // "superflash" effect, attacker has the flag
  es_exists ex key WCSuserdata server_var(wcs_uid)
  if (server_var(ex) = 1) do
  {
    es_keygetvalue wcs_target WCSuserdata server_var(wcs_uid) flash_target
     if (server_var(wcs_target) = "attacker") do
    {
      es_keygetvalue wcs_duration WCSuserdata server_var(wcs_uid) flash_duration
      es_keygetvalue wcs_alpha WCSuserdata server_var(wcs_uid) flash_alpha
      if (server_var(wcs_duration) != "0") do
      {
        es_getplayerprop wcs_tmp server_var(wcs_targetid) CCSPlayer.m_flFlashDuration
        es_math wcs_duration * server_var(wcs_tmp)
        es_setplayerprop server_var(wcs_targetid) CCSPlayer.m_flFlashDuration server_var(wcs_duration)
      }
      if (server_var(wcs_alpha) != "0") then es_xsetplayerprop server_var(wcs_targetid) CCSPlayer.m_flFlashMaxAlpha server_var(wcs_alpha)
    }
  }
  // "weak flash" effect, victim has the flag
  es_exists ex key WCSuserdata server_var(wcs_targetid)
  if (server_var(ex) = 1) do
  {
    es_keygetvalue wcs_target WCSuserdata server_var(wcs_targetid) flash_target
     if (server_var(wcs_target) = "victim") do
    {
      es_keygetvalue wcs_duration WCSuserdata server_var(wcs_targetid) flash_duration
      es_keygetvalue wcs_alpha WCSuserdata server_var(wcs_targetid) flash_alpha
      if (server_var(wcs_duration) != "0") do
      {
        es_getplayerprop wcs_tmp server_var(wcs_targetid) CCSPlayer.m_flFlashDuration
        es_math wcs_duration * server_var(wcs_tmp)
        es_setplayerprop server_var(wcs_targetid) CCSPlayer.m_flFlashDuration server_var(wcs_duration)
      }
      if (server_var(wcs_alpha) != "0") then es_xsetplayerprop server_var(wcs_targetid) CCSPlayer.m_flFlashMaxAlpha server_var(wcs_alpha)
    }
  }
}

// WCSusers (id TEXT PRIMARY KEY NOT NULL, race TEXT KEY NOT NULL, level NUMERIC DEFAULT 0, xp NUMERIC DEFAULT 0, skills TEXT NOT NULL)
// STEAM, _wcs_, LAST RACE, LASTPLAYED, PLAYERDATA=totallevel|unused|language?
// WCStop10 (id TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL, race TEXT NOT NULL, totallevel NUMERIC DEFAULT 0, curlevel DEFAULT 0)
block wcs_saveplayer
{
if (server_var(wcs_debug) = 1) then profile begin saveplayer
  es_xgetargv wcs_uid 1
  es_xgetargv wcs_params 2
  es_exists ex key WCSuserdata server_var(wcs_uid)
  ifx true(ex) do
  {
    // get the record
    es_keygetvalue wcs_id "WCSuserdata" server_var(wcs_uid) "id"
    es_keygetvalue wcs_race "WCSuserdata" server_var(wcs_uid) "race"
    es_keygetvalue wcs_level "WCSuserdata" server_var(wcs_uid) "level"
    es_keygetvalue wcs_xp "WCSuserdata" server_var(wcs_uid) "xp"
    
    // save all skill levels
    es_xset wcs_counter 1
    es_keygetvalue wcs_numberofskills WCSraces server_var(wcs_race) numberofskills
    while "server_var(wcs_counter) <= server_var(wcs_numberofskills)" "es_format wcs_skillnumber skill_%1 server_var(wcs_counter);es_keygetvalue wcs_skill WCSuserdata server_var(wcs_uid) server_var(wcs_skillnumber);if (server_var(wcs_skill) = 0) then es_xset wcs_skill 0;if (server_var(wcs_counter) = 1) then es_xformat wcs_tmp2 %1 server_var(wcs_skill);if (server_var(wcs_counter) != 1) then es_xformat wcs_tmp2 %1|%2 server_var(wcs_tmp2) server_var(wcs_skill);es_xmath wcs_counter + 1"
    es_formatqv wcs_query "INSERT OR REPLACE INTO `WCSusers` (`id`, `race`, `level`, `xp`, `skills`) VALUES ('%1', '%2', '%3', '%4', '%5')" wcs_id wcs_race wcs_level wcs_xp wcs_tmp2
es wcs_debuglog SQLiQUERY: server_var(wcs_query)
    es_sql query wcsdata server_var(wcs_query)
    ifx true(wcs_params) do
    {
    	es_xgettime wcs_lastplayed
    	es_keygetvalue wcs_total_level WCSuserdata server_var(wcs_uid) "total_level"
    	// TODO das 3. feld
    	es_formatv wcs_tmp2 "%1" wcs_total_level
    	es_formatqv wcs_query "INSERT OR REPLACE INTO `WCSusers` (`id`, `race`, `level`, `xp`, `skills`) VALUES ('%1', '_wcs_', '%2', '%3', '%4')" wcs_id wcs_race wcs_lastplayed wcs_tmp2
es wcs_debuglog SQLiQUERY: server_var(wcs_query)
    	es_sql query wcsdata server_var(wcs_query)
    }
  }
if (server_var(wcs_debug) = 1) then profile end saveplayer
}

block wcs_getplayer
{
if (server_var(wcs_debug) = 1) then profile begin getplayer
  es_xgetargv wcs_uid 1
  es_xgetargv wcs_params 2
  es_exists ex key WCSuserdata server_var(wcs_uid)
  ifx true(ex) do
  {
    es_keygetvalue wcs_id WCSuserdata server_var(wcs_uid) id
    // check for old player record (WCSusers keygroup)
    es_exists ex key WCSusers server_var(wcs_id)
    ifx true(ex) do
    {
wcs_debuglog OLD WCSUSERS FORMAT WCSusers exist
    	// get the WCSusers -> WCSuserdata stuff
	    es_keygetvalue wcs_race WCSusers server_var(wcs_id) race
	    es_keygetvalue wcs_lastplayed WCSusers server_var(wcs_id) lastplayed
	    es_keygetvalue wcs_numberofskills WCSraces server_var(wcs_race) numberofskills
      // convert the old version
      es_xset wcs_convtmp 0
      // step 1: rename to a temporary key, and save the old values in a clean new
      es_keyrename WCSusers server_var(wcs_id) convtmp
      // step 2: check each race, and convert the level/xp/skills (unused is dropped)
      es_xset wcs_counter 1
      es_xset wcs_convskill 0
      es_xset wcs_convlevel 0
      es_xset wcs_convxp 0
      es_xset wcs_convnumber 0
      es_xset wcs_convtmp1 0
      es_xset wcs_convtmp2 0
      // calc total level
	    es_xset wcs_total_level 0
	    es_xset wcs_max_level 0
 	    //alias wcs_calctotallevel "es_keygetvalue wcs_tmp WCSusers convtmp server_var(wcs_val);es_token wcs_tmp server_var(wcs_tmp) 1 |;es_math wcs_total_level + server_var(wcs_tmp);if (server_var(wcs_tmp) > server_var(wcs_max_level)) then es_xset wcs_max_level server_var(wcs_tmp)"
      //es_xforeachval wcs_val in WCSusers convtmp "if (race_ in server_var(wcs_val)) then wcs_calctotallevel"
      while "server_var(wcs_counter) <= server_var(wcs_numberofraces)" "es_xformatv wcs_racef race_%1 wcs_counter;es_keygetvalue wcs_convtmp1 WCSusers convtmp server_var(wcs_racef);if (server_var(wcs_convtmp1) = 0) then es_xdoblock wcs/WCSfunctions/wcs_convertdb_v1;if (server_var(wcs_convtmp1) != 0) then es_xdoblock wcs/WCSfunctions/wcs_convertdb_v2;es_xmath wcs_counter + 1"
	    
	    // step 3: clean up the temporary key
	    es_xkeydelete WCSusers convtmp
	    
	    // insert stuff in SQLite
	    es_xformatv wcs_tmp2 "%1" wcs_total_level
      es_xformatqv wcs_q "INSERT OR REPLACE INTO `WCSusers` (`id`, `race`, `level`, `xp`, `skills`) VALUES ('%1', '_wcs_', '%2', '%3', '%4')" wcs_id wcs_race wcs_lastplayed wcs_tmp2
	   	es_sql query wcsdata tmp server_var(wcs_q)
	  }
wcs_debuglog parsing new SQLite format!!!!
		// new SQLite format
	  // WCSusers (id TEXT PRIMARY KEY NOT NULL, race TEXT KEY NOT NULL, level NUMERIC DEFAULT 0, xp NUMERIC DEFAULT 0, skills TEXT NOT NULL)
		// STEAM, _wcs_, LAST RACE, LASTPLAYED, PLAYERDATA=totallevel|unused|language?
		// check if getting all data
		ifx true(wcs_params) do
		{
			// get lastrace and total level
			es_xkeygroupcreate tmp
			es_xformatqv wcs_q "SELECT level, skills FROM `WCSusers` WHERE `id`  = '%1' AND `race` = '_wcs_'" wcs_id
			es_sql query wcsdata tmp server_var(wcs_q)
es wcs_debuglog SQLiQUERY: server_var(wcs_q)
			es_xset wcs_race 0
			es_xset wcs_total_level 0
      es_xset wcs_max_level 0
			es_xexists ex key tmp 1
    	ifx true(ex) do
    	{
        es_xset wcs_tmp1 0
				es_xforeachkey wcs_key in tmp "es_xmath wcs_tmp1 + 1"
        if (server_var(wcs_tmp1) != 1) then wcs_debuglog ERROR in getting a result, should be exactly 1, is server_var(wcs_tmp1)
				es_xkeygetvalue wcs_race tmp 1 level
es echo rasse ist server_var(wcs_race) !!!!!!!!!
				es_xkeygetvalue wcs_tmp tmp 1 skills
				es_token wcs_total_level server_var(wcs_tmp) 1 "|"
			}
			else do
			{
				wcs_debuglog ERROR: SQLite record missing!
			}
      es_xkeygroupdelete tmp
      // recalculate total level
      es_xkeygroupcreate tmp
      es_xformatqv wcs_q "SELECT level, race FROM `WCSusers` WHERE `id`  = '%1' and `race` != '_wcs_'" wcs_id
			es_sql query wcsdata tmp server_var(wcs_q)
es wcs_debuglog SQLiQUERY: server_var(wcs_q)
      es_xset wcs_tmp 0
      es_xset wcs_tmp2 0
      es_xforeachkey wcs_key in tmp "es_keygetvalue wcs_tmp1 tmp server_var(wcs_key) level;es_math wcs_tmp + server_var(wcs_tmp1);if (server_var(wcs_tmp1) > server_var(wcs_tmp2)) then es_xcopy wcs_tmp2 wcs_tmp1;es_keygetvalue wcs_raceid tmp server_var(wcs_key) race;es_xformatv wcs_racename rl_%1 wcs_raceid;es_keysetvalue WCSuserdata server_var(wcs_uid) server_var(wcs_racename) server_var(wcs_tmp1)"
      if (server_var(wcs_tmp) != server_var(wcs_total_level)) do
      {
        es wcs_debuglog WARNING TOTAL LEVEL CALCULATION MISTAKE! server_var(wcs_tmp) != server_var(wcs_total_level)
        es_xcopy wcs_total_level wcs_tmp
      }
      if (server_var(wcs_tmp2) != server_var(wcs_max_level)) do
      {
        es wcs_debuglog WARNING MAX LEVEL CALCULATION MISTAKE! server_var(wcs_tmp2) != server_var(wcs_max_level)
        es_xcopy wcs_max_level wcs_tmp2
      }
      es_xkeygroupdelete tmp
		}
		else do
		{
			// the data should already exist in WCSuserdata
			es_keygetvalue wcs_race WCSuserdata server_var(wcs_uid) "race"
			es_keygetvalue wcs_total_level WCSuserdata server_var(wcs_uid) "total_level"
			es_keygetvalue wcs_unused WCSuserdata server_var(wcs_uid) "unused"
		}
		// get level, xp and skills for current race
    es_xkeygroupcreate tmp
    es_xformatqv wcs_q "SELECT level, xp, skills FROM `WCSusers` WHERE `id`  = '%1' AND `race` = '%2'" wcs_id wcs_race
    es_sql query wcsdata tmp server_var(wcs_q)
es wcs_debuglog SQLiQUERY: server_var(wcs_q)
    es_xset wcs_level 0
    es_xset wcs_xp 0
   	es_xset wcs_skill 0
    es_xexists ex key tmp 1
    ifx true(ex) do
    {
    	es_xforeachkey wcs_key in tmp "wcs_debuglog SQL result found!"
    	es_xkeygetvalue wcs_tmp tmp 1 level
    	es_xcopy wcs_level wcs_tmp
    	es_xkeygetvalue wcs_tmp tmp 1 xp
    	es_xcopy wcs_xp wcs_tmp
    	es_xkeygetvalue wcs_tmp tmp 1 skills
    	es_xcopy wcs_skill wcs_tmp
    }
    else do
    {
    	wcs_debuglog Notice: SQLite record missing. New player record
    }
    es_xkeygroupdelete tmp
    es_keygetvalue wcs_numberofskills "WCSraces" server_var(wcs_race) "numberofskills"
    // if the record is empty (new race) init with 0
	  if (server_var(wcs_skill) = "0") do
	  {
	    es_xset wcs_counter 1
	    while "server_var(wcs_counter) <= server_var(wcs_numberofskills)" "if (server_var(wcs_counter) = 1) then es_xformat wcs_skill 0;if (server_var(wcs_counter) != 1) then es_xformat wcs_skill %1|0 server_var(wcs_skill);es_xmath wcs_counter + 1"
	  }
    // insert the skill levels
    es_xset wcs_counter 1
	  es_xset wcs_skilllevel 0
	  while "server_var(wcs_counter) <= server_var(wcs_numberofskills)" "es_xset wcs_tmp 0;es_format wcs_skillnumber skill_%1 server_var(wcs_counter);es_token wcs_tmp server_var(wcs_skill) server_var(wcs_counter) |;if(server_var(wcs_tmp) = 0) then es_xset wcs_tmp 0;es_keysetvalue WCSuserdata server_var(wcs_uid) server_var(wcs_skillnumber) server_var(wcs_tmp);es_xmath wcs_counter + 1;es_math wcs_skilllevel + server_var(wcs_tmp)"
	  // calculate unused
   	es_xset wcs_unused 0
    if (server_var(wcs_level) > server_var(wcs_skilllevel)) do
    {
	    es_xcopy wcs_unused wcs_level
    	es_math wcs_unused - server_var(wcs_skilllevel)
    }

es wcs_debuglog GOT: race server_var(wcs_race) level server_var(wcs_level) skills server_var(wcs_skill) xp server_var(wcs_xp) unused server_var(wcs_unused)

    es_keysetvalue WCSuserdata server_var(wcs_uid) race server_var(wcs_race)
    es_keysetvalue WCSuserdata server_var(wcs_uid) level server_var(wcs_level)
    es_keysetvalue WCSuserdata server_var(wcs_uid) xp server_var(wcs_xp)
    es_keysetvalue WCSuserdata server_var(wcs_uid) unused server_var(wcs_unused)
    if (server_var(wcs_cfg_globallevel) = "0") then es_xkeysetvalue WCSuserdata server_var(wcs_uid) total_level server_var(wcs_total_level)
    if (server_var(wcs_cfg_globallevel) = "1") do
    {
      es_keysetvalue WCSuserdata server_var(wcs_uid) level server_var(wcs_max_level)
      es_keysetvalue WCSuserdata server_var(wcs_uid) total_level server_var(wcs_max_level)
    }
  }
if (server_var(wcs_debug) = 1) then profile end getplayer
}

block wcs_convertdb_v1
{
	// convert the VERY OLD user record
	//  "STEAM_0:1:9632745"
	//  {
	//    "race"    "2"
	//    "lastplayed"    "1174434179"
	//    "level_1"    "0"
	//    "xp_1"    "0"
	//    "unused_1"    "0"
	//    "race1_skill1"    "0"
	//    "race1_skill2"    "0"
	//    "race1_skill3"    "0"
	//    "race1_skill4"    "0"
	//    "level_4"    "11"
	//    "xp_4"    "680"
	//    "unused_4"    "0"
	//    "race4_skill1"    "8"
	//    "race4_skill2"    "1"
	//    "race4_skill3"    "0"
	//    "race4_skill4"    "2"
	//    "race_2"    "3|21|2|0|0|0"
	//  }
  // race = wcs_counter, key is convtmp, steamid is wcs_id, wcs_convskill, wcs_convlevel, wcs_convxp
  // level
  es_xformatv wcs_tmp1 "level_%1" wcs_counter
  es_keygetvalue wcs_convlevel WCSusers convtmp server_var(wcs_tmp1)
  // xp
  es_xformatv wcs_tmp1 "xp_%1" wcs_counter
  es_keygetvalue wcs_convxp WCSusers convtmp server_var(wcs_tmp1)
  if (server_var(wcs_convlevel) != "0") do
  {
    // skills
    es_keygetvalue wcs_convnumber WCSraces server_var(wcs_counter) numberofskills
    es_xset wcs_convcounter 1
    while "server_var(wcs_convcounter) <= server_var(wcs_convnumber)" "es_xformatv wcs_convskill race%1_skill%2 wcs_counter wcs_convcounter;es_keygetvalue wcs_convskill WCSusers convtmp server_var(wcs_convskill);if (server_var(wcs_convskill) = 0) then es_xset wcs_convskill 0;if (server_var(wcs_convcounter) = 1) then es_xformatv wcs_tmp2 %1 wcs_convskill;if (server_var(wcs_convcounter) != 1) then es_xformatv wcs_tmp2 %1|%2 wcs_tmp2 wcs_convskill;es_xmath wcs_convcounter + 1"
    es_xformatqv wcs_query "INSERT OR REPLACE INTO `WCSusers` (`id`, `race`, `level`, `xp`, `skills`) VALUES ('%1', '%2', '%3', '%4', '%5')" wcs_id wcs_counter wcs_convlevel wcs_convxp wcs_tmp2
es wcs_debuglog OLDRECORD_v1 SQLiQUERY: server_var(wcs_query)
    es_sql query wcsdata server_var(wcs_query)
    es_math wcs_total_level + server_var(wcs_convlevel);
    if (server_var(wcs_convlevel) > server_var(wcs_max_level)) then es_xset wcs_max_level server_var(wcs_convlevel)
  }
}

block wcs_convertdb_v2
{
	// convert the old user record
	//  "STEAM_0:1:9632745"
	//  {
	//    "race"    "2"
	//    "lastplayed"    "1174434179"
	//    "race_4"    "16|1037|8|0|0|8"
	//    "race_2"    "3|21|2|0|0|0"
	//  }
  // race = wcs_counter, key is convtmp, steamid is wcs_id, wcs_convskill, wcs_convlevel, wcs_convxp
  // level and xp
	es_token wcs_convlevel server_var(wcs_convtmp1) 1 "|"
	es_token wcs_convxp server_var(wcs_convtmp1) 2 "|"
  if (server_var(wcs_convlevel) != "0") do
  {
    // skills
    es_keygetvalue wcs_convnumber WCSraces server_var(wcs_counter) numberofskills
    es_xset wcs_convcounter 1
    while "server_var(wcs_convcounter) <= server_var(wcs_convnumber)" "es_xset wcs_convskill 0;es_xcopy wcs_scounter wcs_convcounter;es_xmath wcs_scounter + 2;es_token wcs_convskill server_var(wcs_convtmp1) server_var(wcs_scounter) |;if (server_var(wcs_convskill) = 0) then es_xset wcs_convskill 0;if (server_var(wcs_convcounter) = 1) then es_xformatv wcs_tmp2 %1 wcs_convskill;if (server_var(wcs_convcounter) != 1) then es_xformatv wcs_tmp2 %1|%2 wcs_tmp2 wcs_convskill;es_xmath wcs_convcounter + 1"
    es_formatqv wcs_query "INSERT OR REPLACE INTO `WCSusers` (`id`, `race`, `level`, `xp`, `skills`) VALUES ('%1', '%2', '%3', '%4', '%5')" wcs_id wcs_counter wcs_convlevel wcs_convxp wcs_tmp2
es wcs_debuglog OLDRECORD_v2 SQLiQUERY: server_var(wcs_query)
    es_sql query wcsdata server_var(wcs_query)
    es_math wcs_total_level + server_var(wcs_convlevel);
    if (server_var(wcs_convlevel) > server_var(wcs_max_level)) then es_xset wcs_max_level server_var(wcs_convlevel)
  }
}

block wcs_feedback
{
  es_xgetcmduserid wcs_uid
  es_xgetargs wcs_text
  if (server_var(wcs_text) != "0") do
  {
    es_getplayername wcs_name server_var(wcs_uid)
    es_exists ex key "WCSfeedback" server_var(wcs_name)
    if (server_var(ex) = "0") then es_xkeycreate "WCSfeedback" server_var(wcs_name)
    es_keygetvalue wcs_tmp1 "WCSfeedback" server_var(wcs_name) "number"
    if (server_var(wcs_tmp1) = "0") then es_xset wcs_tmp1 "0"
    es_xmath wcs_tmp1 + 1
    es_keysetvalue "WCSfeedback" server_var(wcs_name) "number" server_var(wcs_tmp1)
    es_keysetvalue "WCSfeedback" server_var(wcs_name) server_var(wcs_tmp1) server_var(wcs_text)
    wcs_getlanguage "wcs_lng" "wcs_lng_feedback"
    es_tell server_var(wcs_uid) #multi server_var(wcs_lng)
    es_xkeygroupsave "WCSfeedback" "|wcs"
  }
  es_xelse do
  {
    wcs_getlanguage "wcs_lng" "wcs_lng_feedbackfailed"
    es_tell server_var(wcs_uid) #multi server_var(wcs_lng)
  }
}

block wcs_savexp
{
  es_xgetcmduserid wcs_userid
  wcs_getlanguage wcs_lng wcs_lng_savexp
  es_tell server_var(wcs_userid) #multi server_var(wcs_lng)
  es wcs_saveplayer server_var(wcs_userid)
}

block wcs_wcsmenu
{
  es_xgetcmduserid wcs_userid
  es_exists ex userid server_var(wcs_userid)
  ifx true(ex) do
  {
    es wcs_menuzero server_var(wcs_userid)
    es_keysetvalue WCSuserdata server_var(wcs_userid) menu wcsmenu
    wcs_getlanguage wcs_lng wcs_lng_wcsmenu
    es_menu 0 server_var(wcs_userid) server_var(wcs_lng)
  }
}

block wcs_wcsmenu_handle
{
  if (event_var(commandstring) = "1") then wcs_shopmenu event_var(userid)
  if (event_var(commandstring) = "2") then wcs_showshopinfo event_var(userid)
  if (event_var(commandstring) = "3") then wcs_showskills event_var(userid)
  if (event_var(commandstring) = "4") then wcs_resetskills event_var(userid)
  if (event_var(commandstring) = "5") then wcs_spendskills event_var(userid)
  if (event_var(commandstring) = "6") then wcs_race_menu event_var(userid)
  if (event_var(commandstring) = "7") then wcs_showraceinfo event_var(userid)
  if (event_var(commandstring) = "8") then wcs_showplayerinfo event_var(userid)
  if (event_var(commandstring) = "9") then wcs_showtop10 event_var(userid)
}

block wcs_notice
{
	es_xgetargv wcs_userid 1
	es_xgetargv wcs_text 2
	es_xusermsg create notice HintText
	es_xusermsg write byte notice 1
	es_usermsg write string notice server_var(wcs_text)
	es_usermsg send notice server_var(wcs_userid) 0
	es_xusermsg delete notice
}

block wcs_debuglog
{
  es_xgetargs wcs_log
  if (server_var(wcs_debug) = 1) then es_xlog [WCS]: server_var(wcs_log)
  if (server_var(wcs_debug) = 2) then echo [WCS]: server_var(wcs_log)
  if (server_var(wcs_debug) = 3) then es_xmsg #multi #green[WCS]:#lightgreen server_var(wcs_log)
}
