4U      nut scripts/vscripts/interneted_hintmarker main [D  #F   localization q    D  scripts/vscripts director_base_addon >G  b  ;     txt   addoninfo ]a      b      "AddonInfo"
{
     addonSteamAppID         550 //L4D2 Don't Change
     addontitle              "Hint Marker" //Name for Addon Menu
     addonversion            1
     addonauthor             "Interneted"
     addonauthorSteamID      "AUTHOT_STEAM_ID" //Optional. the number of your steam profile URL
     addonDescription        "Hint Marker"
}IncludeScript("interneted_hintmarker/main",getroottable());// spanish, including latino american add upside down exclamation in the beginning.
// french adds extra space before excalamation to uh... follow traditional typography?
PLAYER <-
[
	function(lang)
	{
		switch(lang) // L4D_class_smoker_name
		{
			case "brazilian": 	{ return "Fumacento!"; }
			case "bulgarian": 	{ return "Димящ!"; }
			case "french":		{ return "Smoker !"; }
			case "greek":		{ return "Καπνιστής!"; }
			case "hungarian":	{ return "Füstös!"; }
			case "korean": case "koreana":
			{ return "스모커!"; }
			case("latam"): case("spanish"):
			{ return "¡Smoker!"; }
			case "russian":		{ return "Курильщик!"; }
			case "thai":		{ return "สโมคเกอร์!"; }
			case "ukrainian":	{ return "Курець!"; }
		}
		return "Smoker!";
	},
	function(lang)
	{
		switch(lang) // #L4D_class_boomer_name
		{
			case "brazilian": 	{ return "Gorfo!"; }
			case "bulgarian": 	{ return "Бумтящ!"; }
			case "french":		{ return "Boomer !"; }
			case "greek":		{ return "Φούσκας!"; }
			case "hungarian":	{ return "Pukkancs!"; }
			case "korean": case "koreana":
			{ return "부머!"; }
			case("latam"): case("spanish"):
			{ return "¡Boomer!"; }
			case "russian":		{ return "Толстяк!"; }
			case "thai":		{ return "บูมเมอร์!"; }
			case "ukrainian":	{ return "Товстун!"; }
		}
		return "Boomer!";
	},
	function(lang)
	{
		switch(lang) // #L4D_class_hunter_name
		{
			case "brazilian": 	{ return "Caçador!"; }
			case "bulgarian": 	{ return "Ловец!"; }
			case "french":		{ return "Hunter !"; }
			case "greek":		{ return "Κυνηγός!"; }
			case "hungarian":	{ return "Vadász!"; }
			case "korean": case "koreana":
			{ return "헌터!"; }
			case("latam"): case("spanish"):
			{ return "¡Hunter!"; }
			case "russian":		{ return "Охотник!"; }
			case "thai":		{ return "ฮันเตอร์!"; }
			case "ukrainian":	{ return "Мисливець!"; }
		}
		return "Hunter!";
	},
	function(lang)
	{
		switch(lang) // #L4D_class_spitter_name
		{
			case "brazilian": 	{ return "Cuspidora!"; }
			case "bulgarian": 	{ return "Плюеща!"; }
			case "french":		{ return "Spitter !"; }
			case "greek":		{ return "Τοξική!"; }
			case "hungarian":	{ return "Köpködő!"; }
			case "korean": case "koreana":
			{ return "스피터!"; }
			case("latam"): case("spanish"):
			{ return "¡Spitter!"; }
			case "russian":		{ return "Плевальщица!"; }
			case "thai":		{ return "สปิตเตอร์!"; }
			case "ukrainian":	{ return "Плювальниця!"; }
		}
		return "Spitter!";
	},
	function(lang)
	{
		switch(lang) // #L4D_class_jockey_name
		{
			case "brazilian": 	{ return "Jóquei!"; }
			case "bulgarian": case "russian": case "ukrainian":
			{ return "Жокей!"; }
			case "french":		{ return "Jockey !"; }
			case "greek":		{ return "Αναβάτης!"; }
			case "hungarian":	{ return "Zsoké!"; }
			case "korean": case "koreana":
			{ return "자키!"; }
			case("latam"): case("spanish"):
			{ return "¡Jockey!"; }
			case "thai":		{ return "จ๊อกกี้!"; }
		}
		return "Jockey!";
	},
	function(lang)
	{
		switch(lang) // #L4D_class_charger_name
		{
			case "brazilian": 	{ return "Esmagador!"; }
			case "bulgarian": 	{ return "Щурмовак!"; }
			case "french":		{ return "Charger !"; }
			case "greek":		{ return "Βούβαλος!"; }
			case "hungarian":	{ return "Rohanó!"; }
			case "korean": case "koreana":
			{ return "차저!"; }
			case("latam"): case("spanish"):
			{ return "¡Charger!"; }
			case "russian":		{ return "Громила!"; }
			case "thai":		{ return "ชาร์จเจอร์!"; }
			case "ukrainian":	{ return "Бурмило!"; }
		}
		return "Charger!";
	},
	function(lang)
	{
		switch(lang) // #L4D_class_witch_name
		{
			case "brazilian": 	{ return "Bruxa!"; }
			case "bulgarian": 	{ return "Вещица!"; }
			case "french":		{ return "Witch !"; }
			case "greek":		{ return "Μάγισσα!"; }
			case "hungarian":	{ return "Boszorka!"; }
			case "korean": case "koreana":
			{ return "윗치!"; }
			case("latam"): case("spanish"):
			{ return "¡Witch!"; }
			case "russian":		{ return "Ведьма!"; }
			case "thai":		{ return "วิตช์!"; }
			case "ukrainian":	{ return "Відьма!"; }
		}
		return "Witch!";
	},
	function(lang)
	{
		switch(lang) // #L4D_class_tank_name
		{
			case "brazilian": 	{ return "Tanque!"; }
			case "bulgarian": case "russian": case "ukrainian!":
			{ return "Танк"; }
			case "french":		{ return "Tank !"; }
			case "korean": case "koreana":
			{ return "탱크!"; }
			case("latam"): case("spanish"):
			{ return "¡Tank!"; }
			case "thai":		{ return "แท็งก์!"; }
		}
		return "Tank!";
	}
]

WEAPON <-
{
	weapon_adrenaline = function(lang) // #L4D_Instructor_explain_adrenaline
	{
		switch(lang)
		{
			case "brazilian": case "italian":
			case "polish": case "portuguese":
			{ return "Adrenalina!"; }
			case "bulgarian": case "russian":
			{ return "Адреналин!"; }
			case "czech": case "danish": case "german":
			case "hungarian": case "norwegian": case "swedish": case "turkish":
			{ return "Adrenalin!"; }
			case "finnish":		{ return "Adrenaliini!"; }
			case "french":		{ return "Adrénaline !"; }
			case "greek":		{ return "Αδρεναλίνη!"; }
			case "japanese":	{ return "アドレナリン!"; }
			case "korean":	case("koreana"):
			{ return "아드레날린!"; }
			case "latam": case("spanish"):
			{ return "¡Adrenalina!"; }
			case "romanian":	{ return "Adrenalină!"; }
			case "schinese":	{ return "肾上腺素!"; }
			case "tchinese":	{ return "腎上腺素!"; }
			case "thai":		{ return "อะดรีนาลีน!"; }
			case "ukrainian":	{ return "Адреналін!"; }
		}
		return "Adrenaline!";
	}
	weapon_adrenaline_spawn = @(lang) (weapon_adrenaline(lang)),

	weapon_ammo_spawn = function(lang) // #L4D_Instructor_explain_ammo_resupply or #Gambler_SpotAmmo05 ?
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Munição!"; }
			case "bulgarian": 	{ return "Муниции!"; }
			case "czech":		{ return "Munice!"; }
			case "danish":		{ return "Ammunition!"; }
			case "dutch":		{ return "Munitie!"; }
			case "finnish":		{ return "Ammuksia!"; }
			case "french":		{ return "Munitions !"; }
			case "german":		{ return "Muni!"; }
			case "greek":		{ return "Πυρομαχικά!"; }
			case "hungarian":	{ return "Lőszer!"; }
			case "italian":		{ return "Munizioni!"; }
			case "japanese":	{ return "銃弾だ!"; }
			case "korean": case "koreana":
			{ return "탄약이다!"; }
			case "latam": case "spanish":
			{ return "¡Munición!"; }
			case "polish":		{ return "Amunicja!"; }
			case "portuguese":	{ return "Munições!"; }
			case "romanian":	{ return "Muniție!"; }
			case "russian":		{ return "Боеприпасы!"; }
			case "schinese":	{ return "弹药!"; }
			case "tchinese":	{ return "彈藥!"; }
			case "thai":		{ return "เจอกระสุน!"; }
			case "turkish":		{ return "Cephane!"; }
			case "ukrainian":	{ return "Набої!"; }
			case "vietnamese":	{ return "Đạn!"; }
		}
		return "Ammo!"; // Ammo stash or Ammo ?
	}

	weapon_autoshotgun = function(lang) // #L4D_Instructor_explain_autoshotgun
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Escopeta tática!"; }
			case "bulgarian": 	{ return "Тактическа пушка!"; }
			case "czech":		{ return "Taktická brokovnice!"; }
			case "danish":		{ return "Automatisk haglgevær!"; }
			case "dutch":		{ return "Tactische shotgun!"; }
			case "finnish":		{ return "Taktinen haulikko!"; }
			case "french":		{ return "Fusil à pompe tactique !"; }
			case "german":		{ return "Taktische Shotgun!"; }
			case "greek":		{ return "Αυτόματη καραμπίνα!"; }
			case "hungarian":	{ return "Taktikai sörétes"; }
			case "italian":		{ return "Fucile a pompa tattico!"; }
			case "japanese":	{ return "タクティカルショットガン!"; }
			case "korean":	case "koreana":
			{ return "전술 산탄총!"; }
			case "latam": case "spanish":
			{ return "¡MEscopeta militar!"; }
			case "norwegian":	{ return "Taktisk hagle!"; }
			case "polish":		{ return "Strzelba taktyczna!"; }
			case "portuguese":	{ return "Caçadeira tática!"; }
			case "romanian":	{ return "Pușcă tactică!"; }
			case "russian":		{ return "Дробовик!"; }
			case "schinese":	{ return "战术霰弹枪!"; }
			case "swedish":		{ return "Taktiskt hagelgevär!"; }
			case "tchinese":	{ return "戰術霰彈槍!"; }
			case "thai":		{ return "ปืนลูกซองยุทธวิธี!"; }
			case "turkish":		{ return "Otomatik Av Tüfeği!"; }
			case "ukrainian":	{ return "Тактична рушниця!"; }
			case "vietnamese":	{ return "Shotgun chiến thuật!"; }
		}
		return "Tactical Shotgun!";
	}
	weapon_autoshotgun_spawn = @(lang) (weapon_autoshotgun(lang)),

	weapon_chainsaw = function(lang) // #L4D_Instructor_explain_chainsaw
	{
		switch(lang)
		{
			case "brazilian": case("portuguese"):
			{ return "Motosserra!"; }
			case "bulgarian": 	{ return "Резачка!"; }
			case "czech":		{ return "Motorová pila!"; }
			case "danish":		{ return "Kædesav!"; }
			case "dutch":		{ return "Kettingzaag!"; }
			case "finnish":		{ return "Moottorisaha!"; }
			case "french":		{ return "Tronçonneuse !"; }
			case "german":		{ return "Kettensäge!"; }
			case "greek":		{ return "Αλυσοπρίονο!"; }
			case "hungarian":	{ return "Láncfűrész!"; }
			case "italian":		{ return "Motosega!"; }
			case "japanese":	{ return "チェーンソー!"; }
			case "korean":	case "koreana":
			{ return "전기톱!"; }
			case "latam": case "spanish":
			{ return "¡Motosierra!"; }
			case "norwegian":	{ return "Motorsag!"; }
			case "polish":		{ return "Piła łańcuchowa!"; }
			case "romanian":	{ return "Drujbă!"; }
			case "russian": case "ukrainian":
			{ return "Бензопила!"; }
			case "schinese":	{ return "电锯!"; }
			case "swedish":		{ return "Motorsåg!"; }
			case "tchinese":	{ return "鏈鋸!"; }
			case "thai":		{ return "เลื่อยไฟฟ้า!"; }
			case "turkish":		{ return "Motorlu Testere!"; }
			case "vietnamese":	{ return "Cưa máy!"; }
		}
		return "Chainsaw!";
	}
	weapon_chainsaw_spawn = @(lang) (weapon_chainsaw(lang)),

	weapon_cola_bottles = function(lang) // #L4D2_Instructor_explain_gun_shop_item
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Refrigerante!"; }
			case "bulgarian": case "russian": case "ukrainian":
			{ return "Кола!"; }
			case "czech": case "turkish":
			{ return "Kola!"; }
			case "finnish":		{ return "Kokis!"; }
			case "french":		{ return "Soda !"; }
			case "greek":		{ return "Κόλα!"; }
			case "hungarian":	{ return "Kóla!"; }
			case "japanese":	{ return "コーラ!"; }
			case "korean": case "koreana":
			{ return "콜라!"; }
			case "latam": case "spanish":
			{ return "¡Refresco de cola!"; }
			case "schinese":	{ return "可乐!"; }
			case "tchinese":	{ return "可樂!"; }
			case "thai":		{ return "โคล่า!"; }
		}
		return "Cola!";
	}

	weapon_defibrillator = function(lang) // #L4D_Instructor_explain_defibrillator
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Desfibrilador!"; }
			case "bulgarian": 	{ return "Дефибрилатор!"; }
			case "czech":		{ return "Defibrilátor!"; }
			case "danish":		{ return "Hjertestarter!"; }
			case "finnish":		{ return "Sydäniskuri!"; }
			case "french":		{ return "Défibrillateur !"; }
			case "greek":		{ return "Απινιδωτής!"; }
			case "hungarian":	{ return "Defibrillátor!"; }
			case "italian":		{ return "Defibrillatore!"; }
			case "japanese":	{ return "AED!"; }
			case "korean": case "koreana":
			{ return "심장충격기!"; }
			case "latam": case "spanish":
			{ return "¡Desfibrilador!"; }
			case "polish":		{ return "Defibrylator!"; }
			case "portuguese":	{ return "Desfibrilhador!"; }
			case "romanian":	{ return "Defibrilator!"; }
			case "russian":		{ return "Дефибриллятор!"; }
			case "schinese":	{ return "心脏除颤器!"; }
			case "tchinese":	{ return "電擊器!"; }
			case "thai":		{ return "เครื่องกระตุ้นหัวใจ!"; }
			case "turkish":		{ return "Defibrilatör!"; }
			case "ukrainian":	{ return "Дефібрилятор!"; }
			case "vietnamese":	{ return "Máy khử rung tim!"; }
		}
		return "Defibrillator!";
	}
	weapon_defibrillator_spawn = @(lang) (weapon_defibrillator(lang)),

	weapon_fireworkcrate = function(lang) // DeepL
	{
		switch(lang)
		{
			case "brazilian": case "portuguese":
			{ return "Caixa de fogos de artifício!"; }
			case "bulgarian": 	{ return "Кашон с фойерверки!"; }
			case "czech":		{ return "Bedna s ohňostrojem!"; }
			case "danish":		{ return "Fyrværkerikasse!"; }
			case "dutch":		{ return "Vuurwerkkist!"; }
			case "finnish":		{ return "Ilotulituslaatikko!"; }
			case "french":		{ return "Une caisse de feux d'artifice !"; }
			case "german":		{ return "Feuerwerkskiste!"; }
			case "greek":		{ return "Κιβώτιο πυροτεχνημάτων!"; }
			case "hungarian":	{ return "Tűzijátékos láda!"; }
			case "italian":		{ return "Cassa di fuochi d'artificio!"; }
			case "japanese":	{ return "花火の箱!"; }
			case "korean": case "koreana":
			{ return "불꽃놀이 상자!"; }
			case "latam": case "spanish":
			{ return "¡Caja de fuegos artificiales!"; }
			case "norwegian":	{ return "Fyrverkerikasse!"; }
			case "polish":		{ return "Skrzynia z fajerwerkami!"; }
			case "romanian":	{ return "Cutie cu artificii!"; }
			case "russian":		{ return "Ящик с фейерверками!"; }
			case "schinese":	{ return "烟花箱!"; }
			case "swedish":		{ return "Fyrverkerilåda!"; }
			case "tchinese":	{ return "煙火箱!"; }
			case "thai":		{ return "กล่องดอกไม้ไฟ!"; }
			case "turkish":		{ return "Havai fişek sandığı!"; }
			case "ukrainian":	{ return "Ящик з феєрверками!"; }
			case "vietnamese":	{ return "Hộp pháo hoa!"; }
		}
		return "Fireworks!";
	}

	weapon_first_aid_kit = function(lang) // #L4D_Instructor_explain_first_aid
	{
		switch(lang)
		{
			case "brazilian": case "portuguese":
			{ return "Primeiros socorros!"; }
			case "bulgarian": case "russian": case "ukrainian":
			{ return "Аптечка!"; }
			case "czech":		{ return "Lékárnička!"; }
			case "danish":		{ return "Førstehjælp!"; }
			case "dutch":		{ return "EHBO-doos!"; }
			case "finnish":		{ return "Ensiapu!"; }
			case "french":		{ return "Kit de soins !"; }
			case "german":		{ return "Verbandszeug!" }
			case "greek":		{ return "Πρώτες βοήθειες!"; }
			case "hungarian":	{ return "Mentőláda!"; }
			case "italian":		{ return "Pronto soccorso!"; }
			case "japanese":	{ return "救急キット!"; }
			case "korean": case "koreana":
			{ return "응급처치 도구!"; }
			case "latam": case "spanish":
			{ return "¡Botiquín!"; }
			case "norwegian":	{ return "Førstehjelp!"; }
			case "polish":		{ return "Apteczka!"; }
			case "romanian":	{ return "Prim ajutor!"; }
			case "schinese":	{ return "急救!"; }
			case "swedish":		{ return "Första hjälpen!"; }
			case "tchinese":	{ return "急救包!"; }
			case "thai":		{ return "ชุดปฐมพยาบาล!"; }
			case "turkish":		{ return "İlk yardım!"; }
			case "vietnamese":	{ return "Bộ sơ cứu!"; }
		}
		return "First aid kit!";
	}
	weapon_first_aid_kit_spawn = @(lang) (weapon_first_aid_kit(lang)),

	weapon_gascan = function(lang) // #L4D2_Instructor_explain_c1m4_finale2 + DeepL
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Gasolina!"; }
			case "bulgarian": 	{ return "Канистра с бензином!"; }
			case "czech":		{ return "Kanystr s benzínem!"; }
			case "danish":		{ return "Benzindunk!"; }
			case "dutch":		{ return "Benzine!"; } // one of the files says Jerrycan, tf
			case "finnish":		{ return "Bensakanisteri!"; }
			case "french":		{ return "L'essence !"; }
			case "german":		{ return "Benzinkanister!"; }
			case "greek":		{ return "Δοχείο βενζίνης!"; }
			case "hungarian":	{ return "Benzines kannát!"; }
			case "italian":		{ return "Tanica di carburante!"; }
			case "japanese":	{ return "燃料タンク!"; }
			case "korean": case "koreana":
			{ return "기름통!"; }
			case "latam": case "spanish":
			{ return "¡Lata de gasolina!"; }
			case "norwegian":	{ return "Bensinkanne!"; }
			case "polish":		{ return "Kanister z benzyną!"; }
			case "portuguese":	{ return "Bidão de combustível!"; }
			case "romanian":	{ return "Canistră cu benzină!"; }
			case "russian":		{ return "Канистру под бензин!"; }
			case "schinese": case "tchinese":
			{ return "汽油桶!"; }
			case "swedish":		{ return "Bensindunk"; }
			case "thai":		{ return "ถังน้ำมัน!"; }
			case "turkish":		{ return "Yakıt bidonu!"; }
			case "ukrainian":	{ return "Каністру!"; }
			case "vietnamese":	{ return "Can xăng!"; }
		}
		return "Gas can!";
	}
	weapon_gascan_spawn = @(lang) (weapon_gascan(lang)),

	weapon_gnome = function(lang) // #ACH_GNOME_RESCUE_DESC + DeepL
	{
		switch(lang)
		{
			case "brazilian": case "portuguese":
			{ return "Gnomo Chompski!"; }
			case "bulgarian": 	{ return "Гнома Чомпски!"; }
			case "czech":		{ return "Trpaslíka Chompského!"; }
			case "dutch":		{ return "Kabouter Chompski!"; }
			case "french":		{ return "Nain Chompski !"; }
			case "greek":		{ return "Νάνο Chompski!"; }
			case "hungarian":	{ return "Chompski törpét!"; }
			case "italian":		{ return "Gnomo Chomsky!"; }
			case "japanese":	{ return "チョムスキ!"; }
			case "korean":		{ return "촘스키를!"; }
			case "koreana":		{ return "촘스키를!"; }
			case "latam":		{ return "Gnomo Chompski!"; }
			case "polish":		{ return "Krasnala Chompskiego!"; }
			case "romanian":	{ return "Piticul Chompski!"; }
			case "russian":		{ return "Гнома Чомски!"; }
			case "schinese":	{ return "侏儒Chompski!"; }
			case "spanish":		{ return "Gnomo Chompski!"; }
			case "tchinese":	{ return "金色小矮人(Gnome Chompski)!"; }
			case "thai":		{ return "ภูตโนมชอมป์สกี้!"; }
			case "turkish":		{ return "Bahçe cinini!"; }
			case "ukrainian":	{ return "Гнома Чомпскі!"; }
			case "vietnamese":	{ return "Thần lùn Chompski!"; }
		}
		return "Gnome Chompski!";
	}

	weapon_grenade_launcher = function(lang) // #L4D_Instructor_explain_grenade_launcher
	{
		switch(lang)
		{
			case "brazilian": case "portuguese":
			{ return "Lança-granadas!"; }
			case "bulgarian": case "russian": case "ukrainian":
			{ return "Гранатомет!"; }
			case "czech":		{ return "Granátomet!"; }
			case "danish": case "norwegian":
			{ return "Granatkaster!"; }
			case "dutch":		{ return "Granaatwerper!"; }
			case "finnish":		{ return "Kranaatinheitin!"; }
			case "french":		{ return "Lance-grenades !"; }
			case "german":		{ return "Granatwerfer!"; }
			case "greek":		{ return "Εκτοξευτήρας χειροβομβίδων!"; }
			case "hungarian":	{ return "Gránátvető!"; }
			case "italian":		{ return "Lanciagranate!"; }
			case "japanese":	{ return "グレネードランチャー!"; }
			case "korean": case "koreana":
			{ return "유탄 발사기!"; }
			case "latam": case "spanish":
			{ return "¡Lanzagranadas!"; }
			case "polish":		{ return "Granatnik!"; }
			case "romanian":	{ return "Lansator de grenade!"; }
			case "schinese":	{ return "榴弹发射器!"; }
			case "swedish":		{ return "Granatkastare!"; }
			case "tchinese":	{ return "榴彈發射器!"; }
			case "thai":		{ return "ปืนยิงลูกระเบิด!"; }
			case "turkish":		{ return "Bomba Atar!"; }
			case "vietnamese":	{ return "Súng phóng lựu"; }
		}
		return "Grenade Launcher!";
	}
	weapon_grenade_launcher_spawn = @(lang) (weapon_grenade_launcher(lang)),

	weapon_hunting_rifle = function(lang) // #L4D_Instructor_explain_hunting_rifle
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Rifle de caça!"; }
			case "bulgarian": 	{ return "Ловна винтовка!"; }
			case "czech":		{ return "Lovecká puška!"; }
			case "danish":		{ return "Jagtriffel!"; }
			case "dutch":		{ return "Jachtgeweer!"; }
			case "finnish":		{ return "Metsästyskivääri!"; }
			case "french":		{ return "Fusil de chasse !"; }
			case "german":		{ return "Jagdgewehr!"; }
			case "greek":		{ return "Κυνηγετική καραμπίνα!"; }
			case "hungarian":	{ return "Vadászpuska!"; }
			case "italian":		{ return "Fucile da caccia!"; }
			case "japanese":	{ return "ハンティングライフル!"; }
			case "korean": case "koreana":
			{ return "사냥용 라이플!"; }
			case "latam": case "spanish":
			{ return "¡Rifle de caza!"; }
			case "norwegian":	{ return "Jaktgevær!"; }
			case "polish":		{ return "Karabin myśliwski!"; }
			case "portuguese":	{ return "Espingarda de caça!"; }
			case "romanian":	{ return "Armă de vânătoare!"; }
			case "russian":		{ return "Охотничье ружье!"; }
			case "schinese":	{ return "猎枪!"; }
			case "swedish":		{ return "Jaktgevär!"; }
			case "tchinese":	{ return "獵槍!"; }
			case "thai":		{ return "ปืนไรเฟิลล่าสัตว์!"; }
			case "turkish":		{ return "Avcı Tüfeği!"; }
			case "ukrainian":	{ return "Мисливська гвинтівка!"; }
			case "vietnamese":	{ return "Súng săn!"; }
		}
		return "Hunting Rifle!";
	}
	weapon_hunting_rifle_spawn = @(lang) (weapon_hunting_rifle(lang)),

	weapon_molotov = function(lang) // #L4D_Instructor_explain_molotov
	{
		switch(lang)
		{
			case "bulgarian": case "russian": case "ukrainian":
			{ return "Молотов!"; }
			case "danish": case "dutch":
			{ return "Molotovcocktail!"; }
			case "french":		{ return "Molotov !"; }
			case "german":		{ return "Molotowcocktail!"; }
			case "greek":		{ return "Μολότοφ!"; }
			case "hungarian":	{ return "Molotov-koktél!"; }
			case "japanese":	{ return "火炎瓶!"; }
			case "korean":		{ return "화염병!"; }
			case "koreana":		{ return "화염병!"; }
			case "latam": case "spanish":
			{ return "¡Molotov!"; }
			case "polish":		{ return "Mołotow!"; }
			case "schinese":	{ return "燃烧瓶!"; }
			case "tchinese":	{ return "汽油彈!"; }
			case "thai":		{ return "ระเบิดขวด!"; }
			case "turkish":		{ return "Molotof!"; }
			case "vietnamese":	{ return "Bom xăng!"; }
		}
		return "Molotov!";
	}
	weapon_molotov_spawn = @(lang) (weapon_molotov(lang)),

	weapon_oxygentank = function(lang) // DeepL
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Bomba de oxigênio!"; }
			case "bulgarian": 	{ return "Бутилка с кислород!"; }
			case "czech":		{ return "Kyslíková láhev!"; }
			case "danish":		{ return "Iltflaske!"; }
			case "dutch":		{ return "Zuurstoftank!"; }
			case "finnish":		{ return "Happisäiliö!"; }
			case "french":		{ return "Bouteille d'oxygène !"; }
			case "german":		{ return "Sauerstoffflasche!"; }
			case "greek":		{ return "Φιάλη οξυγόνου!"; }
			case "hungarian":	{ return "Oxigéntartály!"; }
			case "italian":		{ return "Bombola di ossigeno!"; }
			case "japanese":	{ return "酸素ボンベ！"; }
			case "korean": case "koreana":
			{ return "산소 탱크!"; }
			case "latam": case "spanish":
			{ return "¡Botella de oxígeno!"; }
			case "norwegian":	{ return "Oksygentank!"; }
			case "polish":		{ return "Butla z tlenem!"; }
			case "portuguese":	{ return "Bomba de oxigénio!"; }
			case "romanian":	{ return "Butelie de oxigen!"; }
			case "russian":		{ return "Кислородный баллон!"; }
			case "schinese":	{ return "氧气罐!"; }
			case "swedish":		{ return "Syretank!"; }
			case "tchinese":	{ return "氧氣瓶!"; }
			case "thai":		{ return "ถังออกซิเจน!"; }
			case "turkish":		{ return "Oksijen tüpü!"; }
			case "ukrainian":	{ return "Кіслородний балон!"; }
			case "vietnamese":	{ return "Bình oxy!"; }
		}
		return "Oxygen tank!";
	}

	weapon_pain_pills = function(lang) // #L4D_Instructor_explain_pills
	{
		switch(lang)
		{
			case "brazilian": case "portuguese":
			{ return "Analgésicos!"; }
			case "bulgarian": 	{ return "Болкоуспокояващи!"; }
			case "czech":		{ return "Prášky proti bolesti!"; }
			case "danish":		{ return "Smertestillende piller!"; }
			case "dutch":		{ return "Pijnstillers!"; }
			case "finnish":		{ return "Kipulääke!"; }
			case "french":		{ return "Cachets anti-douleur !"; }
			case "german":		{ return "Schmerzmittel!"; }
			case "greek":		{ return "Παυσίπονα!"; }
			case "hungarian":	{ return "Fájdalomcsillapító!"; }
			case "italian":		{ return "Antidolorifici!"; }
			case "japanese":	{ return "鎮痛剤!"; }
			case "korean": case "koreana":
			{ return "진통제!"; }
			case "latam": case "spanish":
			{ return "¡Píldoras analgésicas!"; }
			case "norwegian":	{ return "Smertestillende tabletter!"; }
			case "polish":		{ return "Środki przeciwbólowe!"; }
			case "romanian":	{ return "Analgezice!"; }
			case "russian":		{ return "Обезболивающее!"; }
			case "schinese":	{ return "止痛药!"; }
			case "swedish":		{ return "Värktabletter!"; }
			case "tchinese":	{ return "止痛藥!"; }
			case "thai":		{ return "ยาแก้ปวด!"; }
			case "turkish":		{ return "Ağrı Kesici!"; }
			case "ukrainian":	{ return "Знеболювальні!"; }
			case "vietnamese":	{ return "Thuốc giảm đau!"; }
		}
		return "Pain Pills!";
	}
	weapon_pain_pills_spawn = @(lang) (weapon_pain_pills(lang)),

	weapon_pipe_bomb = function(lang) // #L4D_Instructor_explain_pipebomb
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Bomba caseira!"; }
			case "bulgarian": 	{ return "Тръбна бомба!"; }
			case "czech":		{ return "Trubková bomba!"; }
			case "danish": case "norwegian":
			{ return "Rørbombe!"; }
			case "dutch":		{ return "Pijpbom!"; }
			case "finnish":		{ return "Putkipommi!"; }
			case "french":		{ return "Bombe artisanale !"; }
			case "german":		{ return "Rohrbombe!"; }
			case "greek":		{ return "Αυτοσχέδια βόμβα!"; }
			case "hungarian":	{ return "Csőbomba!"; }
			case "italian":		{ return "Tubo-bomba!"; }
			case "japanese":	{ return "パイプ爆弾!"; }
			case "korean": case "koreana":
			{ return "파이프 폭탄!"; }
			case "latam": case "spanish":
			{ return "¡Bomba casera!"; }
			case "polish":		{ return "Rurobomba!"; }
			case "portuguese":	{ return "Bomba de tubo!"; }
			case "romanian":	{ return "Bombă artizanală!"; }
			case "russian":		{ return "Бомба!"; }
			case "schinese":	{ return "土制炸弹!"; }
			case "swedish":		{ return "Rörbomb!"; }
			case "tchinese":	{ return "土製鐵管炸彈!"; }
			case "thai":		{ return "ระเบิดท่อแป๊ป!"; }
			case "turkish":		{ return "Alarmlı bomba!"; }
			case "ukrainian":	{ return "Саморобна бомба!"; }
			case "vietnamese":	{ return "Bom ống!"; }
		}
		return "Pipe Bomb!";
	}
	weapon_pipe_bomb_spawn = @(lang) (weapon_pipe_bomb(lang)),

	weapon_pistol_magnum = function(lang) // #L4D2_Instructor_explain_magnum_pistol
	{
		switch(lang)
		{
			case "brazilian": case "italian": case "portuguese":
			{ return "Pistola Magnum!"; }
			case "bulgarian": 	{ return "Пистолет Магнум!"; }
			case "czech":		{ return "Pistole Magnum!"; }
			case "danish": case "dutch": case "german":
			{ return "Magnum!"; }
			case "finnish":		{ return "Magnum-pistooli!"; }
			case "french":		{ return "Magnum !"; }
			case "greek":		{ return "Πιστόλι Magnum!"; }
			case "hungarian":	{ return "Magnum pisztoly!"; }
			case "japanese":	{ return "マグナムピストル!"; }
			case "korean": case "koreana":
			{ return "매그넘 권총!"; }
			case "latam": case "spanish":
			{ return "¡Pistola Magnum!"; }
			case "norwegian": case "swedish":
			{ return "Magnumpistol!"; }
			case "polish":		{ return "Pistolet Magnum!"; }
			case "russian":		{ return "Пистолет «Магнум»!"; }
			case "schinese":	{ return "马格南手枪!"; }
			case "tchinese":	{ return "麥格農手槍!"; }
			case "thai":		{ return "ปืนแม็กนั่ม!"; }
			case "turkish":		{ return "Magnum Tabanca!"; }
			case "ukrainian":	{ return "Пістолет «Магнум»!"; }
			case "vietnamese":	{ return "Súng Lục Magnum!"; }
		}
		return "Magnum Pistol!";
	}
	weapon_pistol_magnum_spawn = @(lang) (weapon_pistol_magnum(lang)),

	weapon_pistol = function(lang) // #L4D_Instructor_explain_pistol
	{
		switch(lang)
		{
			case "brazilian": case "italian": case "portuguese":
			{ return "Pistola!"; }
			case "bulgarian": case "russian":
			{ return "Пистолет!"; }
			case "czech": case "german":
			{ return "Pistole!"; }
			case "dutch":		{ return "Pistool!"; }
			case "finnish":		{ return "Pistooli!"; }
			case "french":		{ return "Pistolet !"; }
			case "greek":		{ return "Πιστόλι!"; }
			case "hungarian":	{ return "Pisztoly!"; }
			case "japanese":	{ return "ピストル!"; }
			case "korean": case "koreana":
			{ return "권총!"; }
			case "latam": case "spanish":
			{ return "¡Pistola!"; }
			case "polish":		{ return "Pistolet!"; }
			case "schinese":	{ return "手枪!"; }
			case "tchinese":	{ return "手槍!"; }
			case "thai":		{ return "ปืนพก!"; }
			case "turkish":		{ return "Tabanca!"; }
			case "ukrainian":	{ return "Пістолет!"; }
			case "vietnamese":	{ return "Súng lục!"; }
		}
		return "Pistol!";
	}
	weapon_pistol_spawn = @(lang) (weapon_pistol(lang)),

	weapon_propanetank = function(lang) // DeepL
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Tanque de propano!"; }
			case "bulgarian": 	{ return "Бутилка за пропан!"; }
			case "czech":		{ return "Propanová láhev!"; }
			case "danish": case "norwegian": case "swedish":
			{ return "Propantank!"; }
			case "dutch":		{ return "Propaantank!"; }
			case "finnish":		{ return "Propaanisäiliö!"; }
			case "french":		{ return "Bouteille de propane !"; }
			case "german":		{ return "Propangastank!"; }
			case "greek":		{ return "Δοχείο προπανίου!"; }
			case "hungarian":	{ return "Propánpalack!"; }
			case "italian":		{ return "Bombola di propano!"; }
			case "japanese":	{ return "プロパンタンク!"; }
			case "korean": case "koreana":
			{ return "프로판 탱크!"; }
			case "latam":		{ return "¡Tanque de propano!"; }
			case "polish":		{ return "Zbiornik na propan!"; }
			case "portuguese":	{ return "Depósito de propano!"; }
			case "romanian":	{ return "Rezervor de propan!"; }
			case "russian":		{ return "Баллон с пропаном!"; }
			case "schinese":	{ return "丙烷罐!"; }
			case "spanish":		{ return "¡Depósito de propano!"; }
			case "tchinese":	{ return "丙烷氣瓶!"; }
			case "thai":		{ return "ถังแก๊สโพรเพน!"; }
			case "turkish":		{ return "Propan tüpü!"; }
			case "ukrainian":	{ return "Балон з пропаном!"; }
			case "vietnamese":	{ return "Bình gas propan!"; }
		}
		return "Propane tank!";
	}

	weapon_pumpshotgun = function(lang) // #L4D_Instructor_explain_pumpshotgun
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Escopeta!"; }
			case "bulgarian": 	{ return "Помпа!"; }
			case "czech":		{ return "Brokovnice!"; }
			case "danish": case "german":
			{ return "Pumpgun!"; }
			case "dutch":		{ return "Shotgun!"; }
			case "finnish":		{ return "Pumppuhaulikko!"; }
			case "french":		{ return "Fusil à pompe !"; }
			case "greek":		{ return "Επαναληπτική καραμπίνα!"; }
			case "hungarian":	{ return "Pumpamechanikás sörétes!"; }
			case "italian":		{ return "Fucile a pompa!"; }
			case "japanese":	{ return "ポンプ式ショットガン!"; }
			case "korean": case "koreana":
			{ return "펌프식 산탄총!"; }
			case "latam": case "spanish":
			{ return "¡Escopeta corredera!"; }
			case "norwegian":	{ return "Pumpehagle!"; }
			case "polish":		{ return "Strzelba pump action!"; }
			case "portuguese":	{ return "Caçadeira!"; }
			case "romanian":	{ return "Pușcă cu pompă!"; }
			case "russian":		{ return "Помповое ружье!"; }
			case "schinese":	{ return "泵动式霰弹枪!"; }
			case "swedish":		{ return "Pumphagelgevär!"; }
			case "tchinese":	{ return "霰彈槍!"; }
			case "thai":		{ return "ปืนลูกซองชัก!"; }
			case "turkish":		{ return "Pompalı av tüfeği!"; }
			case "ukrainian":	{ return "Помпова рушниця!"; }
			case "vietnamese":	{ return "Shotgun bơm!"; }
		}
		return "Pump Shotgun!";
	}
	weapon_pumpshotgun_spawn = @(lang) (weapon_pumpshotgun(lang)),

	weapon_rifle_ak47 = function(lang) // #L4D_Instructor_explain_rifle_ak47
	{
		switch(lang)
		{
			case "french":		{ return "AK-47 !"; }
			case "hungarian":	{ return "AK-47-es!"; }
			case "latam": case "spanish":
			{ return "¡AK-47!"; }
			case "swedish":		{ return "AK-47:a!"; }
		}
		return "AK-47!";
	}
	weapon_rifle_ak47_spawn = @(lang) (weapon_rifle_ak47(lang)),

	weapon_rifle_desert = function(lang) // #L4D_Instructor_explain_rifle_desert
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Rifle de combate!"; }
			case "bulgarian": 	{ return "Бойна винтовка!"; }
			case "czech":		{ return "Bojová puška!"; }
			case "danish":		{ return "Kampriffel!"; }
			case "dutch":		{ return "Combatgeweer!"; }
			case "finnish":		{ return "Taistelukivääri!"; }
			case "french":		{ return "Fusil de combat !"; }
			case "greek":		{ return "Τουφέκι μάχης!"; }
			case "hungarian":	{ return "Rohamkarabély!"; }
			case "italian":		{ return "Fucile militare!"; }
			case "japanese":	{ return "コンバットライフル!"; }
			case "korean": case "koreana":
			{ return "전투용 라이플!"; }
			case "latam": case "spanish":
			{ return "¡Rifle de combate!"; }
			case "norwegian":	{ return "Kamprifle!"; }
			case "polish":		{ return "Karabin bojowy!"; }
			case "portuguese":	{ return "Espingarda de combate!"; }
			case "romanian":	{ return "Armă de asalt camuflată!"; }
			case "russian":		{ return "Боевая винтовка!"; }
			case "schinese":	{ return "战斗步枪!"; }
			case "swedish":		{ return "Stridsgevär!"; }
			case "tchinese":	{ return "戰鬥步槍!"; }
			case "thai":		{ return "ปืนไรเฟิลต่อสู้!"; }
			case "turkish":		{ return "Muharebe Tüfeği!"; }
			case "ukrainian":	{ return "Бойова гвинтівка!"; }
			case "vietnamese":	{ return "Súng trường giao tranh!"; }
		}
		return "Combat Rifle!";
	}
	weapon_rifle_desert_spawn = @(lang) (weapon_rifle_desert(lang)),

	weapon_rifle = function(lang) // #L4D_Instructor_explain_rifle
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Rifle de assalto M-16!"; }
			case "bulgarian": 	{ return "Автомат М-16!"; }
			case "czech":		{ return "Útočná puška M-16!"; }
			case "danish":		{ return "M-16 karabin!"; }
			case "dutch":		{ return "M-16 aanvalsgeweer!"; }
			case "finnish":		{ return "M-16-rynnäkkökivääri!"; }
			case "french":		{ return "Fusil d'assaut M-16 !"; }
			case "german":		{ return "M-16-Sturmgewehr!"; }
			case "greek":		{ return "Τυφέκιο εφόδου M-16!"; }
			case "hungarian":	{ return "M-16-os gépkarabély!"; }
			case "italian":		{ return "Fucile d'assalto M-16!"; }
			case "japanese":	{ return "M-16アサルトライフル!"; }
			case "korean": case "koreana":
			{ return "M-16 돌격용 라이플!"; }
			case "latam": case "spanish":
			{ return "¡Rifle de asalto M-16!"; }
			case "norwegian":	{ return "M-16-automatgevær!"; }
			case "polish":		{ return "Karabin szturmowy M-16!"; }
			case "portuguese":	{ return "Espingarda de assalto M-16!"; }
			case "romanian":	{ return "Armă de asalt M-16!"; }
			case "russian":		{ return "Штурмовая винтовка M16!"; }
			case "schinese":	{ return "M-16 突击步枪!"; }
			case "swedish":		{ return "M-16-automatgevär!"; }
			case "tchinese":	{ return "M-16 突擊步槍!"; }
			case "thai":		{ return "ปืนไรเฟิลจู่โจม M-16!"; }
			case "turkish":		{ return "M-16 taarruz tüfeği!"; }
			case "ukrainian":	{ return "Штурмова гвинтівка М-16!"; }
			case "vietnamese":	{ return "Súng trường tấn công M-16!"; }
		}
		return "M-16 Assault Rifle!";
	}
	weapon_rifle_spawn = @(lang) (weapon_rifle(lang)),

	weapon_rifle_m60 = function(lang) //
	{
		switch(lang)
		{
			case "french":		{ return "M60 !"; }
			case "latam": case "spanish":
			{ return "M60!"; }
		}
		return "M60!";
	}
	weapon_rifle_m60_spawn = @(lang) (weapon_rifle_m60(lang)),

	weapon_rifle_sg552 = function(lang) //
	{
		switch(lang)
		{
			case "french":		{ return "SG 552 !"; }
			case "latam": case "spanish":
			{ return "¡SG 552!"; }
		}
		return "SG 552!";
	}
	weapon_rifle_sg552_spawn = @(lang) (weapon_rifle_sg552(lang)),

	weapon_scavenge_item_spawn = @(lang) (weapon_gascan(lang)),

	weapon_shotgun_chrome = function(lang) // #L4D_Instructor_explain_shotgun_chrome
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Escopeta cromada!"; }
			case "bulgarian": 	{ return "Хромирана пушка!"; }
			case "czech":		{ return "Chromovaná brokovnice!"; }
			case "danish":		{ return "Forkromet haglgevær!"; }
			case "dutch":		{ return "Chromen shotgun!"; }
			case "finnish":		{ return "Kromattu haulikko!"; }
			case "french":		{ return "Fusil chromé !"; }
			case "greek":		{ return "Καραμπίνα χρωμίου!"; }
			case "hungarian":	{ return "Krómozott sörétes!"; }
			case "italian":		{ return "Fucile a pompa cromato!"; }
			case "japanese":	{ return "クロームショットガン!"; }
			case "korean": case "koreana":
			{ return "크롬 산탄총!"; }
			case "latam": case "spanish":
			{ return "¡Escopeta cromada!"; }
			case "norwegian":	{ return "Kromhagle!"; }
			case "polish":		{ return "Chromowana strzelba!"; }
			case "portuguese":	{ return "Caçadeira cromada!"; }
			case "romanian":	{ return "Pușcă cromată!"; }
			case "russian":		{ return "Хромированный дробовик!"; }
			case "schinese":	{ return "铬管霰弹枪!"; }
			case "swedish":		{ return "Kromat hagelgevär!"; }
			case "tchinese":	{ return "鉻鋼霰彈槍!"; }
			case "thai":		{ return "ลูกซองชุบโครเมียม!"; }
			case "turkish":		{ return "Krom Av Tüfeği!"; }
			case "ukrainian":	{ return "Хромована рушниця!"; }
			case "vietnamese":	{ return "Shotgun Chrome!"; }
		}
		return "Chrome Shotgun!";
	}
	weapon_shotgun_chrome_spawn = @(lang) (weapon_shotgun_chrome(lang)),

	weapon_shotgun_spas = function(lang) // #L4D_Instructor_explain_shotgun_spas
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Escopeta de combate!"; }
			case "bulgarian": 	{ return "Бойна пушка!"; }
			case "czech":		{ return "Bojová brokovnice!"; }
			case "danish":		{ return "SPAS-gevær!"; }
			case "dutch":		{ return "Combatshotgun!"; }
			case "finnish":		{ return "Taisteluhaulikko!"; }
			case "french":		{ return "Fusil à pompe d'assaut !"; }
			case "greek":		{ return "Στρατιωτική καραμπίνα!"; }
			case "hungarian":	{ return "Sörétes rohampuska!"; }
			case "italian":		{ return "Fucile a pompa militare!"; }
			case "japanese":	{ return "コンバットショットガン!"; }
			case "korean": case "koreana":
			{ return "전투용 산탄총!"; }
			case "latam": case "spanish":
			{ return "¡Escopeta de combate!"; }
			case "norwegian":	{ return "Kamphagle!"; }
			case "polish":		{ return "Strzelba bojowa!"; }
			case "portuguese":	{ return "Caçadeira de combate!"; }
			case "romanian":	{ return "Pușcă de luptă!"; }
			case "russian":		{ return "Боевой дробовик!"; }
			case "schinese":	{ return "战斗霰弹枪!"; }
			case "swedish":		{ return "Stridshagelgevär!"; }
			case "tchinese":	{ return "戰鬥霰彈槍!"; }
			case "thai":		{ return "ปืนลูกซองต่อสู้!"; }
			case "turkish":		{ return "Spas Model Av Tüfeği!"; }
			case "ukrainian":	{ return "Бойова рушниця!"; }
			case "vietnamese":	{ return "Shotgun giao tranh!"; }
		}
		return "Combat Shotgun!";
	}
	weapon_shotgun_spas_spawn = @(lang) (weapon_shotgun_spas(lang)),

	weapon_smg_mp5 = function(lang) //
	{
		switch(lang)
		{
			case "french":		{ return "MP5 !"; }
			case "latam": case "spanish":
			{ return "¡MP5!"; }
		}
		return "MP5!";
	}
	weapon_smg_mp5_spawn = @(lang) (weapon_smg_mp5(lang)),

	weapon_smg_silenced = function(lang) // #L4D_Instructor_explain_smg_silenced
	{
		switch(lang)
		{
			case "brazilian": case "portuguese":
			{ return "Submetralhadora com silenciador!"; }
			case "bulgarian": 	{ return "Автомат със заглушител!"; }
			case "czech":		{ return "Samopal s tlumičem!"; }
			case "danish":		{ return "Maskinpistol med lyddæmper!"; }
			case "dutch":		{ return "Gedempt Machinepistool!"; }
			case "finnish":		{ return "Vaimennettu konepistooli!"; }
			case "french":		{ return "Mitrailleuse à silencieux !"; }
			case "german":		{ return "Schallgedämpfte Maschinenpistole!"; }
			case "greek":		{ return "Υποπολυβόλο με σιγαστήρα!"; }
			case "hungarian":	{ return "Hangtompítós géppisztoly!"; }
			case "italian":		{ return "Pistola mitragliatrice con silenziatore!"; }
			case "japanese":	{ return "サイレンサー付きサブマシンガン!"; }
			case "korean": case "koreana":
			{ return "소음기가 달린 SMG!"; }
			case "latam": case "spanish":
			{ return "¡Metralleta con silenciador!"; }
			case "norwegian":	{ return "Maskinpistol med lyddemper!"; }
			case "polish":		{ return "Pistolet maszynowy z tłumikiem!"; }
			case "romanian":	{ return "Pistol-mitralieră cu amortizor!"; }
			case "russian":		{ return "Автомат с глушителем!"; }
			case "schinese":	{ return "消音冲锋枪!"; }
			case "swedish":		{ return "Ljuddämpad k-pist!"; }
			case "tchinese":	{ return "滅音衝鋒槍!"; }
			case "thai":		{ return "ปืนกลมือเก็บเสียง!"; }
			case "turkish":		{ return "Susturuculu Hafif Makineli Silah!"; }
			case "ukrainian":	{ return "Пістолет-кулемет із глушником!"; }
			case "vietnamese":	{ return "Súng tiểu liên giảm thanh!"; }
		}
		return "Silenced Submachine Gun!";
	}
	weapon_smg_silenced_spawn = @(lang) (weapon_smg_silenced(lang)),

	weapon_smg = function(lang) // #L4D_Instructor_explain_smg
	{
		switch(lang)
		{
			case "brazilian": case "portuguese":
			{ return "Submetralhadora!"; }
			case "bulgarian": case "russian":
			{ return "Автомат!"; }
			case "czech":		{ return "Samopal!"; }
			case "danish": case "norwegian":
			{ return "Maskinpistol!"; }
			case "dutch":		{ return "Machinepistool!"; }
			case "finnish":		{ return "Konepistooli!"; }
			case "french":		{ return "Mitrailleuse !"; }
			case "german":		{ return "Maschinenpistole!"; }
			case "greek":		{ return "Υποπολυβόλο όπλο!"; }
			case "hungarian":	{ return "Géppisztoly!"; }
			case "italian":		{ return "Pistola mitragliatrice!"; }
			case "japanese":	{ return "サブマシンガン!"; }
			case "korean": case "koreana":
			{ return "SMG!"; }
			case "latam": case "spanish":
			{ return "¡Metralleta!"; }
			case "polish":		{ return "Pistolet maszynowy!"; }
			case "romanian":	{ return "Pistol-mitralieră!"; }
			case "schinese":	{ return "冲锋枪!"; }
			case "swedish":		{ return "K-pist!"; }
			case "tchinese":	{ return "衝鋒槍!"; }
			case "thai":		{ return "ปืนกลมือ!"; }
			case "turkish":		{ return "Hafif Makineli Silah!"; }
			case "ukrainian":	{ return "Пістолет-кулемет!"; }
			case "vietnamese":	{ return "Súng tiểu liên!"; }
		}
		return "Submachine Gun!";
	}
	weapon_smg_spawn = @(lang) (weapon_smg(lang)),

	weapon_sniper_awp = function(lang) //
	{
		switch(lang)
		{
			case "french":		{ return "AWP !"; }
			case "latam": case "spanish":
			{ return "¡AWP!"; }
		}
		return "AWP!";
	}
	weapon_sniper_awp_spawn = @(lang) (weapon_sniper_awp(lang)),

	weapon_sniper_military = function(lang) // #L4D_Instructor_explain_sniper_military
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Rifle de precisão!"; }
			case "bulgarian": 	{ return "Снайперистка винтовка!"; }
			case "czech":		{ return "Odstřelovací puška!"; }
			case "danish":		{ return "Snigskytteriffel!"; }
			case "dutch":		{ return "Sluipschuttersgeweer!"; }
			case "finnish":		{ return "Tarkkuuskivääri!"; }
			case "french":		{ return "Fusil de sniper !"; }
			case "german":		{ return "Sniper-Gewehr!"; }
			case "greek":		{ return "Τουφέκι σκοπευτή!"; }
			case "hungarian":	{ return "Mesterlövész puska!"; }
			case "italian":		{ return "Fucile di precisione!"; }
			case "japanese":	{ return "スナイパーライフル!"; }
			case "korean": case "koreana":
			{ return "저격소총!"; }
			case "latam": case "spanish":
			{ return "¡Rifle de francotirador!"; }
			case "norwegian":	{ return "Skarpskyttergevær!"; }
			case "polish":		{ return "Karabin snajperski!"; }
			case "portuguese":	{ return "Espingarda de sniper!"; }
			case "romanian":	{ return "Armă cu lunetă!"; }
			case "russian":		{ return "Снайперская винтовка!"; }
			case "schinese":	{ return "狙击枪!"; }
			case "swedish":		{ return "Krypskyttegevär!"; }
			case "tchinese":	{ return "狙擊槍!"; }
			case "thai":		{ return "ปืนไรเฟิลซุ่มยิง!"; }
			case "turkish":		{ return "Keskin Nişancı Tüfeği!"; }
			case "ukrainian":	{ return "Снайперська гвинтівка!"; }
			case "vietnamese":	{ return "Súng bắn tỉa!"; }
		}
		return "Sniper Rifle!";
	}
	weapon_sniper_military_spawn = @(lang) (weapon_sniper_military(lang)),

	weapon_sniper_scout = function(lang) // #Cstrike_TitlesTXT_Scout from counter strike: source
	{
		switch(lang)
		{
			case "french":		{ return "Scout !"; }
			case "japanese":	{ return "スカウト!"; }
			case "korean":		{ return "스카우트!"; }
			case "koreana":		{ return "스카우트!"; }
			case "latam": case "spanish":
			{ return "¡Scout!"; }
			case "ukrainian":	{ return "Скаут!"; }
		}
		return "Scout!";
	}
	weapon_sniper_scout_spawn = @(lang) (weapon_sniper_scout(lang)),

	// spawn = "",

	weapon_upgradepack_explosive = function(lang) // #L4D_Instructor_explain_upgradepack_explosive
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Pacote de Munição Explosiva!"; }
			case "bulgarian": 	{ return "Пакет експлодиращи муниции!"; }
			case "czech":		{ return "Zásobníky s explozivním střelivem!"; }
			case "danish":		{ return "Pakke med eksplosiv ammunition!"; }
			case "dutch":		{ return "Doos explosieve munitie!"; }
			case "finnish":		{ return "Räjähtäviä ammuksia!"; }
			case "french":		{ return "Boîte de cartouches explosives !"; }
			case "german":		{ return "Paket mit Sprengladungen!"; }
			case "greek":		{ return "Πακέτο εκρηκτικών πυρομαχικών!"; }
			case "hungarian":	{ return "Robbanólőszer-csomag!"; }
			case "italian":		{ return "Pacchetto di munizioni esplosive!"; }
			case "japanese":	{ return "爆発弾パック!"; }
			case "korean": case "koreana":
			{ return "폭발탄 팩!"; }
			case "latam": case "spanish":
			{ return "¡Caja de balas explosivas!"; }
			case "norwegian":	{ return "Boks med eksplosiv ammunisjon!"; }
			case "polish":		{ return "Paczka amunicji wybuchowej!"; }
			case "portuguese":	{ return "Caixa de munições explosivas!"; }
			case "romanian":	{ return "Pachet cu muniție explozivă!"; }
			case "russian":		{ return "Коробка разрывных патронов!"; }
			case "schinese":	{ return "高爆弹药包!"; }
			case "swedish":		{ return "Sprängammopaket!"; }
			case "tchinese":	{ return "高爆彈藥包!"; }
			case "thai":		{ return "แพ็คกระสุนระเบิด!"; }
			case "turkish":		{ return "Patlayıcı Cephane Paketi!"; }
			case "ukrainian":	{ return "Пачка вибухових набоїв!"; }
			case "vietnamese":	{ return "Hộp đạn nổ!"; }
		}
		return "Explosive Ammo Pack!";
	}
	weapon_upgradepack_explosive_spawn = @(lang) (weapon_upgradepack_explosive(lang)),

	upgrade_ammo_explosive = function(lang) // #Coach_ExplosiveAmmo01
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Munição explosiva!"; }
			case "bulgarian": 	{ return "Експлодиращи муниции!"; }
			case "czech":		{ return "Výbušné náboje!"; }
			case "danish":		{ return "Eksplosive skud!"; }
			case "dutch":		{ return "Explosieve kogels!"; }
			case "finnish":		{ return "Räjähtäviä ammuksia!"; }
			case "french":		{ return "Munitions explosives !"; }
			case "german":		{ return "Granaten!"; } // i am not sure about this one
			case "greek":		{ return "Εκρηκτικές σφαίρες!"; }
			case "hungarian":	{ return "Robbanólőszer!"; }
			case "italian":		{ return "Proiettili esplosivi!"; }
			case "japanese":	{ return "爆発弾を!"; }
			case "korean":		{ return "폭발탄이!"; }
			case "koreana":		{ return "폭발탄이!"; }
			case "latam":		{ return "¡Munición explosiva!"; }
			case "norwegian":	{ return "Eksplosiver!"; }
			case "polish":		{ return "Naboje wybuchowe!"; }
			case "portuguese":	{ return "Munições explosivas!"; }
			case "romanian":	{ return "Gloanțe explozive!"; }
			case "russian":		{ return "Осколочные заряды!"; }
			case "schinese":	{ return "高爆弹药!"; }
			case "spanish":		{ return "¡Munición explosiva!"; }
			case "swedish":		{ return "Sprängammo!"; }
			case "tchinese":	{ return "高爆彈!"; }
			case "thai":		{ return "กระสุนระเบิด!"; }
			case "turkish":		{ return "Patlayıcı cephane!"; }
			case "ukrainian":	{ return "Bибухові набої!"; }
			case "vietnamese":	{ return "Đạn nổ!"; }
		}
		return "Explosive ammo!"
	},

	weapon_upgradepack_incendiary = function(lang) // #L4D_Instructor_explain_upgradepack_incendiary
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Pacote de munição incendiária!"; }
			case "bulgarian": 	{ return "Пакет възпламенителни муниции!"; }
			case "czech":		{ return "Zásobníky se zápalným střelivem!"; }
			case "danish":		{ return "Pakke med brandammunition!"; }
			case "dutch":		{ return "Doos ontvlambare munitie!"; }
			case "finnish":		{ return "Palavia ammuksia!"; }
			case "french":		{ return "Boîte de cartouches incendiaires !"; }
			case "german":		{ return "Brandmunition!"; }
			case "greek":		{ return "Πακέτο εμπρηστικών πυρομαχικών!"; }
			case "hungarian":	{ return "Gyújtólőszercsomag!"; }
			case "italian":		{ return "Pacchetto di munizioni incendiarie!"; }
			case "japanese":	{ return "火炎弾パック!"; }
			case "korean": case "koreana":
			{ return "소이탄 팩!"; }
			case "latam": case "spanish":
			{ return "¡Caja de balas incendiarias!"; }
			case "norwegian":	{ return "Boks med brannstiftende ammunisjon!"; }
			case "polish":		{ return "Paczka amunicji zapalającej!"; }
			case "portuguese":	{ return "Caixa de munições incendiárias!"; }
			case "romanian":	{ return "Pachet cu muniție incendiară!"; }
			case "russian":		{ return "Коробка зажигательных патронов!"; }
			case "schinese":	{ return "燃烧弹药包!"; }
			case "swedish":		{ return "Brandammunitionspaket!"; }
			case "tchinese":	{ return "燃燒彈藥包!"; }
			case "thai":		{ return "กล่องกระสุนเพลิง!"; }
			case "turkish":		{ return "Yanıcı Cephane Paketi!"; }
			case "ukrainian":	{ return "Пачка запалювальних набоїв!"; }
			case "vietnamese":	{ return "Hộp đạn cháy!"; }
		}
		return "Incendiary Ammo Pack!";
	}
	weapon_upgradepack_incendiary_spawn = @(lang) (weapon_upgradepack_incendiary(lang)),

	upgrade_ammo_incendiary = function(lang) // #Producer_IncendAmmo01
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Munição incendiária!"; }
			case "bulgarian": case "russian":
			{ return "Възпламенителни муниции!"; }
			case "czech":		{ return "Zápalné střelivo!"; }
			case "danish":		{ return "Brandammunition!"; }
			case "dutch":		{ return "Ontvlambare munitie!"; }
			case "finnish":		{ return "Palavia ammuksia!"; }
			case "french":		{ return "Cartouches incendiaires !"; }
			case "german":		{ return "Brandmunition!"; }
			case "greek":		{ return "Εμπρηστικά πυρομαχικά!"; }
			case "hungarian":	{ return "Gyújtólövedék!"; }
			case "italian":		{ return "Munizioni incendiarie!"; }
			case "japanese":	{ return "焼夷弾!"; }
			case "korean": case "koreana":
			{ return "소이탄!"; }
			case "latam": case "spanish":
			{ return "¡Incendiarias!"; }
			case "norwegian":	{ return "Brannstiftende ammunisjon!"; } // in the files, it's called Explosivammo ?
			case "polish":		{ return "Amunicja zapalająca!"; }
			case "portuguese":	{ return "Munições incendiárias!"; }
			case "romanian":	{ return "Muniţie incendiară!"; }
			case "schinese":	{ return "燃烧弹药!"; }
			case "swedish":		{ return "Eldkulor!"; }
			case "tchinese":	{ return "燃燒彈藥!"; }
			case "thai":		{ return "กระสุนเพลิงอยู่ที่นี่!"; }
			case "turkish":		{ return "Yanıcı cephane!"; }
			case "ukrainian":	{ return "3апалювальні набої!"; }
			case "vietnamese":	{ return "Đạn lửa!"; }
		}
		return "Incendiary ammo!"
	},

	upgrade_laser_sight = function(lang) // #Coach_LaserSights01 + DeepL
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Mira a laser!"; }
			case "bulgarian": 	{ return "Лазерни мерници!"; }
			case "czech":		{ return "Laserová mířidla!"; }
			case "danish":		{ return "Lasersigter!"; }
			case "dutch":		{ return "Laserviziers!"; }
			case "finnish":		{ return "Lasertähtäin!"; }
			case "french":		{ return "Visées laser !"; }
			case "german":		{ return "Laservisiere!"; }
			case "greek":		{ return "Δείκτες λέιζερ!"; }
			case "hungarian":	{ return "Lézerirányzékok!"; }
			case "italian":		{ return "Mirini laser!"; }
			case "japanese":	{ return "レーザー!"; }
			case "korean": case "koreana":
			{ return "레이저 조준기!"; }
			case "latam": case "spanish":
			{ return "¡Miras láser!"; }
			case "norwegian":	{ return "Lasersikter!"; }
			case "polish":		{ return "Celownik laserowy!"; }
			case "portuguese":	{ return "Miras a laser!"; }
			case "romanian":	{ return "Lasere!"; }
			case "russian":		{ return "Лазерные прицелы!"; }
			case "schinese":	{ return "激光瞄准器!"; }
			case "swedish":		{ return "Lasersikte!"; }
			case "tchinese":	{ return "雷射瞄準器!"; }
			case "thai":		{ return "ล็งเลเซอร์!"; }
			case "turkish":		{ return "Lazer nişangâhlar!"; }
			case "ukrainian":	{ return "Лазерні приціли!"; }
			case "vietnamese":	{ return "Ống ngắm laser!"; }
		}
		return "Laser Sight!";
	}

	weapon_vomitjar = function(lang) // #L4D_Instructor_explain_vomitjar
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Vômito de Gorfo!"; }
			case "bulgarian": 	{ return "Жлъчна течност от Бумтящ!"; }
			case "czech":		{ return "Boomerova žluč!"; }
			case "danish":		{ return "Boomer-bræk!"; }
			case "dutch":		{ return "Boomer-gal!"; }
			case "finnish":		{ return "Boomerin oksennus!"; }
			case "french":		{ return "Bile de Boomer !"; }
			case "german":		{ return "Boomerkotze!"; }
			case "greek":		{ return "Εμετός Φούσκα!"; }
			case "hungarian":	{ return "Pukkancs-epe!"; }
			case "italian":		{ return "Bile del Boomer!"; }
			case "japanese":	{ return "Boomerの胆汁!"; }
			case "korean": case "koreana":
			{ return "부머 토사물!"; }
			case "latam": case "spanish":
			{ return "¡Bilis de Boomer!"; }
			case "norwegian":	{ return "Boomergalle!"; }
			case "polish":		{ return "Żółć Boomera!"; }
			case "portuguese":	{ return "Bílis de Boomer!"; }
			case "romanian":	{ return "Fiere de boomer!"; }
			case "russian":		{ return "Рвота Толстяка!"; }
			case "schinese":	{ return "Boomer 胆汁!"; }
			case "swedish":		{ return "Boomer-galla!"; }
			case "tchinese":	{ return "Boomer 膽汁!"; }
			case "thai":		{ return "ขวดน้ำดีของบูมเมอร์!"; }
			case "turkish":		{ return "Boomer Kusmuğu!"; }
			case "ukrainian":	{ return "Жовч товстуна!"; }
			case "vietnamese":	{ return "Dịch mật Boomer!"; }
		}
		return "Boomer Bile!";
	}
	weapon_vomitjar_spawn = @(lang) (weapon_vomitjar(lang)),

	prop_minigun = function(lang) // #L4D2_Instructor_explain_use_mounted_gun
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Metralhadora Pesada!"; }
			case "bulgarian": 	{ return "Тежка картечница!"; }
			case "czech":		{ return "Těžký kulomet!"; }
			case "danish":		{ return "Svært maskingevær!"; }
			case "dutch":		{ return "Zwaar machinegeweer!"; }
			case "finnish":		{ return "Raskas konekivääri!"; }
			case "french":		{ return "Mitrailleuse lourde !"; }
			case "german":		{ return "Schweres Maschinengewehr!"; }
			case "greek":		{ return "Βαρύ πολυβόλο!"; }
			case "hungarian":	{ return "Nehéz géppuska!"; }
			case "italian":		{ return "Mitragliatrice pesante!"; }
			case "japanese":	{ return "ヘビーマシンガン!"; }
			case "korean": case "koreana":
			{ return "중기관총!"; }
			case "latam": case "spanish":
			{ return "¡Ametralladora pesada!"; }
			case "norwegian":	{ return "Mitraljøse!"; }
			case "polish":		{ return "Ciężki karabin maszynowy!"; }
			case "portuguese":	{ return "Metralhadora pesada!"; }
			case "romanian":	{ return "Mitralieră de companie!"; }
			case "russian":		{ return "Тяжелый пулемет!"; }
			case "schinese":	{ return "重机枪!"; }
			case "swedish":		{ return "Tungt maskingevär!"; }
			case "tchinese":	{ return "重型機關槍!"; }
			case "thai":		{ return "ปืนกลหนัก!"; }
			case "turkish":		{ return "Ağır Makineli Silah!"; }
			case "ukrainian":	{ return "Важкий кулемет!"; }
			case "vietnamese":	{ return "Súng máy hạng nặng!"; }
		}
		return "Heavy Machine Gun!";
	}

	prop_minigun_l4d1 = function(lang) // #L4D_Use_Minigun + DeepL
	{
		switch(lang)
		{
			case "brazilian": case "portuguese":
			{ return "Metralhadora!"; }
			case "bulgarian": 	{ return "Картечница!"; }
			case "czech":		{ return "Kulomet!"; }
			case "danish":		{ return "Rullekanon!"; }
			case "finnish":		{ return "Konekivääri!"; }
			case "french":		{ return "Minigun !"; }
			case "greek":		{ return "Πολυβόλο!"; }
			case "hungarian":	{ return "Gépágyú!"; }
			case "italian":		{ return "Mitragliatrice!"; }
			case "japanese":	{ return "ミニガン!"; }
			case "korean": case "koreana":
			{ return "미니건!"; }
			case "latam": case "spanish":
			{ return "¡Ametralladora!"; }
			case "polish":		{ return "Miniguna!"; }
			case "romanian":	{ return "Mitralieră!"; }
			case "russian": case "ukrainian":
			{ return "Пулемет!"; }
			case "schinese":	{ return "转轮机枪"; }
			case "swedish":		{ return "Kulspruta!"; }
			case "tchinese":	{ return "格林機槍!"; }
			case "thai":		{ return "นมินิกัน!"; }
		}
		return "Minigun!";
	}
}

