block load
{
  // define variables used by daggermod
  // generic
  es_xset dmod_exists 0
  es_xset dmod_userid 0
  es_xset dmod_userid2 0
  es_xset dmod_name 0
  es_xset dmod_name2 0
  es_xset dmod_format 0
  es_xset dmod_isdead 0
  es_xset dmod_targetname 0
  // index
  es_xset dmod_index 0
  // location
  es_xset dmod_x 0
  es_xset dmod_y 0
  es_xset dmod_z 0
  es_xset dmod_x2 0
  es_xset dmod_y2 0
  es_xset dmod_z2 0
  es_xset dmod_vec 0
  es_xset dmod_lastloc 0
  es_xset dmod_distance 0
  // misc
  es_xset dmod_power 0
  es_xset dmod_daggercount 0
  es_xset dmod_daggercam 0
  es_xset dmod_hudmsg 0
  es_xset dmod_airtime 0
  // temp
  es_xset dmod_temp1 0
  es_xset dmod_temp2 0
  es_xset dmod_temp3 0
  
  // dmod command variables
  // arguments
  es_xset dmod_cmd_arg1 0
  es_xset dmod_cmd_arg2 0
  es_xset dmod_cmd_arg3 0
  es_xset dmod_cmd_arg4 0
  es_xset dmod_cmd_arg5 0
  //generic
  es_xset dmod_cmd_userid 0
  // index
  es_xset dmod_cmd_knifeindex 0
  es_xset dmod_cmd_glowindex 0
  // location
  es_xset dmod_cmd_x 0
  es_xset dmod_cmd_y 0
  es_xset dmod_cmd_z 0
  es_xset dmod_cmd_vec 0
  // formatting
  es_xset dmod_cmd_knifeformat 0
  es_xset dmod_cmd_glowformat 0
  es_xset dmod_cmd_originf 0
  es_xset dmod_cmd_colorf 0
  // angles
  es_xset dmod_cmd_ang1 0
  es_xset dmod_cmd_ang2 0
  es_xset dmod_cmd_ang3 0
  // index
  es_xset dmod_cmd_index 0
  //misc
  es_xset dmod_cmd_owner 0
  es_xset dmod_cmd_daggercam 0
  // temp
  es_xset dmod_cmd_temp1 0
  es_xset dmod_cmd_temp2 0
  
  // set config variables
  es_xset dmod_daggers "0" "Set how many daggers each player receives per round (0 = Unlimited)"
  es_xset dmod_announcekill "1" "Announces that a player was killed by a knife"
  es_xset dmod_daggers_power "300" "How many units ahead of the player the knife is pushed towards for each power point"
  es_xset dmod_daggers_steal "1" "When a player is killed, his killer receives all his daggers"
  es_xset dmod_damage "1000" "How much damage each dagger deals when player is hit"
  es_xset dmod_damageratio "1.1" "For every point short of a full power throw, 'dmod_damage' is divided by this for the damage done (1 = No damage difference between power 2 throw and a power 20 throw)"
  es_xset dmod_maxlife "5.0" "Max life of a dagger, after the knife either stops or the knife is in flight for more than this setting, the knife becomes non-lethal"
  es_xset dmod_mode "0" "0 = Regular gameplay with daggers added -- 1 = Daggers only"
  es_xset dmod_slashthrow "1" "Lets users attack with knife to throw a dagger instead of binding a key"
  es_xset dmod_slashthrow_power "10" "The power of a knife swing on a scale of 1-20"
  es_xset dmod_slashthrow_delay "3" "The length, in seconds, to block throwing daggers with the knife after throwing one"
  es_xset dmod_bots_throwdagger "1" "Allows bots to throw daggers"
  es_xset dmod_bots_throwradius "200" "The radius a player of the opposite team has to be in for bot to throw knife"
  es_xset dmod_bots_throwdistance "700" "The distance a player of the opposite team has to be in for bot to throw knife"
  es_xset dmod_bots_minpower "7" "The minimum power of a dagger throw from a bot"
  es_xset dmod_bots_maxpower "13" "The minimum power of a dagger throw from a bot"
  es_xset dmod_daggercam_enabled "1" "Give the client the option to enable the daggercam"
  es_xset dmod_daggercam_default "0" "Default status of the daggercam for clients (0 = Disabled, 1 = Enabled)"
  es_xset dmod_powerup_rate "0.1" "How fast, in seconds, each power point is gained while holding down the throw key"
  es_xset dmod_powerup_sound "buttons/button15.wav" "The sound played for every power point gained while holding down the throw key"
  es_xset dmod_powerup_sound_max "buttons/blip2.wav" "The sound played when a player's power bar is maxed out while holding down the throw key"
  es_xset dmod_glow "1" "Place a glow with the color of your choice on the dagger to make more visible"
  es_xset dmod_glow_color "0 255 0" "RGB color of the glow on knife"
  // Enable noisy
  es_xdoblock corelib/noisy_on
  // Load temporary fixed repeat
  es_xload daggermod/repeat
  // Exec config file
  exec dmod_config.cfg
  // Reset entity counter
  es_xset dmod_entcounter 0
  // Create internal commands
  es_exists dmod_exists command dmod
  ifx false(dmod_exists) do
  {
    es_xregcmd dmod daggermod/dmod "Internal command"
  }
  // Create dagger tracking keygroup
  es_xkeygroupcreate dmod_daggers
  // Create public var
  es_xset dmod_version "1.0.4b"
  es_xmakepublic dmod_version
  // Make client commands
  clientcmd create console +dagger "daggermod/beginthrow" "dmod_throwdagger" #known
  clientcmd create console -dagger "daggermod/endthrow" "dmod_throwdagger" #known
  // Make say commands
  clientcmd create say daggercam "daggermod/daggercam" "dmod_daggercam" #known
  // Announce
  es_msg #multi #lightgreen[DaggerMod] #greenLoaded
  mp_restartgame 2
}

