block load
{
  // Define variables used by funeffects
  es_xset fe_exists 0
  es_xset fe_argc 0
  es_xset fe_arg1 0
  es_xset fe_arg2 0
  es_xset fe_arg3 0
  es_xset fe_arg4 0
  es_xset fe_arg5 0
  es_xset fe_userid 0
  es_xset fe_name 0
  es_xset fe_display 0
  es_xset fe_description 0
  es_xset fe_effect 0
  es_xset fe_current 0
  es_xset fe_type 0
  es_xset fe_menu 0
  es_xset fe_page 0
  es_xset fe_slot 0
  es_xset fe_page2 0
  es_xset fe_slot2 0
  es_xset fe_format 0
  es_xset fe_allowedkeys 0
  es_xset fe_x 0
  es_xset fe_y 0
  es_xset fe_z 0
  es_xset fe_temp1 0
  es_xset fe_temp2 0
  es_xset fe_temp3 0
  // fe_ent variables
  es_xset fe_ent_format 0
  es_xset fe_ent_origin 0
  es_xset fe_ent_argc 0
  es_xset fe_ent_arg 0
  es_xset fe_ent_argument 0
  es_xset fe_ent_keyvalue 0
  es_xset fe_ent_id 0
  es_xset fe_ent_parent 0
  es_xset fe_ent_keyval 0
  es_xset fe_ent_x 0
  es_xset fe_ent_y 0
  es_xset fe_ent_z 0
  es_xset fe_ent_temp1 0
  es_xset fe_ent_temp2 0
  // Load effect database
  es_xkeygroupload funeffects |funeffects
  // Load entity database
  es_xkeygroupload funentities |funeffects
  es_xforeachkey fe_temp1 in funentities "es keyfilter funentities server_var(fe_temp1) not activateent 0"
  // Prep effect database
  es_xset fe_page 1
  es_xset fe_slot 0
  es_set fe_main_pagec 0
  es_xforeachkey fe_temp1 in funeffects "es_xdoblock funeffects/effects"
  // Create internal commands
  es_exists fe_exists command fe_ent
  ifx false(fe_exists) do
  {
    es_xset fe_entcounter 0
    es_xregcmd fe_ent funeffects/ent "fe_ent <create/delete> <name> <entity> <userid> [params]"
  }
  // Make public
  es_xsetinfo fe_version "1.0.0"
  es_xmakepublic fe_version
  // Create keygroup for tracking entities'
  es_xkeygroupcreate fe_enttracking
  // Announce load
  echo [FunEffects] Loaded
  es_msg #multi #lightgreen[FunEffects] #greenLoaded
  // Restart round (to spawn everybody)
  mp_restartgame 2
}

block unload
{
  // Delete entites created by funeffects
  es_xforeachkey fe_temp1 in fe_enttracking "es_xdoblock funeffects/entdelete"
  // Reset entcounter
  es_xset fe_entcounter 0
  // Delete databases
  keygroupremove fe_enttracking
  keygroupremove funentities
  keygroupremove funeffects
  // Announce unload
  echo [FunEffects] Unloaded
}

block entdelete
{
  es_foreachval fe_temp2 in fe_enttracking server_var(fe_temp1) "es_xdoblock funeffects/remove"
}

block remove
{
  es_keygetvalue fe_temp3 fe_enttracking server_var(fe_temp1) server_var(fe_temp2)
  ifx true(fe_temp3) do
  {
    es_remove server_var(fe_temp3)
  }
}

event player_activate
{
  es playervar set event_var(userid) fe_menu 0
  es playervar set event_var(userid) fe_page 0
  es playervar set event_var(userid) fe_effect 0
  es playervar set event_var(userid) fe_lastmenu 0
  es playervar set event_var(userid) fe_lastpage 0
  es playervar set event_var(userid) fe_lasteffect 0
}

event player_spawn
{
  es_xkeygroupcopy funeffects fe_templist
  es_xkeygroupfilter fe_templist only type toggle
  es_xforeachkey fe_temp1 in fe_templist "es playervar set event_var(userid) server_var(fe_temp1) 0"
  es_xkeygroupdelete fe_templist
  // Remove last rounds ent indexes
  es_exists fe_exists key fe_enttracking event_var(userid)
  ifx true(fe_exists) do
  {
    es_keydelete fe_enttracking event_var(userid)
  }
  // Stop laser loop
  es_format fe_format "fe_laser%1" event_var(userid)
  es repeat status fe_exists server_var(fe_format)
  ifx true(fe_exists) do
  {
    es repeat delete server_var(fe_format)
  }
  // Set targetname
  es_format fe_format "targetname fe_playerid%1" event_var(userid)
  es_fire event_var(userid) !self addoutput server_var(fe_format)
}

event player_death
{
  es_format fe_format "fe_laser%1" event_var(userid)
  es repeat status fe_exists server_var(fe_format)
  ifx true(fe_exists) do
  {
    es repeat delete server_var(fe_format)
  }
}

event round_start
{
  es_xset fe_entcounter 0
}

event player_say
{
  if (event_var(text) = effects) do
  {
    es :auth isUseridAuthorized fe_temp1 event_var(userid) "fe_open_menu"
    ifx true(fe_temp1) do
    {
      es_xdoblock funeffects/menu_main
    }
    else do
    {
      es_tell event_var(userid) #multi #green[FunEffects] #lightgreenYou are not authorized to use this command.
    }
  }
}