MELEE <- // melee & melee_spawn
{
	baseball_bat = function(lang) // #L4D_Melee_Baseball_Bat
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Taco de Beisebol!"; }
			case "bulgarian": 	{ return "Бейзболна бухалка!"; }
			case "czech":		{ return "Baseballová pálka!"; }
			case "danish":		{ return "Baseballbat!"; }
			case "dutch":		{ return "Honkbalknuppel!"; }
			case "finnish":		{ return "Pesäpallomaila!"; }
			case "french":		{ return "Batte de baseball !"; }
			case "german":		{ return "Baseballschläger!"; }
			case "greek":		{ return "Μπαστούνι του Μπέϊζμπολ!"; }
			case "hungarian":	{ return "Baseballütő!"; }
			case "italian":		{ return "Mazza da baseball!"; }
			case "japanese":	{ return "野球のバット!"; }
			case "korean": case "koreana":
			{ return "야구 방망이!"; }
			case "latam": case "spanish":
			{ return "¡Bate de béisbol!"; }
			case "norwegian":	{ return "Balltre!"; }
			case "polish":		{ return "Kij baseballowy!"; }
			case "portuguese":	{ return "Taco de basebol!"; }
			case "romanian":	{ return "Bâtă de baseball!"; }
			case "russian":		{ return "Бейсбольная бита!"; }
			case "schinese":	{ return "棒球球棒!"; }
			case "swedish":		{ return "Basebollträ!"; }
			case "tchinese":	{ return "棒球棒!"; }
			case "thai":		{ return "ไม้เบสบอล!"; }
			case "turkish":		{ return "Beyzbol Sopası!"; }
			case "ukrainian":	{ return "Бейсбольна бита!"; }
			case "vietnamese":	{ return "Gậy bóng chày!"; }
		}
		return "Baseball Bat!";
	},

	cricket_bat = function(lang) // #L4D_Melee_Cricket_Bat
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Taco de Críquete!"; }
			case "bulgarian": 	{ return "Бухалка за крикет!"; }
			case "czech":		{ return "Kriketová pálka!"; }
			case "danish": case "dutch":
			{ return "Cricketbat!"; }
			case "finnish":		{ return "Krikettimaila!"; }
			case "french":		{ return "Batte de cricket !"; }
			case "german":		{ return "Cricketschläger!"; }
			case "greek":		{ return "Μπαστούνι Κρίκετ!"; }
			case "hungarian":	{ return "Krikettütő!"; }
			case "italian":		{ return "Mazza da cricket!"; }
			case "japanese":	{ return "クリケットのバット!"; }
			case "korean": case "koreana":
			{ return "크리켓 방망이!"; }
			case "latam": case "spanish":
			{ return "¡Bate de cricket!"; }
			case "norwegian":	{ return "Cricketkølle!"; }
			case "polish":		{ return "Kij do krykieta!"; }
			case "portuguese":	{ return "Taco de críquete!"; }
			case "romanian":	{ return "Bâtă de crichet!"; }
			case "russian":		{ return "Крикетная бита!"; }
			case "schinese":	{ return "板球拍!"; }
			case "swedish":		{ return "Cricket-slagträ!"; }
			case "tchinese":	{ return "板球棒!"; }
			case "thai":		{ return "ไม้คริกเก็ต!"; }
			case "turkish":		{ return "Kriket Sopası!"; }
			case "ukrainian":	{ return "Бита для крикету!"; }
			case "vietnamese":	{ return "Gậy cricket!"; }
		}
		return "Cricket Bat!";
	},

	crowbar = function(lang) // #L4D_Melee_Crowbar
	{
		switch(lang)
		{
			case "brazilian": case "portuguese":
			{ return "Pé de cabra!"; }
			case "bulgarian": 	{ return "Кози крак!"; }
			case "czech":		{ return "Páčidlo!"; }
			case "danish":		{ return "Brækjern!"; }
			case "dutch":		{ return "Koevoet!"; }
			case "finnish":		{ return "Sorkkarauta!"; }
			case "french":		{ return "Pied-de-biche !"; }
			case "german":		{ return "Brechstange!"; }
			case "greek":		{ return "Λοστός!"; }
			case "hungarian":	{ return "Feszítővas!"; }
			case "italian":		{ return "Piede di porco!"; }
			case "japanese":	{ return "バール!"; }
			case "korean": case "koreana":
			{ return "크로우바!"; }
			case "latam": case "spanish":
			{ return "¡Palanca!"; }
			case "norwegian":	{ return "Brekkjern!"; }
			case "polish":		{ return "Łom!"; }
			case "romanian":	{ return "Rangă!"; }
			case "russian":		{ return "Фомка!"; }
			case "schinese":	{ return "撬棒!"; }
			case "swedish":		{ return "Kofot!"; }
			case "tchinese":	{ return "鐵撬!"; }
			case "thai":		{ return "ชะแลง!"; }
			case "turkish":		{ return "Levye!"; }
			case "ukrainian":	{ return "Лом!"; }
			case "vietnamese":	{ return "Xà beng!"; }
		}
		return "Crowbar!";
	},

	electric_guitar = function(lang) // #L4D_Melee_Electric_Guitar
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Guitarra!"; }
			case "bulgarian": 	{ return "Електрическа китара!"; }
			case "czech":		{ return "Elektrická kytara!"; }
			case "danish":		{ return "Elguitar!"; }
			case "dutch":		{ return "Elektrische gitaar!"; }
			case "finnish":		{ return "Sähkökitara!"; }
			case "french":		{ return "Guitare électrique !"; }
			case "german":		{ return "E-Gitarre!"; }
			case "greek":		{ return "Ηλεκτρική Κιθάρα!"; }
			case "hungarian":	{ return "Elektromos gitár!"; }
			case "italian":		{ return "Chitarra elettrica!"; }
			case "japanese":	{ return "エレクトリックギター!"; }
			case "korean": case "koreana":
			{ return "전기 기타!"; }
			case "latam": case "spanish":
			{ return "¡Guitarra eléctrica!"; }
			case "norwegian":	{ return "Elektrisk gitar!"; }
			case "polish":		{ return "Gitara elektryczna!"; }
			case "portuguese":	{ return "Guitarra elétrica!"; }
			case "romanian":	{ return "Chitară electrică!"; }
			case "russian":		{ return "Электрогитара!"; }
			case "schinese":	{ return "电吉他!"; }
			case "swedish":		{ return "Elgitarr!"; }
			case "tchinese":	{ return "電吉他!"; }
			case "thai":		{ return "กีตาร์ไฟฟ้า!"; }
			case "turkish":		{ return "Elektro Gitar!"; }
			case "ukrainian":	{ return "Електрогітара!"; }
			case "vietnamese":	{ return "Guitar điện!"; }
		}
		return "Electric Guitar!";
	},

	fireaxe = function(lang) // #L4D_Melee_FireAxe
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Machado de incêndio!"; }
			case "bulgarian": 	{ return "Пожарникарска брадва!"; }
			case "czech":		{ return "Požárnická sekera!"; }
			case "danish":		{ return "Brandøkse!"; }
			case "dutch":		{ return "Vuurbijl!"; }
			case "finnish":		{ return "Palokirves!"; }
			case "french":		{ return "Hache !"; }
			case "german":		{ return "Feuerwehraxt!"; }
			case "greek":		{ return "Πυροσβεστικό Τσεκούρι!"; }
			case "hungarian":	{ return "Fejsze!"; }
			case "italian":		{ return "Ascia da pompiere!"; }
			case "japanese":	{ return "防火斧!"; }
			case "korean": case "koreana":
			{ return "소방용 도끼!"; }
			case "latam": case "spanish":
			{ return "¡Hacha de bombero!"; }
			case "norwegian":	{ return "Brannøks!"; }
			case "polish":		{ return "Topór!"; }
			case "portuguese":	{ return "Machado!"; }
			case "romanian":	{ return "Topor târnăcop!"; }
			case "russian":		{ return "Пожарный топорик!"; }
			case "schinese": case "tchinese":
			{ return "消防斧!"; }
			case "swedish":		{ return "Brandyxa!"; }
			case "thai":		{ return "ขวานดับเพลิง!"; }
			case "turkish":		{ return "Yangın Baltası!"; }
			case "ukrainian":	{ return "Пожежна сокира!"; }
			case "vietnamese":	{ return "Rìu cứu hỏa!"; }
		}
		return "Fireaxe!";
	},

	frying_pan = function(lang) // #L4D_Melee_Frying_Pan
	{
		switch(lang)
		{
			case "brazilian": case "portuguese":
			{ return "Frigideira!"; }
			case "bulgarian": 	{ return "Тиган!"; }
			case "czech":		{ return "Pánev na smažení!"; }
			case "danish":		{ return "Stegepande!"; }
			case "dutch":		{ return "Koekenpan!"; }
			case "finnish":		{ return "Paistinpannu!"; }
			case "french":		{ return "Poêle !"; }
			case "german":		{ return "Bratpfanne!"; }
			case "greek":		{ return "Τηγάνι!"; }
			case "hungarian":	{ return "Serpenyő!"; }
			case "italian":		{ return "Padella!"; }
			case "japanese":	{ return "フライパン!"; }
			case "korean": case "koreana":
			{ return "프라이팬!"; }
			case "latam": case "spanish":
			{ return "¡Sartén!"; }
			case "norwegian":	{ return "Steikepanne!"; }
			case "polish":		{ return "Patelnia!"; }
			case "romanian":	{ return "Tigaie!"; }
			case "russian":		{ return "Сковородка!"; }
			case "schinese":	{ return "平底锅!"; }
			case "swedish":		{ return "Stekpanna!"; }
			case "tchinese":	{ return "平底鍋!"; }
			case "thai":		{ return "กระทะ!"; }
			case "turkish":		{ return "Kızartma Tavası!"; }
			case "ukrainian":	{ return "Сковорідка!"; }
			case "vietnamese":	{ return "Chảo chiên!"; }
		}
		return "Frying Pan!";
	},

	golfclub = function(lang) // #Coach_DLC1_GolfClub02
	{
		switch(lang)
		{
			case "brazilian": case "portuguese":
			{ return "Taco de golfe!"; }
			case "bulgarian": 	{ return "Стик за голф!"; }
			case "czech":		{ return "Golfová hůl!"; }
			case "danish": case "norwegian":
			{ return "Golfkølle!"; }
			case "dutch":		{ return "Golfclub!"; }
			case "finnish":		{ return "Golfmaila!"; }
			case "french":		{ return "Club de golf !"; }
			case "german":		{ return "Golfschläger!"; }
			case "greek":		{ return "Μπαστούνι του γκολφ!"; }
			case "hungarian":	{ return "Golfütő!"; }
			case "italian":		{ return "Mazza da golf!"; }
			case "japanese":	{ return "ゴルフクラブ!"; }
			case "korean": case "koreana":
			{ return "골프채!"; }
			case "latam": case "spanish":
			{ return "¡Palo de golf!"; }
			case "polish":		{ return "Kij golfowy!"; }
			case "romanian":	{ return "Crosă de golf!"; }
			case "russian":		{ return "Клюшка для гольфа!"; }
			case "schinese":	{ return "高尔夫球杆!"; }
			case "swedish":		{ return "Golfklubba!"; }
			case "tchinese":	{ return "高爾夫球桿!"; }
			case "thai":		{ return "ไม้กอล์ฟ!"; }
			case "turkish":		{ return "Golf sopası!"; }
			case "ukrainian":	{ return "Ключка для гольфу!"; }
			case "vietnamese":	{ return "Gậy đánh golf!"; }
		}
		return "Golf Club!";
	},

	katana = function(lang) // #L4D_Melee_Katana
	{
		switch(lang)
		{
			case "bulgarian": case "russian": case "ukrainian":
			{ return "Катана!"; }
			case "french":		{ return "Katana !"; }
			case "greek":		{ return "Κατάνα!"; }
			case "japanese":	{ return "日本刀!"; }
			case "korean": case "koreana":
			{ return "카타나!"; }
			case "latam": case "spanish":
			{ return "¡Katana!"; }
			case "portuguese":	{ return "Catana!"; }
			case "schinese": case "tchinese":
			{ return "武士刀!"; }
			case "swedish":		{ return "Katanasvärd!"; }
			case "thai":		{ return "ดาบคาตานะ!"; }
		}
		return "Katana!";
	},

	knife = function(lang) // DeepL
	{
		switch(lang)
		{
			case "brazilian": case "portuguese":
			{ return "Faca!"; }
			case "bulgarian": case "russian":
			{ return "Нож!"; }
			case "czech":		{ return "Nůž!"; }
			case "danish": case "norwegian": case "swedish":
			{ return "Kniv!"; }
			case "dutch":		{ return "Mes!"; }
			case "finnish":		{ return "Veitsi!"; }
			case "french":		{ return "Couteau !"; }
			case "german":		{ return "Messer!"; }
			case "greek":		{ return "Μαχαίρι!"; }
			case "hungarian":	{ return "Kés!"; }
			case "italian":		{ return "Coltello!"; }
			case "japanese":	{ return "ナイフ!"; }
			case "korean": case "koreana":
			{ return "칼!"; }
			case "latam": case "spanish":
			{ return "¡Cuchillo!"; }
			case "polish":		{ return "Nóż!"; }
			case "romanian":	{ return "Cuțit!"; }
			case "schinese": case "tchinese":
			{ return "刀!"; }
			case "thai":		{ return "มีด!"; }
			case "turkish":		{ return "Bıçak!"; }
			case "ukrainian":	{ return "Ніж!"; }
			case "vietnamese":	{ return "Dao!"; }
		}
		return "Knife!";
	},

	machete = function(lang) // #L4D_Melee_Machete
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Facão!"; }
			case "bulgarian": case "russian": case "ukrainian":
			{ return "Мачете!"; }
			case "czech":		{ return "Mačeta!"; }
			case "dutch":		{ return "Kapmes!"; }
			case "finnish":		{ return "Viidakkoveitsi!"; }
			case "french":		{ return "Machette !"; }
			case "greek":		{ return "Μασέτα!"; }
			case "japanese":	{ return "マチェーテ!"; }
			case "korean": case "koreana":
			{ return "마체테!"; }
			case "latam": case "spanish":
			{ return "¡Machete!"; }
			case "polish":		{ return "Maczeta!"; }
			case "romanian":	{ return "Macetă!"; }
			case "schinese":	{ return "弯刀!"; }
			case "tchinese":	{ return "開山刀!"; }
			case "thai":		{ return "มีดสปาต้า!"; }
			case "turkish":		{ return "Pala!"; }
			case "vietnamese":	{ return "Mã tấu!"; }
		}
		return "Machete!";
	},

	pitchfork = function(lang) // DeepL
	{
		switch(lang)
		{
			case "brazilian": case "portuguese":
			{ return "Forquilha!"; }
			case "bulgarian": case "ukrainian":
			{ return "Вила!"; }
			case "czech":		{ return "Vidle!"; }
			case "danish":		{ return "Høtyv!"; }
			case "french":		{ return "Une fourche !"; }
			case "german":		{ return "Heugabel!"; }
			case "greek":		{ return "Πιρούνι!"; }
			case "italian":		{ return "Forca!"; }
			case "japanese":	{ return "ピッチフォーク!"; }
			case "korean": case "koreana":
			{ return "피치포크!"; }
			case "latam":		{ return "¡Pitchfork!"; }
			case "norwegian":	{ return "Høygaffel!"; }
			case "polish":		{ return "Widelec!"; }
			case "romanian":	{ return "Furcă!"; }
			case "russian":		{ return "Вилы!"; }
			case "schinese": case "tchinese":
			{ return "叉子!"; }
			case "spanish":		{ return "¡Horquilla!"; }
			case "thai":		{ return "โกย!"; }
			case "turkish":		{ return "Çatal!"; }
			case "vietnamese":	{ return "Cái xẻng!"; }
		}
		return "Pitchfork!";
	},

	riotshield = function(lang) // # DeepL - the most concerning localization
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Escudo de protesto!"; }
			case "bulgarian": case "ukrainian":
			{ return "Бронещит!"; }
			case "czech":		{ return "Ochranný štít!"; }
			case "danish":		{ return "Oprørsskjold!"; }
			case "dutch":		{ return "Scherm!"; }
			case "finnish":		{ return "Mellakakilpi!"; }
			case "french":		{ return "Bouclier anti-émeute !"; }
			case "german":		{ return "Schild!"; }
			case "greek":		{ return "Ασπίδα ταραχών!"; }
			case "hungarian":	{ return "Pajzs!"; }
			case "italian":		{ return "Scudo antisommossa!"; }
			case "japanese":	{ return "防弾シールド！"; }
			case "korean": case "koreana":
			{ return "방패!"; }
			case "latam": case "spanish":
			{ return "¡Escudo antidisturbios!"; }
			case "norwegian":	{ return "Opprørsskjold!"; }
			case "polish":		{ return "Tarcza bojowa!"; }
			case "portuguese":	{ return "Escudo anti-motim!"; }
			case "romanian":	{ return "Scut anti-revoltă!"; }
			case "russian":		{ return "Щит для подавления беспорядков!"; }
			case "schinese": case "tchinese":
			{ return "防暴盾牌!"; }
			case "swedish":		{ return "Sköld!"; }
			case "thai":		{ return "โล่ปราบจลาจล!"; }
			case "turkish":		{ return "Kalkan!"; }
			case "vietnamese":	{ return "Khiên chống bạo động!"; }
		}
		return "Riot Shield!";
	},

	shovel = function(lang) // DeepL
	{
		switch(lang)
		{
			case "brazilian": case "portuguese":
			{ return "Pá!"; }
			case "bulgarian": case "russian": case "ukrainian":
			{ return "Лопата!"; }
			case "czech":		{ return "Lopata!"; }
			case "danish":		{ return "Skovl!"; }
			case "dutch":		{ return "Schep!"; }
			case "finnish":		{ return "Lapio!"; }
			case "french":		{ return "Pelle !"; }
			case "german":		{ return "Schaufel!"; }
			case "greek":		{ return "Φτυάρι!"; }
			case "hungarian":	{ return "Lapát!"; }
			case "italian":		{ return "Pala!"; }
			case "japanese":	{ return "シャベル!"; }
			case "korean": case "koreana":
			{ return "삽!"; }
			case "latam": case "spanish":
			{ return "¡Pala!"; }
			case "norwegian": case "swedish":
			{ return "Spade!"; }
			case "polish":		{ return "Łopata!"; }
			case "romanian":	{ return "Lopată!"; }
			case "schinese":	{ return "铁锹!"; }
			case "tchinese":	{ return "鏟子!"; }
			case "thai":		{ return "พลั่ว!"; }
			case "turkish":		{ return "Kürek!"; }
			case "vietnamese":	{ return "Xẻng!"; }
		}
		return "Shovel!";
	},

	tonfa = function(lang) // #L4D_Melee_Tonfa
	{
		switch(lang)
		{
			case "brazilian": 	{ return "Cassetete!"; }
			case "bulgarian": 	{ return "Полицейска палка!"; }
			case "french":		{ return "Tonfa !"; }
			case "greek":		{ return "Γκλοπ!"; }
			case "italian":		{ return "Manganello!"; }
			case "japanese":	{ return "トンファー!"; }
			case "korean": case "koreana":
			{ return "통파!"; }
			case "latam": case "spanish":
			{ return "¡Tonfa!"; }
			case "russian": case "ukrainian":
			{ return "Тонфа!"; }
			case "schinese": case "tchinese":
			{ return "警棍!"; }
			case "swedish":		{ return "Tonfa-stav!"; }
			case "thai":		{ return "กระบองทอนฟ่า!"; }
			case "turkish":		{ return "Cop!"; }
			case "vietnamese":	{ return "Gậy tonfa!"; }
		}
		return "Tonfa!";
	},

	generic = function(lang) // #L4D_Instructor_explain_melee
	{
		switch(lang)
		{
			case "brazilian": case "portuguese":
			{ return "Arma corpo a corpo!"; }
			case "bulgarian": 	{ return "Ръкопашно оръжие!"; }
			case "czech":		{ return "Zbraň pro boj zblízka!"; }
			case "danish":		{ return "Nærkampsvåben!"; }
			case "dutch":		{ return "Slagwapen!"; }
			case "finnish":		{ return "Lähitaisteluase!"; }
			case "french":		{ return "Arme de corps à corps !"; }
			case "german":		{ return "Nahkampfwaffe!"; }
			case "greek":		{ return "Αγχέμαχο όπλο!"; }
			case "hungarian":	{ return "Közelharcfegyver"; }
			case "italian":		{ return "Arma da corpo a corpo!"; }
			case "japanese":	{ return "近接武器!"; }
			case "korean": case "koreana":
			{ return "근접 무기!"; }
			case "latam": case "spanish":
			{ return "¡Arma de cuerpo a cuerpo!"; }
			case "norwegian":	{ return "Nærkampvåpen!"; }
			case "polish":		{ return "Broń do walki wręcz!"; }
			case "romanian":	{ return "Armă de meleu!"; }
			case "russian":		{ return "Рукопашное оружие!"; }
			case "schinese":	{ return "近战武器!"; }
			case "swedish":		{ return "Närstridsvapen!"; }
			case "tchinese":	{ return "近戰武器!"; }
			case "thai":		{ return "อาวุธระยะประชิด!"; }
			case "turkish":		{ return "Yakın Dövüş Silahı!"; }
			case "ukrainian":	{ return "Зброя ближнього бою!"; }
			case "vietnamese":	{ return "Vũ khí cận chiến!"; }
		}
		return "Melee Weapon!";
	},
}