block unload
{
  // Delete all repeats
  es_xforeachkey dmod_temp1 in dmod_repeat "es dmod_repeat delete server_var(dmod_temp1)"
  // Delete dagger tracking keygroup
  keygroupremove dmod_daggers
  // Unload temporary fixed repeat
  es_xunload daggermod/repeat
  // Disable noisy
  es_xdoblock corelib/noisy_off
  // Announce
  echo [DaggerMod] Unloaded
}

event player_activate
{
  es playervar set event_var(userid) dmod_daggercam server_var(dmod_daggercam_default)
}

event player_spawn
{
  // Set the players dagger count
  ifx true(dmod_daggers) do
  {
    es playervar set event_var(userid) dmod_daggercount server_var(dmod_daggers)
  }
  else do
  {
    es playervar set event_var(userid) dmod_daggercount infinite
  }
  // Allow player to slashthrow
  ifx true(dmod_slashthrow) do
  {
    es playervar set event_var(userid) dmod_canthrow 1
  }
  // Tell user how to enable/disable daggercam
  es usermsg hudhint event_var(userid) "To enable/disable daggercam type 'daggercam' in chat"
}

event player_death
{
  ifx true(dmod_daggers) do
  {
    ifx true(dmod_daggers_steal) do
    {
      es_exists dmod_exists userid event_var(attacker)
      ifx true(dmod_exists) do
      {
        if (event_var(es_userteam) != event_var(es_attackerteam)) do
        {
          // Steal dead player's daggers
          es playervar get dmod_temp1 event_var(userid) dmod_daggercount
          es playervar get dmod_temp2 event_var(attacker) dmod_daggercount
          es_math dmod_temp2 + server_var(dmod_temp1)
          es playervar set event_var(userid) dmod_daggercount 0
          es playervar set event_var(attacker) dmod_daggercount server_var(dmod_temp2)
          // Tell kill
          ifx true(dmod_temp1) do
          {
            es_format dmod_format "You stole %1 daggers from %2\nRemaining Daggers: %3" server_var(dmod_temp1) event_var(es_username) server_var(dmod_temp2)
            es usermsg hudhint event_var(attacker) server_var(dmod_format)
          }
        }
      }
    }
  }
  // Announce kill by dagger
  ifx true(dmod_announcekill) do
  {
    ifx true(dmod_daggerkill) do
    {
      es_msg #multi #lightgreen[DaggerMod]#green event_var(es_attackername) has killed event_var(es_username) with a dagger
    }
  }
}