event es_client_command
{
  if (event_var(command) = menuselect) do
  {
    es playervar get fe_menu event_var(userid) fe_menu
    if (server_var(fe_menu) = main) do
    {
      es_xdoblock funeffects/menu_main_handle
    }
    if (server_var(fe_menu) = subeffect) do
    {
      es_xdoblock funeffects/menu_subeffect_handle
    }
    if (server_var(fe_menu) = players) do
    {
      es_xdoblock funeffects/menu_players_handle
    }
  }
}

// Main menu

block menu_main
{
  es playervar set event_var(userid) fe_menu main
  es playervar set event_var(userid) fe_page 1
  es_xdoblock funeffects/menu_main_build
}

block menu_main_build
{
  es playervar get fe_page event_var(userid) fe_page
  es_xkeygroupcopy funeffects fe_templist
  es_keygroupfilter fe_templist only pagenumb server_var(fe_page)
  es_xset fe_allowedkeys "0"
  es_xformat fe_format "Fun Effects - Main Menu\nChoose an action to do to perform on a player\n "
  es_xforeachkey fe_temp1 in fe_templist "es_xdoblock funeffects/construct_main_menu"
  es_xkeygroupdelete fe_templist
  if (server_var(fe_page) > 1) do
  {
    es_xformatv fe_format "%1\n8. Back" fe_format
    es_xformatv fe_allowedkeys "%18" fe_allowedkeys
  }
  if (server_var(fe_page) < server_var(fe_main_pagec)) do
  {
    es_xformatv fe_format "%1\n9. Next" fe_format
    es_xformatv fe_allowedkeys "%19" fe_allowedkeys
  }
  es_xformatv fe_format "%1\n0. Exit" fe_format
  es_xformatv fe_allowedkeys "%10" fe_allowedkeys
  es_menu 0 event_var(userid) server_var(fe_format) server_var(fe_allowedkeys)
}

block construct_main_menu
{
  es_exists fe_exists keyvalue fe_templist server_var(fe_temp1) submenu
  ifx false(fe_exists) do
  {
    es_keygetvalue fe_slot funeffects server_var(fe_temp1) slot
    es_keygetvalue fe_display funeffects server_var(fe_temp1) display
    es_xformatv fe_allowedkeys "%1%2" fe_allowedkeys fe_slot
    es_xformatv fe_format "%1\n->%2. %3" fe_format fe_slot fe_display
  }
}

block menu_main_handle
{
  es playervar get fe_page event_var(userid) fe_page
  if (event_var(commandstring) < 8) do
  {
    es_xkeygroupcopy funeffects fe_templist
    es_keygroupfilter fe_templist only pagenumb server_var(fe_page)
    es_keygroupfilter fe_templist only slot event_var(commandstring)
    es_xforeachkey fe_temp1 in fe_templist "es_xdoblock funeffects/seteffect"
    es_xkeygroupdelete fe_templist
    es playervar set event_var(userid) fe_lastmenu main
    es playervar set event_var(userid) fe_lastpage server_var(fe_page)
    es_keygetvalue fe_type funeffects server_var(fe_effect) type
    if (server_var(fe_type) = submenu) do
    {
      es playervar set event_var(userid) fe_menu subeffect
      es playervar set event_var(userid) fe_page 1
      es playervar set event_var(userid) fe_effect server_var(fe_effect)
      es_xdoblock funeffects/menu_subeffect_build
    }
    else do
    {
      es playervar set event_var(userid) fe_menu players
      es playervar set event_var(userid) fe_page 1
      es playervar set event_var(userid) fe_effect server_var(fe_effect)
      es_xdoblock funeffects/menu_players_build
    }
    es_playsound event_var(userid) buttons/button9.wav 1.0
  }
  else do
  {
    if (event_var(commandstring) = 8) do
    {
      es_xmath fe_page - 1
      es playervar set event_var(userid) fe_page server_var(fe_page)
      es_xdoblock funeffects/menu_main_build
      es_playsound event_var(userid) buttons/button9.wav 1.0
    }
    if (event_var(commandstring) = 9) do
    {
      es_xmath fe_page + 1
      es playervar set event_var(userid) fe_page server_var(fe_page)
      es_xdoblock funeffects/menu_main_build
      es_playsound event_var(userid) buttons/button9.wav 1.0
    }
    if (event_var(commandstring) = 10) do
    {
      es playervar set event_var(userid) fe_menu 0
      es_playsound event_var(userid) buttons/button19.wav 1.0
    }
  }
}

block seteffect
{
  es_exists fe_exists keyvalue fe_templist server_var(fe_temp1) submenu
  ifx false(fe_exists) do
  {
    es_set fe_effect server_var(fe_temp1)
  }
}

// Submenu

block menu_subeffect_build
{
  es playervar get fe_page event_var(userid) fe_page
  es playervar get fe_effect event_var(userid) fe_effect
  es_keygetvalue fe_display funeffects server_var(fe_effect) display
  es_keygetvalue fe_description funeffects server_var(fe_effect) description
  es_xformatv fe_temp1 "fe_%1_pagec" fe_effect
  es_xkeygroupcopy funeffects fe_templist
  es_keygroupfilter fe_templist only submenu server_var(fe_effect)
  es_keygroupfilter fe_templist only pagenumb server_var(fe_page)
  es_xset fe_allowedkeys "0"
  es_xformatv fe_format "Fun Effects - %1 Description:\n%2\n " fe_display fe_description
  es_xforeachkey fe_temp1 in fe_templist "es_xdoblock funeffects/construct_subeffect_menu"
  es_xkeygroupdelete fe_templist
  es_xformatv fe_format "%1\n8. Back" fe_format
  es_xformatv fe_allowedkeys "%18" fe_allowedkeys
  if (server_var(fe_page) < server_var(server_var(fe_temp1))) do
  {
    es_xformatv fe_format "%1\n9. Next" fe_format
    es_xformatv fe_allowedkeys "%19" fe_allowedkeys
  }
  es_xformatv fe_format "%1\n0. Exit" fe_format
  es_xformatv fe_allowedkeys "%10" fe_allowedkeys
  es_menu 0 event_var(userid) server_var(fe_format) server_var(fe_allowedkeys)
}

