﻿// ******************************************************************************************
// Schubaal's AntiCamp
//		v2.2.8a
//		based on Blade's Anticamp v1.4.53
//
// * Description:
//	- message will be sent when camping with any weapon
//	- effects will not be applied when using excluded weapons
//	- last player alive on a team is not punished
//
//	- camping is allowed for CTs if the Bomb has been dropped (can be toggled off)
//	- camping is allowed for Terrorists on Hostage maps (can be toggled off)
//	- camping is allowed for Terrorists if the Bomb has been planted (can be toggled off)
//
// * Install instructions:
//			 1. Install Mattie's EventScripts plugins:
//				http://mattie.info/cs
//
//			 2. Extract the file [anticamp.zip] to your /cstrike/ directory:
//				/addons/eventscripts/anticamp/es_anticamp.txt
//				/addons/eventscripts/anticamp/es_mapconfig_db.txt
//				/cfg/anticamp/anticamp.cfg
//				/sound/ql/blip1.wav
//
//			 3. Add the following line somewhere in autoexec.cfg or server.cfg:
//				es_load anticamp
//
// ******************************************************************************************

//**************************************************************
// Do not edit this file unless you really know what you're
//	doing! Please edit the file ./cfg/anticamp/anticamp.cfg
//**************************************************************

block load
{
	// init vars
	es_xset x 0
	es_xset y 0
	es_xset z 0
	es_xset fA 0
	es_xset tpx 0
	es_xset tpy 0
	es_xset tpz 0
	es_xset _str 0
	es_xset slap 0
	es_xset cash 0
	es_xset ac_id 0
	es_xset _temp 0
	es_xset blind 0
	es_xset strip 0
	es_xset _index 0
	es_xset _rand 0
	es_xset beacon 0
	es_xset message 0
	es_xset exclude 0
	es_xset ac_name 0
	es_xset ac_team 0
	es_xset ac_timer 0
	es_xset ac_class 0
	es_xset camptime 0
	es_xset _tempent 0
	es_xset ac_isbot 0
	es_xset ac_sound 0
	es_xset takecash 0
	es_xset ac_mapcat 0
	es_xset slap_mode 0
	es_xset ac_weapon 0
	es_xset ac_return 0
	es_xset ac_health 0
	es_xset campradius 0
	es_xset ac_counter 0
	es_xset minplayer 0
	es_xset min_health 0
	es_xset _punishment 0
	es_xset health_slap 0
	es_xset start_timer 0
	es_xset _start_timer 0
	es_xset beacon_sound 0
	es_xset detect_sound 0
	es_xset allow_t_camp 0
	es_xset allow_ct_camp 0
	es_xset anticamp_mode 0
	es_xset weapon_check 0
	es_xset exclude_weapons 0
	es_xset lastman_t 0
	es_xset lastman_ct 0
	es_xset excluded_send_message 0
	es_xset loop_timer 0
	
	es_xset anticamp_beacon_red 255
	es_xset anticamp_beacon_green 0
	es_xset anticamp_beacon_blue 0
	es_xset anticamp_beacon2_red 0
	es_xset anticamp_beacon2_green 0
	es_xset anticamp_beacon2_blue 255

	es_xset anticamp_beacon_size 0
	
	es_xset anticamp_beacon_type 0
	es_xset anticamp_lastman 0

	// version information
	es_xset AntiCamp2 "2.2.8a"
	es_xmakepublic AntiCamp2

	// init punishments
	alias _slap "es_xdoblock anticamp/slap"
	alias _cash "es_xdoblock anticamp/cash"
	alias _blind "es_xdoblock anticamp/blind"
	alias _strip "es_xdoblock anticamp/strip"
	alias _beacon "es_xdoblock anticamp/beacon"
	alias _message "es_xdoblock anticamp/message"

	// format msg
	es_xset campmsg "\x01\x03 %s1\x01 кемперит с\x04 %s2"
	es_xstring campmsg replace "\x01" ""
	es_xstring campmsg replace "\x03" ""
	es_xstring campmsg replace "\x04" ""

	// Initialize
	es_xdoblock anticamp/init
	es_msg #multi [#greenAntiCamp#default]#lightgreen server_var(anticamp2) loaded.
	es_msg #multi #green Excluded weapons#lightgreen are:#green server_var(exclude_weapons)
}