event round_start
{
  // Announce
  es_xcopy dmod_temp1 dmod_slashthrow
  es_xcopy dmod_temp2 dmod_mode
  es_xstring dmod_temp1 replace "0" "Off"
  es_xstring dmod_temp1 replace "1" "On"
  es_xstring dmod_temp2 replace "0" "Off"
  es_xstring dmod_temp2 replace "1" "On"
  es_xformatv dmod_format "#lightgreen[DaggerMod] #greenTo throw a dagger, bind a key to +dagger - [Slash Throw = %1] - [Dagger Only Mode = %2]" dmod_temp1 dmod_temp2
  es_msg #multi server_var(dmod_format)
  // Start bot dagger throwing loop
  ifx true(dmod_bots_throwdagger) do
  {
    dmod_repeat create dmod_botthrow "es_xdoblock daggermod/botthrow"
    dmod_repeat start dmod_botthrow 5
  }
  // Reset ent counter
  es_xset dmod_entcounter 0
  // Reset dagger tracking keygroup
  keygroupremove dmod_daggers
  es_xkeygroupcreate dmod_daggers
}

event round_end
{
  dmod_repeat status dmod_exists dmod_botthrow
  ifx true(dmod_exists) do
  {
    dmod_repeat delete dmod_botthrow
  }
}

event item_pickup
{
  ifx true(dmod_mode) do
  {
    if (event_var(item) != knife) do
    {
      es_delayed 0.1 es_xgive event_var(userid) player_weaponstrip
      es_delayed 0.1 es_xfire event_var(userid) player_weaponstrip Strip
      es_delayed 0.1 es_xgive event_var(userid) weapon_knife
    }
  }
}

event weapon_fire
{
  if (event_var(weapon) = knife) do
  {
    ifx true(dmod_slashthrow) do
    {
      es playervar get dmod_temp1 event_var(userid) dmod_canthrow
      ifx true(dmod_temp1) do
      {
        // End power build
        es_format dmod_format "dmod_powerup_%1" event_var(userid)
        es dmod_repeat status dmod_exists server_var(dmod_format)
        ifx true(dmod_exists) do
        {
          es dmod_repeat delete server_var(dmod_format)
        }
        // Subtract dagger
        es playervar get dmod_daggercount event_var(userid) dmod_daggercount
        ifx true(dmod_daggercount) do
        {
          if (server_var(dmod_daggercount) > 0) do
          {
            es_xmath dmod_daggercount - 1
            es playervar set event_var(userid) dmod_daggercount server_var(dmod_daggercount)
            es_format dmod_format "Daggers Remaining: %1" server_var(dmod_daggercount)
            es usermsg hudhint event_var(userid) server_var(dmod_format)
          }
          // Increment ent counter
          es_xmath dmod_entcounter + 1
          // Throw knife from player
          es dmod throwdagger dmod_targetname event_var(userid) server_var(dmod_slashthrow_power) server_var(dmod_entcounter)
          // Block throwing daggers with this method for x seconds
          es playervar set event_var(userid) dmod_canthrow 0
          es_delayed server_var(dmod_slashthrow_delay) playervar set event_var(userid) dmod_canthrow 1
        }
      }
    }
  }
}

// Bot throwing blocks

block botthrow
{
  est_loop dmod_temp1 #c!h "es_xdoblock daggermod/ct_viewcone"
  est_loop dmod_temp1 #t!h "es_xdoblock daggermod/t_viewcone"
}