block construct_subeffect_menu
{
  es_keygetvalue fe_slot funeffects server_var(fe_temp1) slot
  es_keygetvalue fe_display funeffects server_var(fe_temp1) display
  es_xformatv fe_allowedkeys "%1%2" fe_allowedkeys fe_slot
  es_xformatv fe_format "%1\n->%2. %3" fe_format fe_slot fe_display
}

block menu_subeffect_handle
{
  es playervar get fe_page event_var(userid) fe_page
  if (event_var(commandstring) < 8) do
  {
    es_xkeygroupcopy funeffects fe_templist
    es playervar get fe_effect event_var(userid) fe_effect
    es_keygroupfilter fe_templist only submenu server_var(fe_effect)
    es_keygroupfilter fe_templist only pagenumb server_var(fe_page)
    es_keygroupfilter fe_templist only slot event_var(commandstring)
    es playervar set event_var(userid) fe_lasteffect server_var(fe_effect)
    es_xforeachkey fe_effect in fe_templist "say"
    es_xkeygroupdelete fe_templist
    es playervar set event_var(userid) fe_menu players
    es playervar set event_var(userid) fe_page 1
    es playervar set event_var(userid) fe_effect server_var(fe_effect)
    es playervar set event_var(userid) fe_lastmenu subeffect
    es playervar set event_var(userid) fe_lastpage server_var(fe_page)
    es_xdoblock funeffects/menu_players_build
    es_playsound event_var(userid) buttons/button9.wav 1.0
  }
  else do
  {
    if (event_var(commandstring) = 8) do
    {
      if (server_var(fe_page) > 1) do
      {
        es_xmath fe_page - 1
        es playervar set event_var(userid) fe_page server_var(fe_page)
        es_xdoblock funeffects/menu_subeffect_build
      }
      else do
      {
        es playervar get fe_page event_var(userid) fe_lastpage
        es playervar set event_var(userid) fe_page server_var(fe_page)
        es_xdoblock funeffects/menu_main
      }
      es_playsound event_var(userid) buttons/button9.wav 1.0
    }
    if (event_var(commandstring) = 9) do
    {
      es_xmath fe_page + 1
      es playervar set event_var(userid) fe_page server_var(fe_page)
      es_xdoblock funeffects/menu_subeffect_build
      es_playsound event_var(userid) buttons/button9.wav 1.0
    }
    if (event_var(commandstring) = 10) do
    {
      es playervar set event_var(userid) fe_menu 0
      es_playsound event_var(userid) buttons/button19.wav 1.0
    }
  }
}

// Player menu

block menu_players_build
{
  es playervar get fe_effect event_var(userid) fe_effect
  es_xcreateplayerlist fe_playerlist
  es_xkeygroupfilter fe_playerlist not teamid 1
  es_xkeygroupfilter fe_playerlist not isdead 1
  es_xkeygroupfilter fe_playerlist only isobserver 0
  es_xdoblock funeffects/listupdate
  es playervar get fe_page event_var(userid) fe_page
  es_keygroupfilter fe_playerlist only pagenumb server_var(fe_page)
  es_keygetvalue fe_display funeffects server_var(fe_effect) display
  es_keygetvalue fe_description funeffects server_var(fe_effect) description
  es_xset fe_allowedkeys "0"
  es_xformatv fe_format "Fun Effects - %1 Description:\n%2\n " fe_display fe_description
  es_keygetvalue fe_type funeffects server_var(fe_effect) type
  if (server_var(fe_type) = trigger) do
  {
    es_xforeachkey fe_temp1 in fe_playerlist "es_xdoblock funeffects/construct_players_menu_trigger"
  }
  if (server_var(fe_type) = toggle) do
  {
    es_xforeachkey fe_temp1 in fe_playerlist "es_xdoblock funeffects/construct_players_menu_toggle"
  }
  es_xkeygroupdelete fe_playerlist
  es_xformatv fe_format "%1\n8. Back" fe_format
  es_xformatv fe_allowedkeys "%18" fe_allowedkeys
  if (server_var(fe_page) < server_var(fe_players_pagec)) do
  {
    es_xformatv fe_format "%1\n9. Next" fe_format
    es_xformatv fe_allowedkeys "%19" fe_allowedkeys
  }
  es_xformatv fe_format "%1\n0. Exit" fe_format
  es_xformatv fe_allowedkeys "%10" fe_allowedkeys
  es_menu 0 event_var(userid) server_var(fe_format) server_var(fe_allowedkeys)
}

block construct_players_menu_trigger
{
  es_keygetvalue fe_name fe_playerlist server_var(fe_temp1) name
  es_keygetvalue fe_slot fe_playerlist server_var(fe_temp1) slot
  es_xformatv fe_allowedkeys "%1%2" fe_allowedkeys fe_slot
  es_xformatv fe_format "%1\n->%2. %3" fe_format fe_slot fe_name
}