block unload
{
	es_xset anticamp 0

	es_xexists _temp keygroup anticamp
	ifx true(_temp) do
	{
		es_xkeygroupdelete anticamp
	}
	es_xexists _temp keygroup mapconfig
	ifx true(_temp) do
	{
		es_xkeygroupdelete mapconfig
	}
	es_xmsg #multi #green [AntiCamp]#default unloaded.
}

block init
{
	es_xset ac_team 0
	es_token ac_mapcat server_var(eventscripts_currentmap) 1 _

	// allow Terrorists to camp on hostage maps
	if (server_var(ac_mapcat) in server_var(allow_t_camp)) do
	{
		es_xset ac_team 2
	}

	// allow CTs to camp on demolition maps
	if (server_var(ac_mapcat) in server_var(allow_ct_camp)) do
	{
		es_xset ac_team 3
	}

	// reset main loop
	es_xexists _temp keygroup anticamp
	ifx true(_temp) do
	{
		es_xkeygroupdelete anticamp
	}
	es_xkeygroupcreate anticamp

	// map configs
	es_xexists _temp keygroup mapconfig
	ifx true(_temp) do
	{
		es_xkeygroupdelete mapconfig
	}
	es_xkeygroupload mapconfig |anticamp

	// load config
	es_xset anticamp_cfg 0
	exec anticamp/anticamp.cfg
	es_xmakepublic anticamp_cfg

	// correct config settings
		// loop_timer
			es_set _timer server_var(loop_timer)
			ifx true(_timer) do
			{
				es_xset loop_timer "1"
			}
			else do
			{
				es_xset loop_timer "2"
			}

		// slap_mode
			es_set _slapmode server_var(slap_mode)
			ifx true(_slapmode)
			{
				es_xset slap_mode "1"
			}
			else do
			{
				es_xset slap_mode "0"
			}

		// non-float vars
			es_xmath camptime int
			es_xmath slap int
			es_xmath blind int
			es_xmath strip int
			es_xmath beacon int
			es_xmath message int
			es_xmath health_slap int
			es_xmath min_health int
			es_xmath takecash int

		// camptime negative for count-up
			ifx parse("camptime >= 1") do
			{
				es_xmathparse camptime "camptime*-1"
			}

		// beacon sound
			es_xset anticamp_sounds 0
			es_format anticamp_sounds "sound/%1" server_var(beacon_sound)
			es_stringtable downloadables server_var(anticamp_sounds)
		
		es_xdoblock anticamp/round_variables
	// end config corrections

	// load punishment sequence
	es_xset _punishment ";_slap;_cash;_blind;_strip;_beacon;_message"
	if (server_var(slap) == -1)	then es_xstring _punishment replace ";_slap"
	if (server_var(cash) == -1) then es_xstring _punishment replace ";_cash"
	if (server_var(blind) == -1) then es_xstring _punishment replace ";_blind"
	if (server_var(strip) == -1) then es_xstring _punishment replace ";_strip"
	if (server_var(beacon) == -1) then es_xstring _punishment replace ";_beacon"
	if (server_var(message) == -1) then es_xstring _punishment replace ";_message"

	// load map config
	es_xset _temp 0
	es_xset anticamp_mode 1
	es_exists _temp key mapconfig server_var(eventscripts_currentmap)
	ifx true(_temp) do
	{
		es_foreachval _temp in mapconfig server_var(eventscripts_currentmap) "es_xdoblock anticamp/map_config"
	}

	// start anticamp
	es alias do_punish server_var(_punishment)
	es_xdelayed 1 es_xdoblock anticamp/check_player
}

event es_map_start
{
	es_xdoblock anticamp/init
}

block map_config
{
	es_keygetvalue _str mapconfig server_var(eventscripts_currentmap) server_var(_temp)
	es_xformatv _str "%1 %2" _temp _str
	es_xcommandv _str
}