GENERIC <- function(lang) // #L4D_Instructor_explain_weapon
{
	switch(lang)
	{
		case "brazilian": case "italian": case "portuguese":
		{ return "Arma!"; }
		case "bulgarian": 	{ return "Оръжие!"; }
		case "czech":		{ return "Zbraň!"; }
		case "danish":		{ return "Våben!"; }
		case "dutch":		{ return "Wapen!"; }
		case "finnish":		{ return "Ase!"; }
		case "french":		{ return "Arme !"; }
		case "german":		{ return "Waffe!"; }
		case "greek":		{ return "Όπλο!"; }
		case "hungarian":	{ return "Fegyver!"; }
		case "japanese": case "schinese": case "tchinese":
		{ return "武器!"; }
		case "korean": case "koreana":
		{ return "무기!"; }
		case "latam": case "spanish":
		{ return "¡Arma!"; }
		case "norwegian":	{ return "Våpen!"; }
		case "polish":		{ return "Broń!"; }
		case "romanian":	{ return "Armă!"; }
		case "russian":		{ return "Оружие!"; }
		case "swedish":		{ return "Vapen!"; }
		case "thai":		{ return "อาวุธ!"; }
		case "turkish":		{ return "Silah!"; }
		case "ukrainian":	{ return "Зброя!"; }
		case "vietnamese":	{ return "Vũ khí!"; }
	}
	return "Weapon!"
}

		// switch(lang)
		// {
		// 	case "brazilian": 	{ return; }
		// 	case "bulgarian": 	{ return; }
		// 	case "czech":		{ return; }
		// 	case "danish":		{ return; }
		// 	case "dutch":		{ return; }
		// 	case "finnish":		{ return; }
		// 	case "french":		{ return; }
		// 	case "german":		{ return; }
		// 	case "greek":		{ return; }
		// 	case "hungarian":	{ return; }
		// 	case "italian":		{ return; }
		// 	case "japanese":	{ return; }
		// 	case "korean":		{ return; }
		// 	case "koreana":		{ return; }
		// 	case "latam":		{ return; }
		// 	case "norwegian":	{ return; }
		// 	case "polish":		{ return; }
		// 	case "portuguese":	{ return; }
		// 	case "romanian":	{ return; }
		// 	case "russian":		{ return; }
		// 	case "schinese":	{ return; }
		// 	case "spanish":		{ return; }
		// 	case "swedish":		{ return; }
		// 	case "tchinese":	{ return; }
		// 	case "thai":		{ return; }
		// 	case "turkish":		{ return; }
		// 	case "ukrainian":	{ return; }
		// 	case "vietnamese":	{ return; }
		// }printl("===================================");