block construct_players_menu_toggle
{
  es_keygetvalue fe_name fe_playerlist server_var(fe_temp1) name
  es_keygetvalue fe_slot fe_playerlist server_var(fe_temp1) slot
  es playervar get fe_current server_var(fe_temp1) server_var(fe_effect)
  es_xstring fe_current replace "0" "Off"
  es_xstring fe_current replace "1" "On"
  es_xformatv fe_allowedkeys "%1%2" fe_allowedkeys fe_slot
  es_xformatv fe_format "%1\n->%2. %3 [%4]" fe_format fe_slot fe_name fe_current
}

block menu_players_handle
{
  es playervar get fe_page event_var(userid) fe_page
  if (event_var(commandstring) < 8) do
  {
    es_xset fe_userid 0
    es_xcreateplayerlist fe_playerlist
    es_xkeygroupfilter fe_playerlist not teamid 1
    es_xkeygroupfilter fe_playerlist not isdead 1
    es_xkeygroupfilter fe_playerlist only isobserver 0
    es_xdoblock funeffects/listupdate
    es playervar get fe_page event_var(userid) fe_page
    es_keygroupfilter fe_playerlist only pagenumb server_var(fe_page)
    es_keygroupfilter fe_playerlist only slot event_var(commandstring)
    es_xforeachkey fe_userid in fe_playerlist "say"
    es_xkeygroupdelete fe_playerlist
    es_exists fe_exists userid server_var(fe_userid)
    ifx true(fe_exists) do
    {
      es playervar get fe_effect event_var(userid) fe_effect
      es_keygetvalue fe_type funeffects server_var(fe_effect) type
      if (server_var(fe_type) = trigger) do
      {
        es_xformatv fe_format "funeffects/%1_handle" fe_effect
        es_doblock server_var(fe_format)
      }
      if (server_var(fe_type) = toggle) do
      {
        es playervar get fe_current server_var(fe_userid) server_var(fe_effect)
        ifx true(fe_current) do
        {
          es playervar set server_var(fe_userid) server_var(fe_effect) 0
          es_xformatv fe_format "funeffects/%1_handle_off" fe_effect
          es_doblock server_var(fe_format)
        }
        else do
        {
          es playervar set server_var(fe_userid) server_var(fe_effect) 1
          es_xformatv fe_format "funeffects/%1_handle_on" fe_effect
          es_doblock server_var(fe_format)
        }
      }
    }
    es_playsound event_var(userid) buttons/button9.wav 1.0
    es_xdoblock funeffects/menu_players_build
  }
  else do
  {
    if (event_var(commandstring) < 10) do
    {
      if (event_var(commandstring) = 8) do
      {
        if (server_var(fe_page) > 1) do
        {
          es_xmath fe_page - 1
          es playervar set event_var(userid) fe_page server_var(fe_page)
          es_xdoblock funeffects/menu_players_build
          
        }
        else do
        {
          es playervar get fe_page event_var(userid) fe_lastpage
          es playervar get fe_menu event_var(userid) fe_lastmenu
          es playervar get fe_effect event_var(userid) fe_lasteffect
          es playervar set event_var(userid) fe_page server_var(fe_page)
          es playervar set event_var(userid) fe_menu server_var(fe_menu)
          es playervar set event_var(userid) fe_effect server_var(fe_effect)
          es_xformatv fe_format "funeffects/menu_%1_build" fe_menu
          es_doblock server_var(fe_format)
        }
        es_playsound event_var(userid) buttons/button9.wav 1.0
      }
      if (event_var(commandstring) = 9) do
      {
        if (server_var(fe_page) < server_var(fe_players_pagec)) do
        {
          es_xmath fe_page + 1
          es playervar set event_var(userid) fe_page server_var(fe_page)
          es_xdoblock funeffects/menu_players_build
        }
        else do
        {
          es_xdoblock funeffects/menu_players_build
        }
        es_playsound event_var(userid) buttons/button9.wav 1.0
      }
    }
    else do
    {
      es playervar set event_var(userid) fe_menu 0
      es_playsound event_var(userid) buttons/button19.wav 1.0
    }
  }
}

// Laser

block laser_handle_on
{
  es_xformatv fe_format "fe_laser%1" fe_userid
  es repeat create server_var(fe_format) "es_xdoblock funeffects/laser_fire"
  es repeat start server_var(fe_format) 0.00000000001
}

block laser_handle_off
{
  es_xformatv fe_format "fe_laser%1" fe_userid
  es repeat status fe_exists server_var(fe_format)
  ifx true(fe_exists) do
  {
    es repeat delete server_var(fe_format)
  }
}

block laser_fire
{
  es_copy fe_userid _repeat_name
  es_xstring fe_userid replace "fe_laser"
  es_exists fe_exists userid server_var(fe_userid)
  ifx true(fe_exists) do
  {
    es_getplayerprop fe_temp1 server_var(fe_userid) "CCSPlayer.baseclass.pl.deadflag"
    ifx false(fe_temp1) do
    {
      es_getplayerlocation fe_x fe_y fe_z server_var(fe_userid)
      es_xmath fe_z + 65
      es_createvectorstring fe_temp1 server_var(fe_x) server_var(fe_y) server_var(fe_z)
      es playerget viewvector fe_temp2 server_var(fe_userid)
      es vecmath fe_temp2 server_var(fe_temp2) * 1000
      es vecmath fe_temp2 server_var(fe_temp2) + server_var(fe_temp1)
      es_xprecachemodel fe_temp3 "sprites/laserbeam.vmt"
      es_effect beam server_var(fe_temp1) server_var(fe_temp2) server_var(fe_temp3) server_var(fe_temp3) 0 0 0.1 5 10 0.1 1 255 0 0 255 30
    }
    else do
    {
      es repeat delete server_var(_repeat_name)
    }
  }
  else do
  {
    es repeat delete server_var(_repeat_name)
  }
}