block weapon_checks
{
	es_strcmp cmpvar server_var(ac_weapon) server_var(temptoken)
	es_set weapon_check server_var(weapon_check)
	ifx false(weapon_check) do
	{
		es_set cmpvar server_var(cmpvar)
		ifx false(cmpvar) do
		{
			es_xset weapon_check 1
		}
		else do
		{
			es_xset weapon_check 0
		}
	}
}

block check_player
{
	// command order
	ifx true(anticamp_mode) do
	{
		ifx true(_start_timer) do
		{
			es_xmath _start_timer - 1
		}
		else do
		{
			es_xforeachkey ac_id in anticamp "es_xdoblock anticamp/verify_vector"
		}
	}
	es_xdelayed 1 es_xdoblock anticamp/check_player
}

block verify_vector
{
	es getplayerinfo ac_class server_var(ac_id) teamid
	ifx parse("ac_class != ac_team") do
	{
		// get user health
		es getplayerinfo ac_health server_var(ac_id) health
		ifx parse("ac_health > min_health") do
		{
			// get current location
			es_getplayerprop fA server_var(ac_id) "CBaseEntity.m_vecOrigin"
			es_splitvectorstring x y z server_var(fA)

			// get old vector
			es_keygetvalue _str anticamp server_var(ac_id) vectorstr
			es_splitvectorstring tpx tpy tpz server_var(_str)

			// check old vector
			ifx parse("x == tpx") do
			{
				es_xdoblock anticamp/get_user
			}
			else do
			{
				es_xmathparse x "x-tpx"
				es_xmathparse y "y-tpy"
				es_xmathparse z "z-tpz"

				es_xstring x replace -
				es_xstring y replace -
				es_xstring z replace -

				// check if camping
				ifx parse("(x < campradius) and (y < campradius) and (z < campradius)") do
				{
					es_xdoblock anticamp/get_user
				}
			}

			ifx false(ac_return) do
			{
				es_keysetvalue anticamp server_var(ac_id) timer server_var(camptime)
				es_keysetvalue anticamp server_var(ac_id) vectorstr server_var(fA)
			}
			es_xset ac_return 0
		}
	}
}

block get_user
{
	// get total camps
	es_keygetvalue ac_counter anticamp server_var(ac_id) timer
	es_xmathparse ac_counter "ac_counter+1"
	es_keysetvalue anticamp server_var(ac_id) timer server_var(ac_counter)

	// punish if camptime has passed
	ifx parse("ac_counter >= 0") do
	{
		es_xmathparse _temp "ac_counter/loop_timer"
		if ("." notin server_var(_temp)) do
		{
			es_xset ac_timer 1
		}
		else do
		{
			es_xset ac_timer 0
		}

		es_xset weapon_check 0
		es getplayerinfo ac_weapon server_var(ac_id) weapon
		es_xstring ac_weapon replace "weapon_"
		es getplayerinfo ac_name server_var(ac_id) name
		es foreach token temptoken server_var(exclude_weapons) "," "es_doblock anticamp/weapon_checks"

		es_set weapon_check server_var(weapon_check)		
		ifx false(weapon_check)
		{
			do_punish
		}
		else do
		{
			es_set excluded_send_message server_var(excluded_send_message)
			ifx true(excluded_send_message) do
			{
				es_xdoblock anticamp/message
			}
		}
	}
	es_xset ac_return 1
}

block message
{
	if (server_var(ac_counter) in server_var(message)) do
	{
		// get user detail
		es getplayerinfo ac_weapon server_var(ac_id) weapon
		es_xstring ac_weapon replace weapon_
		es getplayerinfo ac_name server_var(ac_id) name
		es getplayerinfo _index server_var(ac_id) index

		// write msg
		es_xusermsg create campmsg SayText2
		es_usermsg write byte campmsg server_var(_index)
		es_xusermsg write byte campmsg true
		es_usermsg write string campmsg server_var(campmsg)
		es_usermsg write string campmsg server_var(ac_name)
		es_usermsg write string campmsg server_var(ac_weapon)
		es_xcreateplayerlist _playerlist
		es_xforeachkey _tmp in _playerlist "es_usermsg send campmsg server_var(_tmp)"
		es_xkeygroupdelete _playerlist
		es_xusermsg delete campmsg
	}
}