block ct_viewcone
{
  if (server_var(dmod_bots_throwdagger) = 1) do
  {
    es getplayerinfo dmod_temp2 server_var(dmod_temp1) weapon
    if (server_var(dmod_temp2) = weapon_knife) do
    {
      es_getplayerprop dmod_isdead server_var(dmod_temp1) CCSPlayer.baseclass.pl.deadflag
      ifx false(dmod_isdead) do
      {
        es playervar get dmod_daggercount server_var(dmod_temp1) dmod_daggercount
        ifx true(dmod_daggercount) do
        {
          es_xset dmod_temp2 0
          es est_viewcone dmod_userid server_var(dmod_temp1) #t!d server_var(dmod_bots_throwradius) 0 server_var(dmod_bots_throwdistance) "es_xdoblock daggermod/botthrowdagger"
        }
      }
    }
  }
  if (server_var(dmod_bots_throwdagger) = 2) do
  {
    es_getplayerprop dmod_isdead server_var(dmod_temp1) CCSPlayer.baseclass.pl.deadflag
    ifx false(dmod_isdead) do
    {
      es playervar get dmod_daggercount server_var(dmod_temp1) dmod_daggercount
      ifx true(dmod_daggercount) do
      {
        es_xset dmod_temp2 0
        es est_viewcone dmod_userid server_var(dmod_temp1) #t!d server_var(dmod_bots_throwradius) 0 server_var(dmod_bots_throwdistance) "es_xdoblock daggermod/botthrowdagger"
      }
    }
  }
}

block t_viewcone
{
  if (server_var(dmod_bots_throwdagger) = 1) do
  {
    es getplayerinfo dmod_temp2 server_var(dmod_temp1) weapon
    if (server_var(dmod_temp2) = weapon_knife) do
    {
      es_getplayerprop dmod_isdead server_var(dmod_temp1) CCSPlayer.baseclass.pl.deadflag
      ifx false(dmod_isdead) do
      {
        es playervar get dmod_daggercount server_var(dmod_temp1) dmod_daggercount
        ifx true(dmod_daggercount) do
        {
          es_xset dmod_temp2 0
          es est_viewcone dmod_userid server_var(dmod_temp1) #c!d server_var(dmod_bots_throwradius) 0 server_var(dmod_bots_throwdistance) "es_xdoblock daggermod/botthrowdagger"
        }
      }
    }
  }
  if (server_var(dmod_bots_throwdagger) = 2) do
  {
    es_getplayerprop dmod_isdead server_var(dmod_temp1) CCSPlayer.baseclass.pl.deadflag
    ifx false(dmod_isdead) do
    {
      es playervar get dmod_daggercount server_var(dmod_temp1) dmod_daggercount
      ifx true(dmod_daggercount) do
      {
        es_xset dmod_temp2 0
        es est_viewcone dmod_userid server_var(dmod_temp1) #c!d server_var(dmod_bots_throwradius) 0 server_var(dmod_bots_throwdistance) "es_xdoblock daggermod/botthrowdagger"
      }
    }
  }
}

block botthrowdagger
{
  ifx false(dmod_temp2) do
  {
    es_xset dmod_temp2 1
    // Subtract dagger
    es playervar get dmod_daggercount server_var(dmod_temp1) dmod_daggercount
    if (server_var(dmod_daggercount) > 0) do
    {
      es_xmath dmod_daggercount - 1
      es playervar set server_var(dmod_temp1) dmod_daggercount server_var(dmod_daggercount)
    }
    // Find throw power
    es_rand dmod_power server_var(dmod_bots_minpower) server_var(dmod_bots_maxpower)
    es_xmath dmod_entcounter + 1
    es dmod throwdagger dmod_targetname server_var(dmod_temp1) server_var(dmod_power) server_var(dmod_entcounter)
  }
}

// +dagger blocks

block beginthrow
{
  es_xgetcmduserid dmod_userid
  es playervar get dmod_daggercount server_var(dmod_userid) dmod_daggercount
  ifx true(dmod_daggercount) do
  {
    es_getplayerprop dmod_isdead server_var(dmod_userid) CCSPlayer.baseclass.pl.deadflag
    ifx false(dmod_isdead) do
    {
      es playervar set server_var(dmod_userid) dmod_power 1
      es_xformatv dmod_format "dmod_powerup_%1" dmod_userid
      es dmod_repeat create server_var(dmod_format) "es_xdoblock daggermod/build"
      es dmod_repeat start server_var(dmod_format) server_var(dmod_powerup_rate) 19
    }
  }
}