// Sparks

block sparks_handle_on
{
  es_xformatv fe_format "fe_sparks%1" fe_userid
  es fe_ent create server_var(fe_format) env_beam server_var(fe_userid) 65 36 0 255 255 255 255 150 0.1 0 5 0.01 20 0
}

block sparks_handle_off
{
  es_xformatv fe_format "fe_sparks%1" fe_userid
  es fe_ent delete server_var(fe_format) env_beam server_var(fe_userid)
}

block dissolvepoof_handle
{
  es_xformatv fe_format "fe_dissolve%1" fe_userid
  // Make unique entity targetname
  es_xmath fe_entcounter + 1
  es_xformatv fe_temp1 "fe_entid%1" fe_entcounter
  // Set entity name
  es_entsetname server_var(fe_userid) server_var(fe_temp1)
  es_fire server_var(fe_userid) server_var(fe_temp1) kill
}

block dissolveelectric_handle
{
  es_xformatv fe_format "fe_dissolve%1" fe_userid
  // Make unique entity targetname
  es_xmath fe_entcounter + 1
  es_xformatv fe_temp1 "fe_entid%1" fe_entcounter
  // Set entity name
  es_entsetname server_var(fe_userid) server_var(fe_temp1)
  es fe_ent create server_var(fe_format) env_entity_dissolver server_var(fe_userid) 40 server_var(fe_temp1) 50 1
  es_delayed 0.01 fe_ent delete server_var(fe_format) env_entity_dissolver server_var(fe_userid)
}

block dissolvecore_handle
{
  es_xformatv fe_format "fe_dissolve%1" fe_userid
  // Make unique entity targetname
  es_xmath fe_entcounter + 1
  es_xformatv fe_temp1 "fe_entid%1" fe_entcounter
  // Set entity name
  es_entsetname server_var(fe_userid) server_var(fe_temp1)
  es fe_ent create server_var(fe_format) env_entity_dissolver server_var(fe_userid) 40 server_var(fe_temp1) 50 3
  es_delayed 0.01 fe_ent delete server_var(fe_format) env_entity_dissolver server_var(fe_userid)
}

// Implode

block implode_handle
{
  es_delayed 1.5 es_xset fe_userid server_var(fe_userid)
  es_setplayerprop server_var(fe_userid) CCSPlayer.baseclass.baseclass.baseclass.baseclass.baseclass.baseclass.movetype 0
  es_xformatv fe_format "fe_implodeorb%1" fe_userid
  es fe_ent create server_var(fe_format) env_lightglow server_var(fe_userid) 40 255 255 255 75 75 0 75 2000 60
  es_delayed 2 fe_ent delete server_var(fe_format) env_lightglow server_var(fe_userid)
  es_xformatv fe_format "fe_tesla%1" fe_userid
  es fe_ent create server_var(fe_format) point_tesla server_var(fe_userid) 40 weapons/stunstick/spark1.wav 255 255 255 200 60 70 30.0 50.0 3 3 1 1
  es_delayed 3 fe_ent delete server_var(fe_format) point_tesla server_var(fe_userid)
  es_emitsound player server_var(fe_userid) ambient/energy/whiteflash.wav 1.0 0.0
  es_xdelayed 1.5 es_xdoblock funeffects/implode
}

block implode
{
  es_xset fe_implode_size 100
  es_emitsound player server_var(fe_userid) ambient/explosions/explode_5.wav 1.0 0.0
  es_delayed 0.5 es_xsexec server_var(fe_userid) kill
  es_xformatv fe_format "fe_implodegrow%1" fe_userid
  es repeat create server_var(fe_format) "es_xdoblock funeffects/implode_exp"
  es repeat start server_var(fe_format) 0.01 10
}

block implode_exp
{
  es_copy fe_userid _repeat_name
  es_xstring fe_userid replace "fe_implodegrow"
  es_exists fe_exists userid server_var(fe_userid)
  ifx true(fe_exists) do
  {
    es_getplayerprop fe_temp1 server_var(fe_userid) "CCSPlayer.baseclass.pl.deadflag"
    ifx false(fe_temp1) do
    {
      es_xmath fe_implode_size + 10
      es_xformatv fe_format "fe_implodeexp%1" fe_implode_size
      es fe_ent create server_var(fe_format) env_lightglow server_var(fe_userid) 40 255 255 255 server_var(fe_implode_size) server_var(fe_implode_size) 0 75 2000 60
      es_delayed 1 fe_ent delete server_var(fe_format) env_lightglow server_var(fe_userid)
      if (server_var(_repeat_count) = 10) do
      {
        es repeat delete server_var(_repeat_name)
      }
    }
    else do
    {
      es repeat delete server_var(_repeat_name)
    }
  }
  else do
  {
    es repeat delete server_var(_repeat_name)
  }
}

// Implode (Rise)

block imploderise_handle
{
  es_setplayerprop server_var(fe_userid) CCSPlayer.baseclass.baseclass.baseclass.baseclass.baseclass.baseclass.movetype 0
  es_xformatv fe_format "fe_implodeorb%1" fe_userid
  es fe_ent create server_var(fe_format) env_lightglow server_var(fe_userid) 40 255 255 255 75 75 0 75 2000 60
  es_delayed 5 fe_ent delete server_var(fe_format) env_lightglow server_var(fe_userid)
  es_xformatv fe_format "fe_imploderise%1" fe_userid
  es repeat create server_var(fe_format) "es_xdoblock funeffects/implode_rise"
  es repeat start server_var(fe_format) 0.02 30
}