block cash
{
	ifx true(ac_timer) do
	{
		ifx parse("ac_counter >= cash") do
		{
			es_getplayerprop _temp server_var(ac_id) "CCSPlayer.m_iAccount"
			ifx true(_temp) do
			{
				ifx parse("_temp > 0") do
				{
					es_xmath takecash * -1
					es playerset cashadd server_var(ac_id) takecash
				}
			}
		}
	}
}

block strip
{
	ifx parse("ac_counter == strip") do
	{
		es_give server_var(ac_id) player_weaponstrip
		es_fire server_var(ac_id) player_weaponstrip strip
		es_give server_var(ac_id) weapon_knife
	}
}

block blind
{
	ifx parse("ac_counter >= blind") do
	{
		es_give server_var(ac_id) env_fade
		es_fire server_var(ac_id) env_fade addoutput "spawnflags 4"
		es_fire server_var(ac_id) env_fade addoutput "duration 1"
		es_fire server_var(ac_id) env_fade addoutput "holdtime 1.2"
		es_fire server_var(ac_id) env_fade addoutput "rendercolor 200 200 200"
		es_fire server_var(ac_id) env_fade addoutput "OnUser1 !self,Fade,-1,0"
		es_fire server_var(ac_id) env_fade FireUser1
	}
}

block slap
{
	ifx true(ac_timer) do
	{
		ifx parse("ac_counter >= slap") do
		{
			// emit hurt sounds
			es_xrand _temp 1 3
			es_xformatv ac_sound "player/damage%1.wav" _temp
			es_emitsound player server_var(ac_id) server_var(ac_sound) 1.0 0.7

			// slap player
			es_xmathparse ac_health "ac_health-health_slap"
			ifx parse("ac_health <= 0") do
			{
				es_sexec server_var(ac_id) kill
				es bot_kill server_var(ac_name)
			}
			else do
			{
				ifx parse("ac_health > min_health") do
				{
					es playerset health server_var(ac_id) server_var(ac_health)
				}
				else do
				{
					es playerset health server_var(ac_id) server_var(min_health)
				}
				ifx true(slap_mode) do
				{
					es_xrand _rand 0 1
					ifx true(_rand) do
					{
						es playerset push server_var(ac_id) -200 200 1
					}
					else do
					{
						es playerset push server_var(ac_id) 200 200 1
					}
				}
			}
		}
	}
}

block beacon
{
	ifx true(ac_timer) do
	{
        ifx parse("ac_counter >= beacon") do
        {
    	    ifx true(beacon_sound) do
    	    {
    	      es_emitsound player server_var(ac_id) server_var(beacon_sound) 1.0 0.7
    	    }
    	    es_splitvectorstring x y z server_var(fA)
    	    es_xmathparse z "z+10"
			if (server_var(anticamp_beacon_type) != 1) do
			{
				es ma_effect 3 server_var(x) server_var(y) server_var(z) 500 75
			}
			if (server_var(anticamp_beacon_type) != 0) do
			{
				es_xset anticamp_team_check 0
				es_getplayerteam anticamp_team_check server_var(ac_id)
				if (server_var(anticamp_team_check) == "2") do
				{
					es_set _r server_var(anticamp_beacon_red)
					es_set _g server_var(anticamp_beacon_green)
					es_set _b server_var(anticamp_beacon_blue)
				}
				else do
				{
					if (server_var(anticamp_team_check) == "3") do
					{
						es_set _r server_var(anticamp_beacon2_red)
						es_set _g server_var(anticamp_beacon2_green)
						es_set _b server_var(anticamp_beacon2_blue)
					}
					else do
					{
						es_xset _r 255
						es_xset _g 255
						es_xset _b 255
					}
				}
				es est_effect 10 #a 0 "sprites/lgtning.vmt" server_var(x) server_var(y) server_var(z) 1 server_var(anticamp_beacon_size) 1 10 50 0 server_var(_r) server_var(_g) server_var(_b) 200 0
			}
    	}
    }
}

event player_spawn
{
	// check if alive
	if (event_var(es_userteam) != 0) do
	{
		ifx false(exclude) do
		{
			es_xdoblock anticamp/add_player
		}
		else do
		{
			es_isbot ac_isbot event_var(userid)
			ifx parse("exclude == 2") do
			{
				ifx false(ac_isbot) do
				{
					es_xdoblock anticamp/add_player
				}
			}
			ifx parse("exclude == 1") do
			{
				ifx true(ac_isbot) do
				{
					es_xdoblock anticamp/add_player
				}
			}
		}
	}
}