block build
{
  // Get userid
  es_xcopy dmod_userid _repeat_name
  es_xstring dmod_userid replace "dmod_powerup_"
  es_getplayerprop dmod_isdead server_var(dmod_userid) CCSPlayer.baseclass.pl.deadflag
  ifx false(dmod_isdead) do
  {
    // Add power point
    es playervar get dmod_power server_var(dmod_userid) dmod_power
    es_xmath dmod_power + 1
    es playervar set server_var(dmod_userid) dmod_power server_var(dmod_power)
    es_xset dmod_hudmsg "Power:\n["
    es_xset dmod_temp1 0
    while "server_var(dmod_temp1) < server_var(dmod_power)" "es_xdoblock daggermod/addbar"
    es_xset dmod_temp1 0
    es_xmathparse dmod_temp2 "20-dmod_power"
    while "server_var(dmod_temp1) < server_var(dmod_temp2)" "es_xdoblock daggermod/addspace"
    es_xformatv dmod_hudmsg "%1]" dmod_hudmsg
    es usermsg hudhint server_var(dmod_userid) server_var(dmod_hudmsg)
    // Play sound
    if (server_var(_repeat_count) < 19) do
    {
      es_playsound server_var(dmod_userid) server_var(dmod_powerup_sound) 1.0
    }
    else do
    {
      es usermsg hudhint server_var(dmod_userid) "Power:\n[         MAXED         ]"
      es_playsound server_var(dmod_userid) server_var(dmod_powerup_sound_max) 1.0
    }
  }
}

block addbar
{
  es_xmath dmod_temp1 + 1
  es_xformatv dmod_hudmsg "%1|" dmod_hudmsg
}

block addspace
{
  es_xmath dmod_temp1 + 1
  es_xformatv dmod_hudmsg "%1 " dmod_hudmsg
}

block endthrow
{
  // Get userid
  es_xgetcmduserid dmod_userid
  es playervar get dmod_daggercount server_var(dmod_userid) dmod_daggercount
  ifx true(dmod_daggercount) do
  {
    es_getplayerprop dmod_isdead server_var(dmod_userid) CCSPlayer.baseclass.pl.deadflag
    ifx false(dmod_isdead) do
    {
      // End power build
      es_xformatv dmod_format "dmod_powerup_%1" dmod_userid
      es dmod_repeat status dmod_exists server_var(dmod_format)
      ifx true(dmod_exists) do
      {
        es dmod_repeat delete server_var(dmod_format)
      }
      // Get power
      es playervar get dmod_power server_var(dmod_userid) dmod_power
      ifx true(dmod_power) do
      {
        // Set their power to 0
        es playervar set server_var(dmod_userid) dmod_power 0
        // Subtract dagger
        es playervar get dmod_daggercount server_var(dmod_userid) dmod_daggercount
        if (server_var(dmod_daggercount) > 0) do
        {
          es_xmath dmod_daggercount - 1
          es playervar set server_var(dmod_userid) dmod_daggercount server_var(dmod_daggercount)
          es_tell server_var(dmod_userid) #multi #lightgreen[DaggerMod] #greenYou have server_var(dmod_daggercount) daggers remaining
        }
        // Increment ent counter
        es_xmath dmod_entcounter + 1
        // Throw knife from player
        es dmod throwdagger dmod_targetname server_var(dmod_userid) server_var(dmod_power) server_var(dmod_entcounter)
      }
      else do
      {
        ifx true(dmod_daggers) do
        {
          // Take a dagger
          es_xmath dmod_daggercount - 1
          es playervar set server_var(dmod_userid) dmod_daggercount server_var(dmod_daggercount)
          // Tell the user
          es_format dmod_format "Trying to exploit?\nDaggers Remaining: %1" server_var(dmod_daggercount)
          es usermsg hudhint event_var(userid) server_var(dmod_format)
        }
      }
    }
  }
  else do
  {
    es usermsg hudhint event_var(userid) "You have no daggers\nTo steal some, kill an enemy"
  }
}