printl("Executing Hint Marker by Interneted");
printl("===================================");

// Thanks to Shadowysn and Nescius
// for reminding me that rulescript_base.nuc and response_rules.nuc variables
// are defined already in the g_rr scope (from response_testbed.nuc)

if(!("Interneted_ResponseHook" in getroottable()))
{
	::Interneted_ResponseHook <- {};

	local criteria = { key = "interneted_response_hook", func = function(query) { foreach(func in ::Interneted_ResponseHook) { func(query); } } };
	local group_params = g_rr.RGroupParams({ permitrepeats = true, sequential = false, norepeat = false, matchonce = false })
	// * it's honestly really cool that you can make table act as an object from a class.
	// * but i'll just stick to the object instead.
	local rule = g_rr.RRule("interneted_response_hook", [criteria], [null], group_params);
	g_rr.rr_AddDecisionRule(rule);
}

::Interneted_HintMarker <-
{
	Settings =
	{
		Convars =
		{
			chat_cmd = 0,
			look_cmd = 1,
			dominated_enable = 1,
			hanging_enable = 1,
			dot_product = 1,
			use_context = 1,
			english_only = 0,
			allow_remark = 0,
		}
		SpotMarker =
		{
			enable = 1,
			r = 200,
			g = 200,
			b = 200,
			use_range = 1800.0,
			duration = 10.0,
			instructionhint_enable = 1,
			instructionhint_r = 200,
			instructionhint_g = 200,
			instructionhint_b = 200,
			suppress_hint = 0,
			range = 1000.0,
			beam_enable = 1,
			emit_sound = 1,
			sound_name = "buttons/blip1.wav",
		},
		SurvivorMarker =
		{
			enable = 1,
			r = 0,
			g = 200,
			b = 0,
			use_range = 1000.0,
			duration = 10.0,
			instructionhint_enable = 1,
			instructionhint_r = 0,
			instructionhint_g = 200,
			instructionhint_b = 0,
			suppress_hint = 0,
			range = 2000.0,
			glow_enable = 1,
			glow_range = 2000,
			glow_flash = 0,
			chat_vocalize_enable = 1,
			emit_sound = 1,
			sound_name = "player/suit_denydevice.wav",
		},
		InfectedMarker =
		{
			enable = 1
			r = 255,
			g = 120,
			b = 203,
			use_range = 1000.0,
			duration = 10.0,
			instructionhint_enable = 1,
			instructionhint_r = 255,
			instructionhint_g = 0,
			instructionhint_b = 0,
			suppress_hint = 0,
			range = 2500.0,
			glow_enable = 1,
			glow_range = 2500,
			glow_flash = 0,
			chat_vocalize_enable = 1,
			emit_sound = 1,
			sound_name = "items/suitchargeok1.wav",
			si_flag = 255,
		},
		ItemMarker =
		{
			enable = 1
			r = 0,
			g = 255,
			b = 255,
			use_range = 200.0
			duration = 10.0,
			instructionhint_enable = 1,
			instructionhint_r = 0,
			instructionhint_g = 255,
			instructionhint_b = 255,
			suppress_hint = 0,
			glow_enable = 1,
			range = 2500.0,
			glow_range = 2500,
			glow_flash = 0,
			chat_vocalize_enable = 1,
			emit_sound = 1,
			sound_name = "buttons/blip1.wav",
		}
	}

	function ParseConfigFile()
	{
		local settings = { Convars = "/convars.cfg", SpotMarker = "/spot_marker.cfg", SurvivorMarker = "/survivor_marker.cfg", InfectedMarker = "/infected_marker.cfg", ItemMarker = "/item_marker.cfg" }

		local convars =
		[
			["chat_cmd", @(v) (typeof(v) == "integer")],
			["look_cmd", @(v) (typeof(v) == "integer")],
			["dominated_enable", @(v) (typeof(v) == "integer")],
			["hanging_enable", @(v) (typeof(v) == "integer")],
			["dot_product", @(v) (typeof(v) == "integer")],
			["use_context", @(v) (typeof(v) == "integer")],
			["english_only", @(v) (typeof(v) == "integer")],
			["allow_remark", @(v) (typeof(v) == "integer")],

			["enable", @(v) (typeof(v) == "integer")],
			["r", @(v) (typeof(v) == "integer" && v >= 0 && v <= 255)],
			["g", @(v) (typeof(v) == "integer" && v >= 0 && v <= 255)],
			["b", @(v) (typeof(v) == "integer" && v >= 0 && v <= 255)],
			["use_range", @(v) ((typeof(v) == "integer" || typeof(v) == "float") && v >= 0)],
			["duration", @(v) ((typeof(v) == "integer" || typeof(v) == "float") && v >= 1)],
			["instructionhint_enable", @(v) (typeof(v) == "integer")],
			["instructionhint_r", @(v) (typeof(v) == "integer" && v >= 0 && v <= 255)],
			["instructionhint_g", @(v) (typeof(v) == "integer" && v >= 0 && v <= 255)],
			["instructionhint_b", @(v) (typeof(v) == "integer" && v >= 0 && v <= 255)],
			["suppress_hint", @(v) (typeof(v) == "integer")],
			["range", @(v) ((typeof(v) == "integer" || typeof(v) == "float") && v >= 0)],

			["beam_enable", @(v) (typeof(v) == "integer")],

			["glow_enable", @(v) (typeof(v) == "integer")],
			["glow_range", @(v) (typeof(v) == "integer" && v >= 0)],
			["glow_flash", @(v) (typeof(v) == "integer" && (v == 0 || v == 1))],
			["chat_vocalize_enable", @(v) (typeof(v) == "integer")],

			["emit_sound", @(v) (typeof(v) == "integer")],
			["sound_name", @(v) (typeof(v) == "string")],

			["si_flag", @(v) (typeof(v) == "integer" && v >= 0 && v <= 255)]
		];

		local function SerializeSettings(setting)
		{
			local filename = RULE_NAME + settings[setting];
			local sData = "{\n";
			foreach(i, arr in convars)
			{
				local convar = arr[0];
				if(convar in Settings[setting])
				{
					local value = Settings[setting][convar];
					sData = sData + "\t" + convar + " = " + ((typeof(value) == "string") ? ("\"" + value + "\"") : (value)) + "\n";
				}
			}
			sData = sData + "}\t" // y
			StringToFile(filename, sData);
		}

		foreach(setting, table in Settings)
		{
			local tData;
			local do_serialize = false;
			if(tData = FileToString(RULE_NAME + settings[setting]))
			{
				try
				{
					tData = compilestring("return " + tData)();
					foreach(i, arr in convars)
					{
						local convar = arr[0];
						local func = arr[1];
						if(convar in table)
						{
							local value = table[arr[0]];
							if(convar in tData)
							{
								if(func(tData[convar]))
								{
									value = tData[convar];
								} else { do_serialize = true; }
							}
							else { do_serialize = true; }
							// setting the value
							table[convar] = value;
						}
					}
				}
				catch(e) { do_serialize = true; }
			} else { do_serialize = true; }
			if(do_serialize)
			{
				SerializeSettings(setting);
			}
		}

	}

	RULE_NAME = "interneted_hintmarker",

	function RunFunction(query)
	{
		if(CheckQuery(query) && RULE_NAME in query)
		{
			for(local player; player = Entities.FindByClassname(player, "player");)
			{
				if(player.GetNetworkIDString() == query[RULE_NAME] && player.IsSurvivor() && player.IsValid())
				{
					local concepts = "";
					if("concept" in query)
					{
						local concept = query.concept;
						if((concept == "PlayerLook" || concept == "PlayerLookHere") && "subject" in query && Settings.SurvivorMarker.enable > 0)
						{
							if(query.subject.tolower() != "none")
							{
								concepts = [0, query.subject]; // survivor
							}
						}
						else if(concept == "PlayerWarnSpecial" && "specialtype" in query && Settings.InfectedMarker.enable > 0)
						{
							local temp = ["SMOKER", "BOOMER", "HUNTER", "SPITTER", "JOCKEY", "CHARGER", "WITCH", "TANK"]
							local idx = temp.find(query.specialtype);
							if(idx != null)
							{
								if((Settings.InfectedMarker.si_flag & pow(2, idx).tointeger()) > 0)
								{
									concepts = [1, idx + 1]; // special infected
								}
							}
						}
						else if(concept == "PlayerSpotWeapon" && Settings.ItemMarker.enable > 0)
						{
							if("weaponname" in query)
							{
								local temp =
								{
									PipeBomb = ["weapon_pipe_bomb", 14],
									Molotov = ["weapon_molotov", 13],
									Rifle_Desert = ["weapon_rifle_desert", 9],
									Sniper_Military = ["weapon_sniper_military", 10],
									HuntingRifle = ["weapon_hunting_rifle", 6],
									SMG_Silenced = ["weapon_smg_silenced", 7],
									SMG = ["weapon_smg", 2],
									Shotgun_SPAS = ["weapon_shotgun_spas", 11],
									Shotgun_Chrome = ["weapon_shotgun_chrome", 8],
									SecondPistol = ["weapon_pistol", 1],
									FirstAidKit = ["weapon_first_aid_kit", 12],
									PainPills = ["weapon_pain_pills", 15],
									Adrenaline = ["weapon_adrenaline", 23],
									VomitJar = ["weapon_vomitjar", 25],
									Rifle = ["weapon_rifle", 5],
									UpgradePack_Incendiary = ["weapon_upgradepack_incendiary", 30],
									UpgradePack_Explosive = ["weapon_upgradepack_explosive", 31],
									GrenadeLauncher = ["weapon_grenade_launcher", 21],
									Defibrillator = ["weapon_defibrillator", 24],
									PumpShotgun = ["weapon_pumpshotgun", 3],
									Ammo = ["weapon_ammo_spawn", null],
									magnum = ["weapon_pistol_magnum", 32],
									Chainsaw = ["weapon_chainsaw", 20],
									Rifle_AK47 = ["weapon_rifle_ak47", 26],
									AutoShotgun = ["weapon_autoshotgun", 4],
									SMG_MP5 = ["weapon_smg_mp5", 33],
									Rifle_SG552 = ["weapon_rifle_sg552", 34],
									Sniper_Scout = ["weapon_sniper_scout", 36],
									Sniper_AWP = ["weapon_sniper_awp", 35],
									LaserSights = ["upgrade_laser_sight", null],
									M60 = ["weapon_rifle_m60", 37],
								}
								if(query.weaponname in temp)
								{
									local v = temp[query.weaponname];
									concepts = [2, v[0], v[1]]; // weapon
								}
								else
								{
									temp =
									{
										katana = "katana",
										baseball_bat = "baseball_bat",
										cricket_bat = "cricket_bat",
										electric_guitar = "electric_guitar",
										machete = "machete",
										crowbar = "crowbar",
										tonfa = "tonfa",
										fireaxe = "fireaxe",
										frying_pan = "frying_pan",
										shovel = "shovel",
										pitchfork = "pitchfork",
										Knife = "knife",
										golfclub = "golfclub",
										riotshield = "riotshield",
									}
									if(query.weaponname in temp)
									{
										concepts = [3, temp[query.weaponname]]; // melee
									}
								}
							}
						}
					}

					HintMarker(player, concepts);
					return;
				}
			}
		}
	}

	function CheckQuery(query)
	{
		if("smartlooktype" in query)
		{
			return (query.smartlooktype == "manual");
		}
		return false;
	}

	function OnGameEvent_player_spawn(params)
	{
		if("userid" in params)
		{
			local player = GetPlayerFromUserID(params.userid);
			if(!IsPlayerABot(player))
			{
				local steam_id = player.GetNetworkIDString();
				player.SetContext(RULE_NAME, steam_id, -1);
				if(player.ValidateScriptScope())
				{
					local scope = player.GetScriptScope();
					if(!(RULE_NAME in scope))
					{
						scope[RULE_NAME] <- [null, null];
					}
				}
			}
		}
	}

	// TRACE_MASK_SHOT
	MASK = 1174421507, // 100679689

	function GetLookingEntity(player)
	{
		local eye_pos = player.EyePosition();
		local trace_table =
		{
			start = eye_pos,
			end = eye_pos + player.EyeAngles().Forward().Scale(999999),
			ignore = player,
			mask = MASK,
		}
		TraceLine(trace_table);
		if(trace_table.hit)
		{
			return [("enthit" in trace_table) ? trace_table.enthit : null, ("pos" in trace_table) ? trace_table.pos : null]
		}
		return [null, null];
	}

	function GetMeleeName(model)
	{
		switch(model)
		{
			case "models/weapons/melee/w_crowbar.mdl"			: return "crowbar";
			case "models/weapons/melee/w_frying_pan.mdl"     	: return "frying_pan";
			case "models/weapons/melee/w_fireaxe.mdl"        	: return "fireaxe";
			case "models/weapons/melee/w_machete.mdl"        	: return "machete";
			case "models/weapons/melee/w_katana.mdl"         	: return "katana";
			case "models/weapons/melee/w_tonfa.mdl"          	: return "tonfa";
			case "models/weapons/melee/w_golfclub.mdl"       	: return "golfclub";
			case "models/weapons/melee/w_bat.mdl"            	: return "baseball_bat";
			case "models/weapons/melee/w_cricket_bat.mdl"    	: return "cricket_bat";
			case "models/weapons/melee/w_electric_guitar.mdl"	: return "electric_guitar";
			case "models/w_models/weapons/w_knife_t.mdl"     	: return "knife";
			case "models/weapons/melee/w_pitchfork.mdl"      	: return "pitchfork";
			case "models/weapons/melee/w_shovel.mdl"         	: return "shovel";
			case "models/weapons/melee/v_riotshield.mdl"     	: return "riotshield";
		}
		return "generic";
	}

	function HintMarker(player, concepts = "")
	{
		if(player.IsHangingFromLedge() && Settings.Convars.hanging_enable < 1) { return; }
		if(player.IsDominatedBySpecialInfected() && Settings.Convars.dominated_enable < 1) { return; }

		local look = GetLookingEntity(player);
		local ent = look[0]; local pos = look[1]
		local remark = (Settings.Convars.allow_remark > 0)
		if(HintMarkerWithoutFOV(player, ent, pos, remark)) { return; }

		// use_context
		if(Settings.Convars.use_context > 0 && concepts != "")
		{
			if(HintMarkerWithContext(player, concepts)) { return; }
		}

		// dot_product
		if(Settings.Convars.dot_product > 0)
		{
			if(HintMarkerWithFOV(player)) { return; }
		}

		// SpotMarker
		if(ent != null && pos != null)
		{
			if((pos - player.EyePosition()).Length() <= Settings.SpotMarker.use_range && Settings.SpotMarker.enable > 0)
			{
				SpawnSpotMarker(player, pos);
				if(Settings.SpotMarker.emit_sound > 0) { PlaySound(player, Settings.SpotMarker.sound_name); }
			}
		}
	}

	function HintMarkerWithoutFOV(player, ent, pos, remark = false)
	{
		if(ent != null && pos != null)
		{
			local classname = ent.GetClassname()
			local marked = RULE_NAME + "_marked";
			if(ent.ValidateScriptScope())
			{
				local scope = ent.GetScriptScope();
				if((ent.IsPlayer() || classname == "witch"))
				{
					if(PlayerMarker(pos, player, marked, scope, ent, classname, remark)) { return true; }
				}
				else if(classname in WEAPON)
				{
					local message = ["WEAPON", classname];
					// item marker
					if(ItemMarker(pos, player, marked, scope, ent, message, remark)) { return true; }
				}
				else if(classname == "weapon_melee" || classname == "weapon_melee_spawn")
				{
					local melee_weapon = NetProps.GetPropString(ent, (classname == "weapon_melee") ? "m_strMapSetScriptName" : "m_iszMeleeWeapon").tolower(); // Any and any exist.

					if(classname == "weapon_melee_spawn")
					{
						if(melee_weapon == "any") { melee_weapon = GetMeleeName(ent.GetModelName()); }
						else if(!(melee_weapon in MELEE)) { melee_weapon = "generic"; }
					}
					else if(classname == "weapon_melee" && !(melee_weapon in MELEE))
					{
						melee_weapon = "generic";
					}
					local message = ["MELEE", melee_weapon];
					// item marker
					if(ItemMarker(pos, player, marked, scope, ent, message, remark)) { return true; }
				}
				else if(classname == "weapon_spawn")
				{
					local id = NetProps.GetPropInt(ent, "m_weaponID");
					local function GetWeaponNameFromID(ent, id)
					{
						switch(id)
						{
							case 1:		return "weapon_pistol";
							case 2: 	return "weapon_smg";
							case 3: 	return "weapon_pumpshotgun";
							case 4: 	return "weapon_autoshotgun";
							case 5: 	return "weapon_rifle";
							case 6: 	return "weapon_hunting_rifle";
							case 7: 	return "weapon_smg_silenced";
							case 8: 	return "weapon_shotgun_chrome";
							case 9: 	return "weapon_rifle_desert";
							case 10:	return "weapon_sniper_military";
							case 11:	return "weapon_shotgun_spas";
							case 12:	return "weapon_first_aid_kit";
							case 13:	return "weapon_molotov";
							case 14:	return "weapon_pipe_bomb";
							case 15:	return "weapon_pain_pills";
							case 16:	return "weapon_gascan";
							case 17:	return "weapon_propanetank";
							case 18:	return "weapon_oxygentank";
							case 19:	return GetMeleeName(ent.GetModelName());
							case 20:	return "weapon_chainsaw";
							case 21:	return "weapon_grenade_launcher";
							// 22
							case 23:	return "weapon_adrenaline";
							case 24:	return "weapon_defibrillator";
							case 25:	return "weapon_vomitjar";
							case 26:	return "weapon_rifle_ak47";
							case 27:	return "weapon_gnome";
							case 28:	return "weapon_cola_bottles";
							case 29:	return "weapon_fireworkcrate";
							case 30:	return "weapon_upgradepack_incendiary";
							case 31:	return "weapon_upgradepack_explosive";
							case 32:	return "weapon_pistol_magnum";
							case 33:	return "weapon_smg_mp5";
							case 34:	return "weapon_rifle_sg552";
							case 35:	return "weapon_sniper_awp";
							case 36:	return "weapon_sniper_scout";
							case 37:	return "weapon_rifle_m60";
							case 54:	return "prop_minigun_l4d1";
						}
						return "GENERIC";
					}
					local weapon_name = GetWeaponNameFromID(ent, id);
					local message = "GENERIC";
					if(weapon_name in WEAPON)
					{
						message = ["WEAPON", weapon_name];
					}
					else if(weapon_name in MELEE)
					{
						message = ["MELEE", weapon_name];
					}
					// item marker
					if(ItemMarker(pos, player, marked, scope, ent, message, remark)) { return true; }
				}
				else if(classname == "prop_physics")
				{
					local message = "";
					local model = ent.GetModelName();
					local models =
					{
						"models/props_junk/propanecanister001a.mdl"	: "weapon_propanetank",
						"models/props_equipment/oxygentank01.mdl"	: "weapon_oxygentank",
						"models/props_junk/gascan001a.mdl"			: "weapon_gascan",
						"models/props_junk/explosive_box001.mdl"	: "weapon_fireworkcrate",
					}
					if(model in models)
					{
						message = ["WEAPON", models[model]];
					}
					if(message != "")
					{
						// item marker
						if(ItemMarker(pos, player, marked, scope, ent, message, remark)) { return true; }
					}

				}
			}
		}
		return false;
	}

	function HintMarkerWithContext(player, concepts)
	{
		local fov = PI / 8.0; // 22.5 deg
		local idx = concepts[0];
		local eye_pos = player.EyePosition();
		local marked = RULE_NAME + "_marked";

		local ent = null;
		local pos = null;
		local function check_ent(e, angles, position)
		{
			if(!(angles <= fov) || position == null || marked in e.GetScriptScope()) { return; }

			fov = angles; // replace the old angles with the new one.
			ent = e;
			pos = position;
		}

		if(idx == 0) // survivor
		{
			local who = concepts[1];
			local response_targets = rr_GetResponseTargets();

			foreach(actor, survivor in response_targets)
			{
				if(actor == who && survivor != player && survivor.IsSurvivor() && !survivor.IsDying() && !survivor.IsDead() && (eye_pos - survivor.GetCenter()).Length() < 1000.0 && survivor.ValidateScriptScope())
				{
					check_ent(survivor, GetAnglesBetween(player, survivor), IsVisibleTo(player, survivor));
				}
			}
		}
		else if(idx == 1) // special infected
		{
			local type = concepts[1];
			local c = (type == 7) ? "witch" : "player";
			for(local infected; infected = Entities.FindByClassnameWithin(infected, c, eye_pos, 1000.0);)
			{
				if(infected.IsValid() && NetProps.GetPropInt(infected, "m_lifeState") < 1 && infected.ValidateScriptScope())
				{
					local angles = GetAnglesBetween(player, infected);
					local position = IsVisibleTo(player, infected);
					if(c == "witch")
					{
						if(!(angles <= fov)) { continue; }
					}
					else if(infected.GetZombieType() == type)
					{
						if(!(angles <= fov)) { continue; }
					}
					else { continue; }
					check_ent(infected, angles, position);
				}
			}
		}
		else if(idx == 2) // weapon
		{
			local classname = concepts[1];
			local id = concepts[2];

			local classnames = [classname, classname + "_spawn"];
			foreach(i, c in classnames)
			{
				for(local weapon; weapon = Entities.FindByClassnameWithin(weapon, c, eye_pos, 1000.0);)
				{
					if(weapon.IsValid() && weapon.ValidateScriptScope())
					{
						if(NetProps.HasProp(weapon, "m_hOwner"))
						{
							if(NetProps.GetPropEntity(weapon, "m_hOwner") != null) { continue; }
						}

						if(NetProps.HasProp(weapon, "m_itemCount"))
						{
							if((NetProps.GetPropInt(weapon, "m_itemCount") <= 0) && (NetProps.GetPropInt(weapon, "m_spawnflags") & 8) == 0) { continue; }
						}
						check_ent(weapon, GetAnglesBetween(player, weapon), IsVisibleTo(player, weapon));
					}
				}
			}
			for(local weapon; weapon = Entities.FindByClassnameWithin(weapon, "weapon_spawn", eye_pos, 1000.0);)
			{
				if(weapon.IsValid() && NetProps.GetPropInt(weapon, "m_weaponID") == id && weapon.ValidateScriptScope())
				{
					if((NetProps.GetPropInt(weapon, "m_itemCount") <= 0) && (NetProps.GetPropInt(weapon, "m_spawnflags") & 8) == 0) { continue; }
					check_ent(weapon, GetAnglesBetween(player, weapon), IsVisibleTo(player, weapon));
				}
			}
		}
		else if(idx == 3) // melee
		{
			local name = concepts[1];
			for(local melee; melee = Entities.FindByClassnameWithin(melee, "weapon_melee", eye_pos, 1000.0);)
			{
				if(melee.IsValid() && (NetProps.GetPropString(melee, "m_strMapSetScriptName").tolower() == name) && NetProps.GetPropEntity(melee, "m_hOwner") == null && melee.ValidateScriptScope())
				{
					check_ent(melee, GetAnglesBetween(player, melee), IsVisibleTo(player, melee));
				}
			}
			for(local melee; melee = Entities.FindByClassnameWithin(melee, "weapon_melee_spawn", eye_pos, 1000.0);)
			{
				if(melee.IsValid() && melee.ValidateScriptScope())
				{
					if((NetProps.GetPropInt(melee, "m_itemCount") <= 0) && (NetProps.GetPropInt(melee, "m_spawnflags") & 8) == 0) { continue; }

					local melee_weapon = NetProps.GetPropString(melee, "m_iszMeleeWeapon").tolower();
					if(melee_weapon == "any") { melee_weapon = GetMeleeName(melee.GetModelName()); }
					if(melee_weapon == name)
					{
						check_ent(melee, GetAnglesBetween(player, melee), IsVisibleTo(player, melee));
					}
				}
			}
			for(local melee; melee = Entities.FindByClassnameWithin(melee, "weapon_spawn", eye_pos, 1000.0);)
			{
				if(melee.IsValid() && NetProps.GetPropInt(melee, "m_weaponID") == 19 && GetMeleeName(ent.GetModelName()) == name && melee.ValidateScriptScope())
				{
					if((NetProps.GetPropInt(melee, "m_itemCount") <= 0) && (NetProps.GetPropInt(melee, "m_spawnflags") & 8) == 0) { continue; }
					check_ent(melee, GetAnglesBetween(player, melee), IsVisibleTo(player, melee));
				}
			}
		}

		return HintMarkerWithoutFOV(player, ent, pos);
	}

	function GetAnglesBetween(player, ent)
	{
		local v1 = player.EyeAngles().Forward();
		local v2 = ent.GetCenter() - player.EyePosition();
		local angles = acos(v1.Dot(v2) / (v1.Length() * v2.Length()));
		return angles;
	}

	function IsVisibleTo(player, ent)
	{
		local eye_pos = player.EyePosition();
		local center = ent.GetCenter();
		local trace_mask = (ent.GetClassname() == "player") ? 100679689 : MASK;

		local trace_table = { start = eye_pos, end = center, ignore = player, mask = trace_mask }
		TraceLine(trace_table);

		if(trace_table.hit) // if it does not hit, let it pass, some entities don't have their center inside their collision mesh for some reason.
		{
			if(("enthit" in trace_table) && ("pos" in trace_table))
			{
				if(trace_table.enthit == ent)
				{
					return trace_table.pos;
				}
			}
			return null;
		}
		return center;
	}

	function HintMarkerWithFOV(player)
	{
		local eye_pos = player.EyePosition();
		local classnames = ["player"];
		if(Settings.ItemMarker.enable > 0) { classnames.extend(["prop_physics", "prop_minigun_l4d1", "prop_minigun", "upgrade_ammo_explosive", "upgrade_ammo_incendiary", "upgrade_laser_sight", "weapon_*"]); }
		if(Settings.InfectedMarker.enable > 0 && (Settings.InfectedMarker.si_flag & 64) > 0) { classnames.append("witch"); }

		local fov = PI / 10.0; // 18 deg
		local ent = null;
		local pos = null;
		foreach(i, c in classnames)
		{
			for(local e; e = Entities.FindByClassname(e, c);)
			{
				// entity should be valid
				if(!e.IsValid()) { continue; }

				if(e == player) { continue; }

				// has not been marked
				if(e.ValidateScriptScope())
				{
					if(RULE_NAME + "_marked" in e.GetScriptScope()) { continue; }
				}

				// not being held by a survivor
				if(NetProps.HasProp(e, "m_hOwner"))
				{
					if(NetProps.GetPropEntity(e, "m_hOwner") != null) { continue; }
				}

				// is not dead, player
				if(NetProps.HasProp(e, "m_lifeState"))
				{
					if(NetProps.GetPropInt(e, "m_lifeState") > 0) { continue; }
				}

				// weapon spawns has 0 item count, skip.
				if(NetProps.HasProp(e, "m_itemCount"))
				{
					if((NetProps.GetPropInt(e, "m_itemCount") <= 0) && (NetProps.GetPropInt(e, "m_spawnflags") & 8) == 0) { continue; }
				}

				// prop physics
				if(c == "prop_physics")
				{
					if(NetProps.GetPropInt(e, "m_isCarryable") < 1) { continue; }
					local models =
					{
						"models/props_junk/propanecanister001a.mdl"	: "weapon_propanetank",
						"models/props_equipment/oxygentank01.mdl"	: "weapon_oxygentank",
						"models/props_junk/gascan001a.mdl"			: "weapon_gascan",
						"models/props_junk/explosive_box001.mdl"	: "weapon_fireworkcrate",
					}
					if(!(e.GetModelName() in models)) { continue; }
				}

				// InfectedMarker and SurvivorMarker settings
				if(c == "player")
				{
					if(e.IsSurvivor() && Settings.SurvivorMarker.enable < 1) { continue; }
					else if(!e.IsSurvivor() && (Settings.InfectedMarker.enable < 1 || (Settings.InfectedMarker.si_flag & pow(2, e.GetZombieType() - 1).tointeger()) == 0)) { continue; }
				}

				// ? since this is done with the entity's center, it's not perfect.
				// ? the entity could be in the corner and slight blocked by world geometry and it's still cannot be marked.
				// ? i have thought of doing 100 trace lines within fov, but that would degrade performance, considering i am already looping entities.
				// ? i also cannot find any unique entities that could do the job for me.
				// entity should be within fov from previous entity
				local angles = GetAnglesBetween(player, e);
				if(!(angles <= fov)) { continue; }
				fov = angles; // replace the old angles with the new one.

				local position = IsVisibleTo(player, e);
				if(position != null)
				{
					ent = e;
					pos = position;
				}
			}
		}

		return HintMarkerWithoutFOV(player, ent, pos);
	}

	/**
	 * PLAYER MARKER
	 */
	function PlayerMarker(pos, player, marked, scope, ent, classname, remark = false)
	{
		local type = (classname == "witch") ? 7 : ent.GetZombieType();
		local key = (type < 9) ? Settings.InfectedMarker : Settings.SurvivorMarker;
		local do_execute = (type < 9) ? (key.enable && (key.si_flag & pow(2, type - 1).tointeger()) > 0) : key.enable;

		if(((pos - player.EyePosition()).Length() <= key.use_range) && do_execute && NetProps.GetPropInt(ent, "m_lifeState") < 1)
		{
			if(marked in scope && remark)
			{
				delete scope[marked];
				AutomaticStop(ent);
			}

			if(!(marked in scope))
			{
				// mark it as marked
				scope[marked] <- Time();

				// set glow
				if(key.glow_enable > 0)
				{
					local color = key.r | (key.g << 8) | (key.b << 16);
					local flashing = (key.glow_flash < 1) ? 0 : 1;
					SetGlow(ent, 3, color, flashing, key.glow_range);
					scope[RULE_NAME + "_glow"] <- 0;
				}

				// emit sound
				if(key.emit_sound > 0) { PlaySound(player, key.sound_name); }

				local color = [key.instructionhint_r, key.instructionhint_g, key.instructionhint_b];
				local icon = (type < 9) ? "icon_skull" : "icon_alert";
				local suppress = (key.suppress_hint > 0) ? 1 : 0;

				DoEntFire("!self", "RunScriptCode", "::Interneted_HintMarker.SetTempName(self);", 0.0, null, ent);
				for(local survivor; survivor = Entities.FindByClassname(survivor, "player");)
				{
					if(survivor.IsValid() && survivor.IsSurvivor() && !IsPlayerABot(survivor) && ent != survivor)
					{
						local lang = (Settings.Convars.english_only < 1) ? Convars.GetClientConvarValue("cl_language", survivor.GetEntityIndex()) : "english";
						local message = ((type < 9) ? (PLAYER[type - 1](lang)) : ent.GetPlayerName());
						if(type < 9)
						{
							message = PLAYER[type - 1](lang);
						}
						else if(IsPlayerABot(ent))
						{
							local p = GetPlayerFromUserID(NetProps.GetPropInt(ent, "m_humanSpectatorUserID"));
							if(p != null)
							{
								if(p.IsValid())
								{
									message = p.GetPlayerName();
								}
							}
						}

						// chat vocalize
						if(key.chat_vocalize_enable > 0)
						{
							ClientPrint(survivor, 3, "\x03" + player.GetPlayerName() + "\x01" + " : " + "\x04" + message);
						}
						// show hint
						if(key.instructionhint_enable > 0)
						{
							DisplayHint(survivor, RULE_NAME, message, icon, key.duration, key.range, color, suppress);
						}
					}
				}
				DoEntFire("!self", "RunScriptCode", "::Interneted_HintMarker.SetTempName(self);", 0.0, null, ent);

				DoEntFire("!self", "RunScriptCode", "::Interneted_HintMarker.UnmarkEntity(self);", key.duration, null, ent);
				DoEntFire("!self", "RunScriptCode", "::Interneted_HintMarker.AutomaticStop(self);", key.duration, null, ent);
				return true;
			}
		}
		return false;
	}

	/**
	 * ITEM MARKER
	 */
	function ItemMarker(pos, player, marked, scope, ent, message, remark = false)
	{
		if(NetProps.HasProp(ent, "m_itemCount"))
		{
			if((NetProps.GetPropInt(ent, "m_itemCount") <= 0) && (NetProps.GetPropInt(ent, "m_spawnflags") & 8) == 0) { return false; }
		}

		if(NetProps.HasProp(ent, "m_isCarryable"))
		{
			if(NetProps.GetPropInt(ent, "m_isCarryable") < 1) { return false; }
		}

		if(((pos - player.EyePosition()).Length() <= Settings.ItemMarker.use_range) && Settings.ItemMarker.enable)
		{
			if(marked in scope && remark)
			{
				delete scope[marked];
				AutomaticStop(ent);
			}

			if(!(marked in scope))
			{
				// mark it as marked
				scope[marked] <- Time();

				// set glow
				if(Settings.ItemMarker.glow_enable > 0)
				{
					local color = Settings.ItemMarker.r | (Settings.ItemMarker.g << 8) | (Settings.ItemMarker.b << 16);
					local flashing = (Settings.ItemMarker.glow_flash < 1) ? 0 : 1;
					SetGlow(ent, 3, color, flashing, Settings.ItemMarker.glow_range);
					scope[RULE_NAME + "_glow"] <- 0;
				}

				// emit sound
				if(Settings.ItemMarker.emit_sound > 0) { PlaySound(player, Settings.ItemMarker.sound_name); }

				local color = [Settings.ItemMarker.instructionhint_r, Settings.ItemMarker.instructionhint_g, Settings.ItemMarker.instructionhint_b];
				local suppress = (Settings.ItemMarker.suppress_hint > 0) ? 1 : 0;
				local icon = GetItemIcon(message); // icon_interact before

				DoEntFire("!self", "RunScriptCode", "::Interneted_HintMarker.SetTempName(self);", 0.0, null, ent);
				for(local survivor; survivor = Entities.FindByClassname(survivor, "player");)
				{
					if(survivor.IsValid() && survivor.IsSurvivor() && !IsPlayerABot(survivor))
					{
						local lang = (Settings.Convars.english_only < 1) ? Convars.GetClientConvarValue("cl_language", survivor.GetEntityIndex()) : "english";
						local msg = (message == "GENERIC") ? GENERIC(lang) : this[message[0]][message[1]](lang);
						// chat vocalize
						if(Settings.ItemMarker.chat_vocalize_enable > 0)
						{
							ClientPrint(survivor, 3, "\x03" + player.GetPlayerName() + "\x01" + " : " + "\x04" + msg);
						}
						// show hint
						if(Settings.ItemMarker.instructionhint_enable > 0)
						{
							DisplayHint(survivor, RULE_NAME, msg, icon, Settings.ItemMarker.duration, Settings.ItemMarker.range, color, suppress);
						}
					}
				}
				DoEntFire("!self", "RunScriptCode", "::Interneted_HintMarker.SetTempName(self);", 0.0, null, ent);

				DoEntFire("!self", "RunScriptCode", "::Interneted_HintMarker.UnmarkEntity(self);", Settings.ItemMarker.duration, null, ent);
				DoEntFire("!self", "RunScriptCode", "::Interneted_HintMarker.AutomaticStop(self);", Settings.ItemMarker.duration, null, ent);
				return true;
			}
		}
		return false;
	}

	function GetItemIcon(message)
	{
		if(message == "GENERIC") { return "icon_equip_pistol"; }

		local weapon_type = message[0];
		local c = message[1];

		switch(c)
		{
			case "weapon_upgradepack_incendiary": case "weapon_upgradepack_incendiary_spawn": case "upgrade_ammo_incendiary":
			{ return "icon_incendiary_ammo"; }
			case "weapon_upgradepack_explosive": case "weapon_upgradepack_explosive_spawn": case "upgrade_ammo_explosive":
			{ return "icon_explosive_ammo" }
			case "weapon_first_aid_kit": case "weapon_first_aid_kit_spawn":
			{ return "icon_equip_medkit"; }
			case "weapon_defibrillator": case "weapon_defibrillator_spawn":
			{ return "icon_defibrillator"; }

			case "weapon_pain_pills": case "weapon_pain_pills_spawn":
			{ return "icon_equip_pills"; }
			case "weapon_adrenaline": case "weapon_adrenaline_spawn":
			{ return "icon_equip_adrenaline"; }

			case "upgrade_laser_sight":
			{ return "icon_laser_sight"; }
			case "weapon_ammo_spawn":
			{ return "icon_ammo"; }

			// case "weapon_pipe_bomb": case "weapon_pipe_bomb_spawn":
			// { return "icon_equip_pipebomb"; }
			// case "weapon_molotov": case "weapon_molotov_spawn":
			// { return "icon_equip_molotov"; }
			// case "weapon_vomitjar": case "weapon_vomitjar_spawn":
			// { return "icon_equip_pipebomb"; } // WHY

			case "weapon_gascan": case "weapon_gascan_spawn":
			case "weapon_oxygentank":
			case "weapon_propanetank":
			case "weapon_fireworkcrate":
			{ return "icon_gas_can"; }
			case "weapon_cola_bottles":
			{ return "icon_cola_bottles"; }

			case "weapon_pistol_magnum": case "weapon_pistol_magnum_spawn":
			{ return "icon_deagle"; }

			case "weapon_gnome":
			{ return "icon_interact"; }
		}

		return "icon_equip_pistol";
	}

	function UnmarkEntity(ent)
	{
		if(ent != null)
		{
			if(ent.ValidateScriptScope())
			{
				local scope = ent.GetScriptScope();
				local marked = RULE_NAME + "_marked";
				local time = Settings.ItemMarker.duration;
				if(ent.IsPlayer())
				{
					time = (ent.IsSurvivor()) ? Settings.SurvivorMarker.duration : Settings.InfectedMarker.duration;
				}
				else if(ent.GetClassname() == "witch")
				{
					time = Settings.InfectedMarker.duration;
				}

				if(marked in scope)
				{
					if(Time() - scope[marked] >= time)
					{
						delete scope[marked];
					}
				}
			}
		}
	}

	function AutomaticStop(ent)
	{
		if(ent != null)
		{
			if(ent.ValidateScriptScope())
			{
				local scope = ent.GetScriptScope();
				if(!(RULE_NAME + "_marked" in scope))
				{
					if(RULE_NAME + "_glow" in scope)
					{
						SetGlow(ent);
					}

					// manual hint end incase duration doesn't work.
					local hint = Entities.FindByName(null, "interneted_instructor_hint");
					if(hint == null) { hint = SpawnEntityFromTable("env_instructor_hint", { targetname = "interneted_instructor_hint" }) }
					DoEntFire("!self", "RunScriptCode", "::Interneted_HintMarker.EndHint(self)", 0.0, null, ent);
					DoEntFire("!self", "EndHint", "", 0.0, null, hint);
				}
			}
		}
	}

	/**
	 * SPOT MARKER
	 */
	function SpawnSpotMarker(player, pos)
	{
		local identifier = "inter_hm_" + player.GetNetworkIDString();
		if(player.ValidateScriptScope())
		{
			// kill previous spot marker if it exists
			local scope = player.GetScriptScope();
			local pos = pos + Vector(0.0, 0.0, 5.0);
			if(RULE_NAME in scope)
			{
				foreach(i, v in scope[RULE_NAME])
				{
					if(v != null) { v.Kill(); }
				}
			}
			else { scope[RULE_NAME] <- [null, null]; }

			for(local i = 1; i < 3; i++)
			{
				local prop = Entities.FindByName(null, identifier + "_" + i)
				if(prop != null) { prop.Kill(); }
			}

			// create the new spot marker
			if(Settings.SpotMarker.beam_enable > 0)
			{
				scope[RULE_NAME][0] = SpawnRing(player, pos).weakref();
				scope[RULE_NAME][1] = SpawnSprite(player, pos).weakref();
			}


			// show hint
			// ! i want to use existing env_beam for the instructor hint instead of info_target.
			// ! it definitely works after enabling EFL_FORCE_CHECK_TRANSMIT on m_iEFlags.
			// ! but the hint will show at (env_beam's origin * 0.5), wtf, there's probably more stuff i've missed.
			// ! i can just multiply the origin by 2, but i am concerned if it will affect the hint_range.
			local info = Entities.FindByName(null, identifier);
			if(info != null) { info.Kill(); }
			info = SpawnEntityFromTable("info_target", { targetname = identifier, spawnflags = 1, origin = pos });

			// ! wtf, you can't show a hint instantly after spawning info_target, need more delay, 0.04 seems reasonable.
			if(info != null)
			{
				local color = [Settings.SpotMarker.instructionhint_r, Settings.SpotMarker.instructionhint_g, Settings.SpotMarker.instructionhint_b];
				local suppress = (Settings.SpotMarker.suppress_hint > 0) ? 1 : 0;

				for(local survivor; survivor = Entities.FindByClassname(survivor, "player");)
				{
					if(survivor.IsValid() && survivor.IsSurvivor() && !IsPlayerABot(survivor))
					{
						if(Settings.SpotMarker.instructionhint_enable > 0)
						{
							DisplayHint(survivor, identifier, player.GetPlayerName(), "icon_info", Settings.SpotMarker.duration, Settings.SpotMarker.range, color, Settings.SpotMarker.suppress_hint, 0.04);
						}
					}
				}
			}
			DoEntFire("!self", "Kill", "", Settings.SpotMarker.duration, null, info);
		}
	}

	function SpawnRing(player, pos)
	{
		// * both start and end entities must not be a static and point entities
		// * or else ring flag will not work, based on sdk13 source code.
		local prop1 = SpawnProp(player, pos, true);
		local prop2 = SpawnProp(player, pos, false);

		local settings = Settings.SpotMarker;
		local duration = (settings.duration < 1.0) ? 1.0 : settings.duration;

		local beam = SpawnEntityFromTable("env_beam", {
			origin = pos,
			LightningStart = prop1.GetName(),
			LightningEnd = prop2.GetName(),
			rendercolor = settings.r + " " + settings.g + " " + settings.b,
			renderamt = 255,
			BoltWidth = 2.0,
			life = duration,
			NoiseAmplitude = 0,
			spawnflags = 9,

			speed = 0.0,
			framestart = 0,
			framerate = 0,
			TouchType = 0,
			dissolvetype = -1,
			ClipStyle = 2,
			HDRColorScale = 1.0,
			renderfx = 0,
			radius = 100,
			texture = "materials/sprites/laserbeam.vmt"
		});

		DoEntFire("!self", "TurnOn", "", 0.0, null, beam);
		DoEntFire("!self", "RunScriptCode", "::Interneted_HintMarker.AnimateRing(self);", 0.0, null, prop1);
		DoEntFire("!self", "RunScriptCode", "::Interneted_HintMarker.AnimateRing(self);", 0.0, null, prop2);

		// ! killing the entity or firing TurnOff when lifetime is infinite
		// ! does not turn off the beam, wtf
		// ! this only applies to ring beam for whatever reason
		DoEntFire("!self", "TurnOff", "", duration, null, beam);
		DoEntFire("!self", "Kill", "", duration, null, beam);
		DoEntFire("!self", "Kill", "", duration, null, prop1);
		DoEntFire("!self", "Kill", "", duration, null, prop2);

		return beam;
	}

	function SpawnProp(player, pos, start)
	{
		local temp_model = "models/error.mdl";
		if(!IsModelPrecached(temp_model)) { PrecacheModel(temp_model); }
		local new_pos = pos + Vector(start ? -50.0 : 50.0, 0.0, 0.0);
		// * i was using prop_dynamic but i changed it to func_movelinear to allow the ring beam to animate smoothly
		local prop = SpawnEntityFromTable("func_movelinear",
		{
			targetname = "inter_hm_" + player.GetNetworkIDString() + (start ? "_1" : "_2"),
			model = temp_model,
			origin = new_pos,
			startsound = "",
			stopsound = "",
			blockdamage = 0.0,
		});
		NetProps.SetPropInt(prop, "m_Collision.m_nSolidType", 0);
		NetProps.SetPropInt(prop, "m_CollisionGroup", 0);
		NetProps.SetPropInt(prop, "m_nRenderMode", 10);
		NetProps.SetPropFloat(prop, "m_flSpeed", 10.0);
		NetProps.SetPropVector(prop, "m_vecPosition1", new_pos);
		NetProps.SetPropVector(prop, "m_vecPosition2", pos);

		// if(prop.ValidateScriptScope()) { prop.GetScriptScope()[RULE_NAME] <- start ? 1 : -1; }
		return prop;
	}

	function AnimateRing(prop)
	{
		if(prop != null)
		{
			local start_vec = NetProps.GetPropVector(prop, "m_vecPosition1");
			DoEntFire("!self", "Close", "", 0.0, null, prop);
			DoEntFire("!self", "RunScriptCode", "self.SetOrigin(NetProps.GetPropVector(self, \"m_vecPosition1\"));", 0.0, null, prop);
			DoEntFire("!self", "Open", "", 0.0, null, prop);
			DoEntFire("!self", "RunScriptCode", "::Interneted_HintMarker.AnimateRing(self);", 1.4, null, prop);
			// if(prop.ValidateScriptScope())
			// {
			// 	local scope = prop.GetScriptScope();
			// 	local start = scope[RULE_NAME] > 0; // start or end
			// 	local i = start ? (scope[RULE_NAME] > 20) : (scope[RULE_NAME] < -20); // reached the limit?
			// 	local value = (i ? 8.0 : -0.4) * (start ? -1.0 : 1.0); // value to add
			// 	prop.SetOrigin(prop.GetOrigin() + Vector(value, 0, 0));

			// 	scope[RULE_NAME] <- (start ? 1 : -1) + (i ? 0 : scope[RULE_NAME]);
			// 	DoEntFire("!self", "RunScriptCode", "::Interneted_HintMarker.AnimateRing(self);", 0.05, null, prop);
			// }
		}
	}

	function SpawnSprite(player, pos)
	{
		local origin = pos + Vector(0.0, 0.0, 50.0);

		local sprite = SpawnEntityFromTable("env_sprite", {
			origin = origin,
			model = "materials/vgui/icon_arrow_down.vmt",
			scale = 0.25,
			GlowProxySize = 5.0,
			HDRColorScale = 1.0,
			rendermode = 9, // 3 or 9
			spawnflags = 0,
		});
		if(sprite.ValidateScriptScope()) { sprite.GetScriptScope()[RULE_NAME] <- 0; }
		sprite.__KeyValueFromString("rendercolor", Settings.SpotMarker.r + " " + Settings.SpotMarker.g + " " + Settings.SpotMarker.b);
		sprite.__KeyValueFromInt("renderamt", 255);

		DoEntFire("!self", "ShowSprite", "", 0.0, null, sprite);
		DoEntFire("!self", "RunScriptCode", "::Interneted_HintMarker.AnimateSprite(self);", 0.05, null, sprite);
		DoEntFire("!self", "Kill", "", Settings.SpotMarker.duration, null, sprite);
		return sprite;
	}

	function AnimateSprite(sprite)
	{
		if(sprite != null)
		{
			if(sprite.ValidateScriptScope())
			{
				local scope = sprite.GetScriptScope();
				local i = scope[RULE_NAME] > 19;
				local value = i ? 8.0 : -0.4;
				sprite.SetOrigin(sprite.GetOrigin() + Vector(0, 0, value));

				scope[RULE_NAME] <- (i ? 0 : (scope[RULE_NAME] + 1));
				DoEntFire("!self", "RunScriptCode", "::Interneted_HintMarker.AnimateSprite(self);", 0.05, null, sprite);
			}
		}
	}

	/**
	 * ENTITY MARKER
	 */
	function SetGlow(ent, type = 0, color = 0, flashing = 0, max_range = 0)
	{
		// ? i am thinking of using prop_dynamic_ornament for the glow instead of the entity itself
		// ? should i?

		// static
		NetProps.SetPropInt(ent, "m_Glow.m_nGlowRangeMin", 0);
		// dynamic
		NetProps.SetPropInt(ent, "m_Glow.m_iGlowType", type);
		NetProps.SetPropInt(ent, "m_Glow.m_glowColorOverride", color);
		NetProps.SetPropInt(ent, "m_Glow.m_bFlashing", flashing);
		NetProps.SetPropInt(ent, "m_Glow.m_nGlowRange", max_range);
	}

	function SetTempName(ent)
	{
		if(ent.ValidateScriptScope())
		{
			local scope = ent.GetScriptScope();
			local name = ent.GetName();
			if(name == RULE_NAME)
			{
				if(RULE_NAME in scope)
				{
					ent.__KeyValueFromString("targetname", scope[RULE_NAME]);
					delete scope[RULE_NAME];
				}
			}
			else
			{
				scope[RULE_NAME] <- ent.GetName();
				ent.__KeyValueFromString("targetname", RULE_NAME);
			}
		}
	}

	// remove hint and glow upon special infected and survivor death.
	function OnGameEvent_player_death(params)
	{
		if("userid" in params)
		{
			local player = GetPlayerFromUserID(params.userid);
			if(player == null) { return; }
			if(!player.IsValid()) { return; }
			OnGameEvent_witch_killed({ witchid = player.GetEntityIndex() });
		}
	}

	// Force stop
	function OnGameEvent_witch_killed(params)
	{
		if("witchid" in params)
		{
			local witch = EntIndexToHScript(params.witchid);
			if(witch == null) { return false; }
			if(!witch.IsValid()) { return false; }
			if(witch.ValidateScriptScope())
			{
				local scope = witch.GetScriptScope();
				local marked = RULE_NAME + "_marked";
				if(marked in scope)
				{
					delete scope[marked];
					AutomaticStop(witch);
					return true;
				}
			}
		}
		return false;
	}

	function RemoveMarkFromInv(survivor, classname)
	{
		local inv_table = {};
		GetInvTable(survivor, inv_table);
		foreach(i, w in inv_table)
		{
			if(w.GetClassname() == classname)
			{
				OnGameEvent_witch_killed({ witchid = w.GetEntityIndex() });
				break;
			}
		}
	}

	// remove hint and glow upon item pickup.
	function OnGameEvent_player_use(params)
	{
		if("userid" in params && "targetid" in params)
		{
			local survivor = GetPlayerFromUserID(params.userid);
			local item = EntIndexToHScript(params.targetid);
			if(survivor == null || item == null) { return; }
			if(!survivor.IsValid() || !item.IsValid()) { return; }

			// spawn entities permanent glow fix.
			if(NetProps.HasProp(item, "m_itemCount"))
			{
				if((NetProps.GetPropInt(item, "m_itemCount") <= 0) && (NetProps.GetPropInt(item, "m_spawnflags") & 8) == 0)
				{
					if(OnGameEvent_witch_killed({ witchid = params.targetid }))
					{
						local model = item.GetModelName();
						local effects = NetProps.GetPropInt(item, "m_fEffects");
						NetProps.SetPropInt(item, "m_fEffects", effects & ~32);
						if(!IsModelPrecached(model)) { PrecacheModel(model); }
						item.SetModel(model);
						NetProps.SetPropInt(item, "m_fEffects", effects);
					}
				}
			}

			local classname = item.GetClassname();
			if(survivor.IsSurvivor() && classname.find("weapon_") != null)
			{
				local start_idx = classname.find("_spawn");
				if(start_idx != null)
				{ classname = classname.slice(0, start_idx); }

				RemoveMarkFromInv(survivor, classname);
			}
		}
	}

	function OnGameEvent_item_pickup(params)
	{
		if("userid" in params && "item" in params)
		{
			local survivor = GetPlayerFromUserID(params.userid);
			if(survivor == null) { return; }
			if(!survivor.IsValid()) { return; }
			if(survivor.IsSurvivor())
			{
				RemoveMarkFromInv(survivor, "weapon_" + params.item);
			}
		}
	}

	function OnGameEvent_spawner_give_item(params)
	{
		if("userid" in params && "item" in params && "spawner" in params)
		{
			local survivor = GetPlayerFromUserID(params.userid);
			local spawner = EntIndexToHScript(params.spawner);
			if(survivor != null)
			{
				if(survivor.IsValid())
				{
					if(survivor.IsSurvivor())
					{
						RemoveMarkFromInv(survivor, params.item);
					}
				}
			}
		}
	}

	function OnGameEvent_player_bot_replace(params)
	{
		if("player" in params && "bot" in params)
		{
			local player = GetPlayerFromUserID(params.player);
			local bot = GetPlayerFromUserID(params.bot);
			if(player == null || bot == null) { return; }
			if(!player.IsValid() || !bot.IsValid()) { return; }
			OnGameEvent_witch_killed({ witchid = player.GetEntityIndex() });
		}
	}

	function OnGameEvent_bot_player_replace(params)
	{
		if("player" in params && "bot" in params)
		{
			OnGameEvent_player_bot_replace({ player = params.bot, bot = params.player });
		}
	}

	function EndHint(ent)
	{
		if(ent != null)
		{
			local hint = Entities.FindByName(null, "interneted_instructor_hint");
			if(hint == null) { hint = SpawnEntityFromTable("env_instructor_hint", { targetname = "interneted_instructor_hint" }) }

			local lesson = RULE_NAME + "_" + ent.GetEntityIndex();
			NetProps.SetPropString(hint, "m_iszName", lesson);
		}
	}

	function PlaySound(player, sound)
	{
		local clientcommand = Entities.FindByName(null, "interneted_clientcommand");
		if(clientcommand == null)
		{ clientcommand = SpawnEntityFromTable("point_clientcommand", { targetname = "interneted_clientcommand" }); }

		DoEntFire("!self", "Command", "play " + sound, 0.0, player, clientcommand);
	}

	/**
	 * HINT
	 */

	// avoid overpopulating gamestringtables
	hints = [],

	function DisplayHint(player, target, caption, icon, duration, range, color, suppress, delay = 0.0)
	{
		local hint = Entities.FindByName(null, "interneted_instructor_hint");
		if(hint == null) { hint = SpawnEntityFromTable("env_instructor_hint", { targetname = "interneted_instructor_hint" }) }

		hints.insert(0, [target, caption, icon, duration.tointeger(), range.tofloat(), color, suppress]);
		DoEntFire("!self", "RunScriptCode", "::Interneted_HintMarker.SetupHint(self);", delay, null, hint);

		// local code = format("::Interneted_HintMarker.SetupHint(self, \"%s\", \"%s\", \"%s\", %u, %f);", target, caption, icon, duration.tointeger(), range.tofloat());
		// DoEntFire("!self", "RunScriptCode", code, 0.0, null, hint);

		DoEntFire("!self", "ShowHint", "!activator", delay, player, hint);
	}

	function SetupHint(hint)
	{
		// core netprop values
		NetProps.SetPropInt(hint, "m_iDisplayLimit", 0);
		NetProps.SetPropInt(hint, "m_bAutoStart", 0);
		NetProps.SetPropFloat(hint, "m_fIconOffset", 0.0);
		NetProps.SetPropString(hint, "m_iszBinding", "");
		NetProps.SetPropInt(hint, "m_bAllowNoDrawTarget", 0);
		NetProps.SetPropInt(hint, "m_bForceCaption", 1);
		NetProps.SetPropInt(hint, "m_bNoOffscreen", 0);
		NetProps.SetPropInt(hint, "m_bStatic", 0);
		NetProps.SetPropInt(hint, "m_iInstanceType", 0);
		NetProps.SetPropInt(hint, "m_iPulseOption", 0);
		NetProps.SetPropInt(hint, "m_iAlphaOption", 0);
		NetProps.SetPropInt(hint, "m_iShakeOption", 0);

		try
		{
			local values = hints.pop();
			// * use the entity's index for the lesson name.
			// * that way, we can end a specific hint without ending every single one.
			local ent = Entities.FindByName(null, values[0]);
			local lesson = RULE_NAME + "_";
			if(ent != null)
			{
				lesson += (ent.GetClassname() != "info_target") ? ent.GetEntityIndex() : "";
			}
			NetProps.SetPropString(hint, "m_iszName", lesson);

			// dynamic netprop values
			NetProps.SetPropString(hint, "m_iszHintTargetEntity", values[0]);
			NetProps.SetPropString(hint, "m_iszCaption", values[1]);
			NetProps.SetPropString(hint, "m_iszIcon_Onscreen", values[2]);
			NetProps.SetPropString(hint, "m_iszIcon_Offscreen", values[2]);
			NetProps.SetPropInt(hint, "m_iTimeout", values[3]);
			NetProps.SetPropFloat(hint, "m_fRange", values[4]);
			// 16777215 = 255 | (255 << 8) | (255 << 16)
			// hint_activator_caption doesn't exist in l4d2
			local color = values[5][0].tointeger() | (values[5][1].tointeger() << 8) | (values[5][2].tointeger() << 16);
			NetProps.SetPropInt(hint, "m_Color", color);

			NetProps.SetPropInt(hint, "m_bSuppressRest", values[6]);
		}
		catch(e) {}
	}
}
// include localization
IncludeScript("interneted_hintmarker/localization", ::Interneted_HintMarker);