block implode_rise
{
  es_copy fe_userid _repeat_name
  es_xstring fe_userid replace "fe_imploderise"
  es_exists fe_exists userid server_var(fe_userid)
  ifx true(fe_exists) do
  {
    es_getplayerprop fe_temp1 server_var(fe_userid) "CCSPlayer.baseclass.pl.deadflag"
    ifx false(fe_temp1) do
    {
      es_getplayerlocation fe_x fe_y fe_z server_var(fe_userid)
      es_xmath fe_z + 4
      es_setpos server_var(fe_userid) server_var(fe_x) server_var(fe_y) server_var(fe_z)
      if (server_var(_repeat_count) = 15) do
      {
        es_emitsound player server_var(fe_userid) ambient/energy/whiteflash.wav 1.0 0.0
        es_xformatv fe_format "fe_tesla%1" fe_userid
        es fe_ent create server_var(fe_format) point_tesla server_var(fe_userid) 125 weapons/stunstick/spark1.wav 255 255 255 200 60 70 30.0 50.0 2 2 1 1
        es_delayed 2 fe_ent delete server_var(fe_format) point_tesla server_var(fe_userid)
      }
      if (server_var(_repeat_count) = 30) do
      {
        es repeat delete server_var(_repeat_name)
        es_xdoblock funeffects/imploderise
      }
    }
    else do
    {
      es repeat delete server_var(_repeat_name)
    }
  }
  else do
  {
    es repeat delete server_var(_repeat_name)
  }
}

block imploderise
{
  es_xset fe_implode_size 100
  es_emitsound player server_var(fe_userid) ambient/explosions/explode_5.wav 1.0 0.0
  es_delayed 0.5 es_xsexec server_var(fe_userid) kill
  es_xformatv fe_format "fe_implodegrow%1" fe_userid
  es repeat create server_var(fe_format) "es_xdoblock funeffects/imploderise_exp"
  es repeat start server_var(fe_format) 0.01 10
}

block imploderise_exp
{
  es_copy fe_userid _repeat_name
  es_xstring fe_userid replace "fe_implodegrow"
  es_exists fe_exists userid server_var(fe_userid)
  ifx true(fe_exists) do
  {
    es_getplayerprop fe_temp1 server_var(fe_userid) "CCSPlayer.baseclass.pl.deadflag"
    ifx false(fe_temp1) do
    {
      es_xmath fe_implode_size + 10
      es_xformatv fe_format "fe_implodeexp%1" fe_implode_size
      es fe_ent create server_var(fe_format) env_lightglow server_var(fe_userid) 40 255 255 255 server_var(fe_implode_size) server_var(fe_implode_size) 0 75 2000 60
      es_delayed 1 fe_ent delete server_var(fe_format) env_lightglow server_var(fe_userid)
      if (server_var(_repeat_count) = 10) do
      {
        es repeat delete server_var(_repeat_name)
      }
    }
    else do
    {
      es repeat delete server_var(_repeat_name)
    }
  }
  else do
  {
    es repeat delete server_var(_repeat_name)
  }
}

// Explode

block explode_handle
{
  es_sexec server_var(fe_userid) kill
  es_getplayerlocation fe_x fe_y fe_z server_var(fe_userid)
  es_xformatv fe_temp1 "origin %1 %2 %3" fe_x fe_y fe_z
  es_give server_var(fe_userid) env_blood
  es_give server_var(fe_userid) env_explosion
  es_emitsound entity server_var(eventscripts_lastgive) ambient/explosions/explode_5.wav 1.0 0.0
  es_fire server_var(fe_userid) env_blood addoutput "color 0"
  es_fire server_var(fe_userid) env_blood addoutput "amount 500"
  es_fire server_var(fe_userid) env_blood addoutput "spawnflags 9"
  es_fire server_var(fe_userid) env_explosion addoutput server_var(fe_temp1)
  es_fire server_var(fe_userid) env_explosion addoutput "spawnflags 1"
  es_fire server_var(fe_userid) env_explosion Explode
  es_fire server_var(fe_userid) env_blood EmitBlood
  es_fire server_var(fe_userid) env_blood EmitBlood
  es_fire server_var(fe_userid) env_blood EmitBlood
  es_fire server_var(fe_userid) env_blood EmitBlood
  es_fire server_var(fe_userid) env_blood EmitBlood
  es_fire server_var(fe_userid) env_explosion kill
  es_fire server_var(fe_userid) env_blood kill
}

// Explode (No Sound)

block explodens_handle
{
  es_sexec server_var(fe_userid) kill
  es_getplayerlocation fe_x fe_y fe_z server_var(fe_userid)
  es_xformatv fe_temp1 "origin %1 %2 %3" fe_x fe_y fe_z
  es_give server_var(fe_userid) env_explosion
  es_give server_var(fe_userid) env_blood
  es_fire server_var(fe_userid) env_explosion addoutput server_var(fe_temp1)
  es_fire server_var(fe_userid) env_explosion addoutput "spawnflags 129"
  es_fire server_var(fe_userid) env_blood addoutput "color 0"
  es_fire server_var(fe_userid) env_blood addoutput "amount 500"
  es_fire server_var(fe_userid) env_blood addoutput "spawnflags 9"
  es_fire server_var(fe_userid) env_explosion Explode
  es_fire server_var(fe_userid) env_blood EmitBlood
  es_fire server_var(fe_userid) env_blood EmitBlood
  es_fire server_var(fe_userid) env_blood EmitBlood
  es_fire server_var(fe_userid) env_blood EmitBlood
  es_fire server_var(fe_userid) env_blood EmitBlood
  es_fire server_var(fe_userid) env_explosion kill
  es_fire server_var(fe_userid) env_blood kill
}