block track
{
  es_xcopy dmod_temp1 _repeat_name
  es_xstring dmod_temp1 replace "dmod_knife_"
  es_exists dmod_exists key dmod_daggers server_var(dmod_temp1)
  ifx true(dmod_exists) do
  {
    // Add to airtime
    es_keygetvalue dmod_airtime dmod_daggers server_var(dmod_temp1) airtime
    if (server_var(dmod_airtime) < server_var(dmod_maxlife)) do
    {
      es_xmath dmod_airtime float
      es_xmath dmod_airtime + 0.1
      es_keysetvalue dmod_daggers server_var(dmod_temp1) airtime server_var(dmod_airtime)
      // Check distance knife has traveled
      es_keygetvalue dmod_index dmod_daggers server_var(dmod_temp1) knife
      es_keygetvalue dmod_lastloc dmod_daggers server_var(dmod_temp1) lastloc
      es_getindexprop dmod_vec server_var(dmod_index) "CKnife.baseclass.baseclass.baseclass.baseclass.m_vecOrigin"
      es_keysetvalue dmod_daggers server_var(dmod_temp1) lastloc server_var(dmod_vec)
      es_splitvectorstring dmod_x dmod_y dmod_z server_var(dmod_lastloc)
      es_splitvectorstring dmod_x2 dmod_y2 dmod_z2 server_var(dmod_vec)
      es_xmathparse dmod_distance "sqrt((dmod_x2-dmod_x)^2+(dmod_y2-dmod_y)^2+(dmod_z2-dmod_z)^2)"
      // Hurt nearby players
      es_keygetvalue dmod_userid dmod_daggers server_var(dmod_temp1) userid
      es est_nearcoord dmod_userid2 #a 75 server_var(dmod_x2) server_var(dmod_y2) server_var(dmod_z2) "es_xdoblock daggermod/dodamage"
      if (server_var(dmod_distance) < 50) do
      {
        // Stop loop
        es dmod_repeat delete server_var(_repeat_name)
        // "non-lethalize" knife
        es_xdoblock daggermod/delethalize
      }
    }
    else do
    {
      // Stop loop
      es dmod_repeat delete server_var(_repeat_name)
      // "non-lethalize" knife
      es_xdoblock daggermod/delethalize
    }
  }
  else do
  {
    // Stop loop
    es dmod_repeat delete server_var(_repeat_name)
    // "non-lethalize" knife
    es_xdoblock daggermod/delethalize
  }
}

block dodamage
{
  if (server_var(dmod_userid) != server_var(dmod_userid2)) do
  {
    es_xset dmod_daggerkill 1
    es est_damage server_var(dmod_userid) server_var(dmod_userid2) server_var(dmod_damage)
    es_xdelayed 0.01 es_xset dmod_daggerkill 0
  }
}

block delethalize
{
  // Set view back to player's face
  es_keygetvalue dmod_userid dmod_daggers server_var(dmod_temp1) userid
  es est_getindex dmod_index server_var(dmod_userid)
  es_setview server_var(dmod_userid) server_var(dmod_index)
  // Remove env_lightglow
  es_exists dmod_exists keyvalue dmod_daggers server_var(dmod_temp1) glow
  ifx true(dmod_exists) do
  {
    es_keygetvalue dmod_index dmod_daggers server_var(dmod_temp1) glow
    es_remove server_var(dmod_index)
  }
  // Remove from "tracker"
  es_keydelete dmod_daggers server_var(dmod_temp1)
}
  