// parse config file
::Interneted_HintMarker.ParseConfigFile();

// look_cmd
if(::Interneted_HintMarker.Settings.Convars.look_cmd > 0)
{ ::Interneted_ResponseHook["HintMarker"] <- function(query) { ::Interneted_HintMarker.RunFunction(query); } }


// chat_cmd
if(::Interneted_HintMarker.Settings.Convars.chat_cmd > 0)
{
	::Interneted_HintMarker.OnGameEvent_player_say <- function(params)
	{
		if("userid" in params && "text" in params)
		{
			local survivor = GetPlayerFromUserID(params.userid);
			local text = params.text.tolower();
			if(survivor == null) { return; }
			if(!survivor.IsValid()) { return; }
			if(survivor.IsSurvivor() && !survivor.IsDying() && !survivor.IsDead() && !IsPlayerABot(survivor))
			{
				if(text == "!mark" || text == "/mark")
				{
					this.HintMarker(survivor);
				}
			}
		}
	}
}

// nescius button binder base
// bind g "setinfo nescmd interneted_hintmarker; taunt; nescmd 0"
::Interneted_HintMarker_NBBB <- function(player)
{
	::Interneted_HintMarker.HintMarker(player);
}
try
{
	if(Entities.FindByName(null, "nescius_button_binder") != null)
	{
		g_rr.NesciusButtonBinder.RegisterCommand("interneted_hintmarker", ::Interneted_HintMarker_NBBB);
	}
}
catch(e) { }

// register game events
__CollectEventCallbacks(::Interneted_HintMarker, "OnGameEvent_", "GameEventCallbacks", RegisterScriptGameEventListener);