block sunglow_handle_on
{
  es_xformatv fe_format "fe_sunglow1%1" fe_userid
  es fe_ent create server_var(fe_format) env_lightglow server_var(fe_userid) 55 255 255 255 90 90 0 100 5000 60
  es_xformatv fe_format "fe_sunglow2%1" fe_userid
  es fe_ent create server_var(fe_format) env_lightglow server_var(fe_userid) 15 255 255 255 90 90 0 100 5000 60
}

block sunglow_handle_off
{
  es_xformatv fe_format "fe_sunglow1%1" fe_userid
  es fe_ent delete server_var(fe_format) env_lightglow server_var(fe_userid)
  es_xformatv fe_format "fe_sunglow2%1" fe_userid
  es fe_ent delete server_var(fe_format) env_lightglow server_var(fe_userid)
}

block whiteglow_handle_on
{
  es_xformatv fe_format "fe_whiteglow%1" fe_userid
  es fe_ent create server_var(fe_format) env_lightglow server_var(fe_userid) 40 255 255 255 75 75 0 75 5000 60
}

block whiteglow_handle_off
{
  es_xformatv fe_format "fe_whiteglow%1" fe_userid
  es fe_ent delete server_var(fe_format) env_lightglow server_var(fe_userid)
}

block redglow_handle_on
{
  es_xformatv fe_format "fe_redglow%1" fe_userid
  es fe_ent create server_var(fe_format) env_lightglow server_var(fe_userid) 40 255 0 0 75 75 0 75 5000 60
}

block redglow_handle_off
{
  es_xformatv fe_format "fe_redglow%1" fe_userid
  es fe_ent delete server_var(fe_format) env_lightglow server_var(fe_userid)
}

block greenglow_handle_on
{
  es_xformatv fe_format "fe_greenglow%1" fe_userid
  es fe_ent create server_var(fe_format) env_lightglow server_var(fe_userid) 40 0 255 0 75 75 0 75 5000 60
}

block greenglow_handle_off
{
  es_xformatv fe_format "fe_greenglow%1" fe_userid
  es fe_ent delete server_var(fe_format) env_lightglow server_var(fe_userid)
}

block blueglow_handle_on
{
  es_xformatv fe_format "fe_blueglow%1" fe_userid
  es fe_ent create server_var(fe_format) env_lightglow server_var(fe_userid) 40 0 0 255 75 75 0 75 5000 60
}

block blueglow_handle_off
{
  es_xformatv fe_format "fe_blueglow%1" fe_userid
  es fe_ent delete server_var(fe_format) env_lightglow server_var(fe_userid)
}

// Menu prep

block effects
{
  es_exists fe_exists keyvalue funeffects server_var(fe_temp1) submenu
  ifx false(fe_exists) do
  {
    es_xmath fe_slot + 1
    es_keysetvalue funeffects server_var(fe_temp1) slot server_var(fe_slot)
    es_keysetvalue funeffects server_var(fe_temp1) pagenumb server_var(fe_page)
    es_xcopy fe_main_pagec fe_page
    es_keygetvalue fe_type funeffects server_var(fe_temp1) type
    if (server_var(fe_type) = submenu) do
    {
      es_xset fe_page2 1
      es_xset fe_slot2 0
      es_xformatv fe_format "fe_%1_pagec" fe_temp1
      es_set server_var(fe_format) 0
      es_xkeygroupcopy funeffects fe_templist
      es_keygroupfilter fe_templist only submenu server_var(fe_temp1)
      es_xforeachkey fe_temp2 in fe_templist "es_xdoblock funeffects/subeffects"
      es_keygroupdelete fe_templist
    }
    if (server_var(fe_slot) >= 7) do
    {
      es_xset fe_slot 0
      es_xmath fe_page + 1
    }
  }
}

block subeffects
{
  es_xmath fe_slot2 + 1
  es_keysetvalue funeffects server_var(fe_temp2) slot server_var(fe_slot2)
  es_keysetvalue funeffects server_var(fe_temp2) pagenumb server_var(fe_page2)
  es_copy server_var(fe_format) fe_page2
  if (server_var(fe_slot2) >= 7) do
  {
    es_xset fe_slot2 0
    es_xmath fe_page2 + 1
  }
}

// Playerlist update

block listupdate
{
  es_xset fe_page 1
  es_xset fe_slot 0
  es_set fe_players_pagec 0
  es_xforeachkey fe_temp1 in fe_playerlist "es_xdoblock funeffects/assign"
}

block assign
{
  es_xmath fe_slot + 1
  es_keysetvalue fe_playerlist server_var(fe_temp1) slot server_var(fe_slot)
  es_keysetvalue fe_playerlist server_var(fe_temp1) pagenumb server_var(fe_page)
  es_xcopy fe_players_pagec fe_page
  if (server_var(fe_slot) >= 7) do
  {
    es_xset fe_slot 0
    es_xmath fe_page + 1
  }
}

// Console commands