block dmod
{
  es_xgetargv dmod_cmd_arg1 1
  if (server_var(dmod_cmd_arg1) = glow) do
  {
    // Syntax: dmod glow <userid> <entity-id> <parentname>
    es_xgetargv dmod_cmd_arg2 2
    es_xgetargv dmod_cmd_arg3 3
    es_xgetargv dmod_cmd_arg4 4
    // Get knife loc
    es_getindexprop dmod_cmd_vec server_var(dmod_cmd_knifeindex) "CKnife.baseclass.baseclass.baseclass.baseclass.m_vecOrigin"
    // Create a glow
    es_give server_var(dmod_cmd_arg2) env_lightglow
    es_xcopy dmod_cmd_glowindex eventscripts_lastgive
    // Give env_lightglow a name
    es_xformatv dmod_cmd_glowformat "dmod_glow_%1" dmod_cmd_arg3
    es est_setentname server_var(dmod_cmd_glowindex) server_var(dmod_cmd_glowformat)
    // Move env_lightglow to knife
    es_splitvectorstring dmod_cmd_x dmod_cmd_y dmod_cmd_z server_var(dmod_cmd_vec)
    es_xformatv dmod_cmd_originf "origin %1 %2 %3" dmod_cmd_x dmod_cmd_y dmod_cmd_z
    // Setup and parent env_lightglow
    es_xformatv dmod_cmd_colorf "rendercolor %1" dmod_glow_color
    es_fire server_var(dmod_cmd_arg2) server_var(dmod_cmd_glowformat) AddOutput server_var(dmod_cmd_originf)
    es_fire server_var(dmod_cmd_arg2) server_var(dmod_cmd_glowformat) AddOutput server_var(dmod_cmd_colorf)
    es_fire server_var(dmod_cmd_arg2) server_var(dmod_cmd_glowformat) AddOutput "verticalglowsize 5"
    es_fire server_var(dmod_cmd_arg2) server_var(dmod_cmd_glowformat) AddOutput "horizontalglowsize 5"
    es_fire server_var(dmod_cmd_arg2) server_var(dmod_cmd_glowformat) AddOutput "mindist 0"
    es_fire server_var(dmod_cmd_arg2) server_var(dmod_cmd_glowformat) AddOutput "maxdist 100"
    es_fire server_var(dmod_cmd_arg2) server_var(dmod_cmd_glowformat) AddOutput "outermaxdist 1000"
    es_fire server_var(dmod_cmd_arg2) server_var(dmod_cmd_glowformat) AddOutput "glowproxysize 50"
    es_fire server_var(dmod_cmd_arg2) server_var(dmod_cmd_glowformat) SetParent server_var(dmod_cmd_arg4)
    // Update dagger tracker
    es_keysetvalue dmod_daggers server_var(dmod_cmd_arg3) glow server_var(dmod_cmd_glowindex)
  }
  if (server_var(dmod_cmd_arg1) = throwdagger) do
  {
    // Syntax: dmod throwdagger <return-parent> <userid> <power> <entity id>
    es_xgetargv dmod_cmd_arg2 2
    es_xgetargv dmod_cmd_arg3 3
    es_xgetargv dmod_cmd_arg4 4
    es_xgetargv dmod_cmd_arg5 5
    // Check if there is a knife already in-flight by this player
    es_xkeygroupcopy dmod_daggers dmod_tempgroup
    es_keygroupfilter dmod_tempgroup only userid server_var(dmod_cmd_arg3)
    es_xset dmod_cmd_temp1 0
    es_xforeachkey dmod_cmd_temp1 in dmod_tempgroup "say"
    keygroupremove dmod_tempgroup
    ifx false(dmod_cmd_temp1) do
    {
      // Spawn weapon_knife
      es_give server_var(dmod_cmd_arg3) weapon_knife
      es_xcopy dmod_cmd_knifeindex eventscripts_lastgive
      // Attach view to dagger if enabled
      ifx true(dmod_daggercam_enabled) do
      {
        es playervar get dmod_cmd_daggercam server_var(dmod_cmd_arg3) dmod_daggercam
        ifx true(dmod_cmd_daggercam) do
        {
          es_delayed 0.02 es_xsetview server_var(dmod_cmd_arg3) server_var(eventscripts_lastgive)
        }
      }
      // Give weapon_knife a name
      es_xformatv dmod_cmd_knifeformat "dmod_knife_%1" dmod_cmd_arg5
      es_copy server_var(dmod_cmd_arg2) dmod_cmd_knifeformat
      es est_setentname server_var(dmod_cmd_knifeindex) server_var(dmod_cmd_knifeformat)
      // Find where to push weapon_knife towards
      es playerget viewvector dmod_cmd_vec server_var(dmod_cmd_arg3)
      es_splitvectorstring dmod_cmd_ang1 dmod_cmd_ang2 dmod_cmd_ang3 server_var(dmod_cmd_vec)
      es_math dmod_cmd_arg4 * server_var(dmod_daggers_power)
      es_math dmod_cmd_ang1 * server_var(dmod_cmd_arg4)
      es_math dmod_cmd_ang2 * server_var(dmod_cmd_arg4)
      es_xmathparse dmod_cmd_ang3 "dmod_cmd_ang3*(dmod_cmd_arg4/0.60)"
      es_math dmod_cmd_arg4 / server_var(dmod_daggers_power)
      // Position knife
      es_getplayerlocation dmod_cmd_x dmod_cmd_y dmod_cmd_z server_var(dmod_cmd_arg3)
      es_xmath dmod_cmd_z + 60
      es_createvectorstring dmod_cmd_vec server_var(dmod_cmd_x) server_var(dmod_cmd_y) server_var(dmod_cmd_z)
      es playerget viewvector dmod_cmd_temp1 server_var(dmod_cmd_arg3)
      es vecmath dmod_cmd_temp1 server_var(dmod_cmd_temp1) * 1
      es vecmath dmod_cmd_temp1 server_var(dmod_cmd_temp1) + server_var(dmod_cmd_vec)
      es_splitvectorstring dmod_cmd_x dmod_cmd_y dmod_cmd_z server_var(dmod_cmd_temp1)
      es est_entteleport server_var(dmod_cmd_knifeindex) server_var(dmod_cmd_x) server_var(dmod_cmd_y) server_var(dmod_cmd_z)
      // Set knife angle
      es_getplayerprop dmod_cmd_vec server_var(dmod_cmd_arg3) CBasePlayer.baseclass.baseclass.baseclass.baseclass.baseclass.m_angRotation
      es_delayed 0.01 es_setindexprop server_var(dmod_cmd_knifeindex) "CBaseEntity.m_angRotation" server_var(dmod_cmd_vec)
      // Start tracking
      es_createvectorstring dmod_cmd_vec server_var(dmod_cmd_x) server_var(dmod_cmd_y) server_var(dmod_cmd_z)
      es_keycreate dmod_daggers server_var(dmod_cmd_arg5)
      es_keysetvalue dmod_daggers server_var(dmod_cmd_arg5) airtime 0
      es_keysetvalue dmod_daggers server_var(dmod_cmd_arg5) userid server_var(dmod_cmd_arg3)
      es_keysetvalue dmod_daggers server_var(dmod_cmd_arg5) knife server_var(dmod_cmd_knifeindex)
      es_keysetvalue dmod_daggers server_var(dmod_cmd_arg5) beam server_var(dmod_cmd_beamindex)
      es_keysetvalue dmod_daggers server_var(dmod_cmd_arg5) scommand server_var(dmod_cmd_scommandindex)
      es_keysetvalue dmod_daggers server_var(dmod_cmd_arg5) lastloc server_var(dmod_cmd_vec)
      es dmod_repeat create server_var(dmod_cmd_knifeformat) "es_xdoblock daggermod/track"
      es dmod_repeat start server_var(dmod_cmd_knifeformat) 0.05
      // Push the knife
      es_delayed 0.01 est_entphyspush server_var(dmod_cmd_knifeindex) server_var(dmod_cmd_ang1) server_var(dmod_cmd_ang2) server_var(dmod_cmd_ang3)
      // Make the knife glow if necessary
      ifx true(dmod_glow) do
      {
        es dmod glow server_var(dmod_cmd_arg3) server_var(dmod_cmd_arg5) server_var(dmod_cmd_knifeformat)
      }
    }
    else do
    {
      es_keygetvalue dmod_airtime dmod_daggers server_var(dmod_cmd_temp1) airtime
      ifx false(dmod_airtime) do
      {
        // Stop loop
        es repeat status dmod_exists server_var(_repeat_name)
        ifx true(dmod_exists) do
        {
          es dmod_repeat delete server_var(_repeat_name)
        }
        // "non-lethalize" knife
        es_xdoblock daggermod/delethalize
      }
    }
  }
}

// daggercam blocks

block daggercam
{
  ifx true(dmod_daggercam_enabled) do
  {
    es_xgetcmduserid dmod_userid
    es playervar get dmod_daggercam server_var(dmod_userid) dmod_daggercam
    ifx true(dmod_daggercam) do
    {
      es playervar set server_var(dmod_userid) dmod_daggercam 0
      es usermsg hudhint server_var(dmod_userid) "Dagger Cam: Disabled"
    }
    else do
    {
      es playervar set server_var(dmod_userid) dmod_daggercam 1
      es usermsg hudhint server_var(dmod_userid) "Dagger Cam: Enabled"
    }
  }
  else do
  {
    es usermsg hudhint server_var(dmod_userid) "Dagger Cam: Disabled by server admin"
  }
}