block add_player
{
	es_keycreate anticamp event_var(userid)
	es_keysetvalue anticamp event_var(userid) timer "-222"
	es_getplayerprop fA event_var(userid) "CBaseEntity.m_vecOrigin"
	es_keysetvalue anticamp event_var(userid) vectorstr server_var(fA)
}

block round_variables
{
	ifx true(anticamp_lastman) do
	{
		es_xset lastman_t 0
		es_xset lastman_ct 0
	}
	else do
	{
		es_xset lastman_t 1
		es_xset lastman_ct 1	
	}
}

event bomb_abortdefuse
{
	es_keycreate anticamp event_var(userid)
	es_keysetvalue anticamp event_var(userid) timer server_var(camptime)
	es_getplayerprop fA event_var(userid) "CBaseEntity.m_vecOrigin"
	es_keysetvalue anticamp event_var(userid) vectorstr server_var(fA)
}

event round_start
{
	es_xcopy _start_timer start_timer
	es_xdoblock anticamp/round_variables
}

event round_end
{
	es_xset ac_team 0
	if (server_var(ac_mapcat) in server_var(allow_t_camp)) do
	{
		es_xset ac_team 2
	}
	if (server_var(ac_mapcat) in server_var(allow_ct_camp)) do
	{
		es_xset ac_team 3
	}
}

event player_death
{
	// delete user from loop
	es_xdoblock anticamp/check_delete
	es_xdelayed 2 es_xdoblock anticamp/check_delete

	es_xset ct_count 0
	getplayercount ctcount #ct#alive
	es_xmath ctcount - 1
	ifx false(ctcount) do
	{
		ifx false(lastman_ct) do
		{
			es_xmsg #multi #lightgreen Only#green 1#lightgreen player left for the#green Counter Terrorists#lightgreen !
			foreach player tempid #ct#alive "es_keydelete anticamp server_var(tempid)"
			es_xset lastman_ct 1
		}
	}

	es_xset t_count 0
	getplayercount tcount #t#alive
	es_xmath tcount - 1
	ifx false(tcount) do
	{
		ifx false(lastman_t) do
		{
			es_xmsg #multi #lightgreen Only#green 1#lightgreen player left for the#green Terrorists#lightgreen !
			foreach player tempid #t#alive "es_keydelete anticamp server_var(tempid)"
			es_xset lastman_t 1
		}
	}
}

block check_delete
{
	es_xset _temp 0
	es_exists _temp key anticamp event_var(userid)
	ifx true(_temp) do
	{
		es_keydelete anticamp event_var(userid)
	}
}

event player_disconnect
{
	// delete user from loop
	es_exists _temp key anticamp event_var(userid)
	ifx true(_temp) do
	{
		es_keydelete anticamp event_var(userid)
	}
}

event player_team
{
	if (event_var(team) == 1)	// moved to spectators
	{
		// delete user from loop
		es_exists _temp key anticamp event_var(userid)
		ifx true(_temp) do
		{
			es_keydelete anticamp event_var(userid)
		}
	}
}

event bomb_begindefuse
{
	// delete user from loop
	es_exists _temp key anticamp event_var(userid)
	ifx true(_temp) do
	{
		es_keydelete anticamp event_var(userid)
	}
}

event bomb_droped
{
	// allow ct's to camp
	if (server_var(ac_mapcat) notin server_var(allow_ct_camp)) do
	{
		es_xset ac_team 3
	}
}

event bomb_pickup
{
	es_xset ac_team 0
	if (server_var(ac_mapcat) in server_var(allow_t_camp)) do
	{
		es_xset ac_team 2
	}
	if (server_var(ac_mapcat) in server_var(allow_ct_camp)) do
	{
		es_xset ac_team 3
	}
}

event bomb_planted
{
	// allow terrors to camp
	if (server_var(ac_mapcat) notin server_var(allow_t_camp)) do
	{
		es_xset ac_team 2
	}
}