block ent
{
  es_xgetargv fe_arg1 1
  es_xgetargv fe_arg2 2
  es_xgetargv fe_arg3 3
  es_xgetargv fe_arg4 4
  if (server_var(fe_arg1) = create) do
  {
  es_exists fe_exists key funentities server_var(fe_arg3)
    ifx true(fe_exists) do
    {
      es_exists fe_exists userid server_var(fe_arg4)
      ifx true(fe_exists) do
      {
        es_exists fe_exists key fe_enttracking server_var(fe_arg4)
        ifx false(fe_exists) do
        {
          es_keycreate fe_enttracking server_var(fe_arg4)
        }
        else do
        {
          es_exists fe_exists keyvalue fe_enttracking server_var(fe_arg4) server_var(fe_arg2)
        }
        ifx false(fe_exists) do
        {
          // Set ent position
          es_xgetargv fe_arg5 5
          es_getplayerlocation fe_ent_x fe_ent_y fe_ent_z server_var(fe_arg4)
          es_math fe_ent_z + server_var(fe_arg5)
          es_xformatv fe_ent_origin "origin %1 %2 %3" fe_ent_x fe_ent_y fe_ent_z
          // Give entity
          es_give server_var(fe_arg4) server_var(fe_arg3)
          ifx true(eventscripts_lastgive) do
          {
            // Make unique entity targetname
            es_xmath fe_entcounter + 1
            es_xformatv fe_ent_id "fe_entid%1" fe_entcounter
            // Assign unique name to entity
            es est_setentname server_var(eventscripts_lastgive) server_var(fe_ent_id)
            es_keysetvalue fe_enttracking server_var(fe_arg4) server_var(fe_arg2) server_var(eventscripts_lastgive)
            // Set ent keyvalues
            es_xset fe_ent_argument 5
            es_foreachval fe_ent_keyvalue in funentities server_var(fe_arg3) "es_xdoblock funeffects/setkeyvalue"
            // Make player the entites parent
            es_xformatv fe_ent_parent "fe_playerid%1" fe_arg4
            es_fire server_var(fe_arg4) server_var(fe_ent_id) AddOutput server_var(fe_ent_origin)
            es_fire server_var(fe_arg4) server_var(fe_ent_id) SetParent server_var(fe_ent_parent)
          }
          else do
          {
            es echo [FunEffects] fe_ent: [ERROR] Entity: server_var(fe_arg3) failed to be created
          }
        }
        else do
        {
          es echo [FunEffects] fe_ent: [ERROR] Entity: server_var(fe_arg2) is already created
        }
      }
      else do
      {
        es echo [FunEffects] fe_ent: [ERROR] Player: server_var(fe_arg4) does not exist
      }
    }
    else do
    {
      es echo [FunEffects] fe_ent: [ERROR] Entity: server_var(fe_arg3) is not a funeffect entity
    }
  }
  if (server_var(fe_arg1) = delete) do
  {
    es_exists fe_exists key funentities server_var(fe_arg3)
    ifx true(fe_exists) do
    {
      es_exists fe_exists userid server_var(fe_arg4)
      ifx true(fe_exists) do
      {
        es_exists fe_exists key fe_enttracking server_var(fe_arg4)
        ifx false(fe_exists) do
        {
          es_keycreate fe_enttracking server_var(fe_arg4)
        }
        else do
        {
          es_exists fe_exists keyvalue fe_enttracking server_var(fe_arg4) server_var(fe_arg2)
        }
        ifx true(fe_exists) do
        {
          es_keygetvalue fe_ent_temp1 fe_enttracking server_var(fe_arg4) server_var(fe_arg2)
          ifx true(fe_ent_temp1) do
          {
            es_remove server_var(fe_ent_temp1)
          }
          es keyfilter fe_enttracking server_var(fe_arg4) not server_var(fe_arg2)
        }
        else do
        {
          es echo [FunEffects] fe_ent: [ERROR] Entity: server_var(fe_arg2) does not exist
        }
      }
      else do
      {
        es echo [FunEffects] fe_ent: [ERROR] Player: server_var(fe_arg4) does not exist
      }
    }
    else do
    {
      es echo [FunEffects] fe_ent: [ERROR] Entity: server_var(fe_arg3) is not a funeffect entity
    }
  }
}

block setkeyvalue
{
  if (server_var(fe_ent_keyvalue) != activateent) do
  {
    es_keygetvalue fe_ent_argc funentities server_var(fe_arg3) server_var(fe_ent_keyvalue)
    es_xset fe_ent_temp1 0
    es_xset fe_ent_temp2 0
    if (server_var(fe_ent_temp1) < server_var(fe_ent_argc)) do
    {
      es_xdoblock funeffects/while_setkeyvalue
    }
    es_xformatv fe_ent_format "%1 %2" fe_ent_keyvalue fe_ent_temp2
    es_fire server_var(fe_arg4) server_var(fe_ent_id) AddOutput server_var(fe_ent_format)
  }
  else do
  {
    es_keygetvalue fe_ent_arg funentities server_var(fe_arg3) activateent
    es_fire server_var(fe_arg4) server_var(fe_ent_id) server_var(fe_ent_arg)
  }
}

block while_setkeyvalue
{
  es_xmath fe_ent_temp1 + 1
  es_xmath fe_ent_argument + 1
  es_getargv fe_ent_arg server_var(fe_ent_argument)
  if (server_var(fe_ent_temp1) > 1) do
  {
    es_xformatv fe_ent_temp2 "%1 %2" fe_ent_temp2 fe_ent_arg
  }
  else do
  {
    es_set fe_ent_temp2 server_var(fe_ent_arg)
  }
  if (server_var(fe_ent_temp1) < server_var(fe_ent_argc)) do
  {
    es_xdoblock funeffects/while_setkeyvalue
  }
}
