/*************************************************************************************************
* 							  				*********
**  		Sir Drink a lots Impressive-Plugin              v 6.5			********
***                                                         				******** 
****  		INFO:  									*******
*****		---HEADSHOT-ANZEIGE:---							*******
***** 		Dieses Plugin zeigt die Headshots an und spielt 			******
*****  		einen zufälligen Sound ab. Die Auswahl liegt bei 3 Sounds		**** 
******	 	für den Headshot. (Standardmäßig sind es die headshot.wav,		***
******* 	impressive.wav und perfect.wav)						***
*******		Die Pfadangabe und die Datei werden in der vault.ini			***
******* 	gespeichert. IMP_SOUND_1, IMP_SOUND_2 und IMP_SOUND_3 sind  		***
******* 	dafür vorgesehen.							***
*******  							  			***
*******  	---TEAMSCORE-ANZEIGE:---			  			***
******* 	Ausserdem zeigt es am Ende der Runde die Teamscore und 			***
*******		den besten Spieler mit der Anzahl seiner Frags und			***
*******		seiner Headshots an. Wenn man amv_enable_beta "menu1"			***
*******  	in der adminmod.cfg aktiviert hat, wird eine ausführlichere		***
*******  	Score-Anzeige dargestellt.			  			***
*******  							  			***
*******  	---KILLSTREAK-ANZEIGE:---			  			***
*******  	Ich habe es jetzt noch um ein eigenes "killstreak" ergänzt,		***
*******  	soll heißen, dass es jetzt einen "Doublekill", "Multikill" 		***
*******  	und "Monsterkill" anzeigt und eine entsprechende Wave-Datei  		***
*******  	abspielt. Dafür sind in der vault.ini IMP_SOUND_4, IMP_SOUND_5		***
*******  	und IMP_SOUND_6 vorgesehen. (Standardmäßig sind die Sounds		***
*******  	doublekill.wav, multikill.wav und monsterkill.wav eingetragen.)		***
*******  	Damit diese Sounds aber ertönen, müssen die Frags in einer gewissen	***
*******  	Zeit absolviert werden. Standardmäßig sind 3 Sekunden eingestellt.	***
*******  							  			***
*******  	Für Spieler, die insgesamt 4 Frags, 5 Frags oder mehr in der 		***
*******  	gesamten Rundenzeit, aber diese nicht innerhalb	der Zeitbegrenzung,	***
*******  	erreicht haben, wird "Killingspree", "Dominating" bzw. "Godlike"	***					  			***
*******  	angezeigt und standardmäßig die Sounds killingspree.wav, 		***
*******  	dominating.wav bzw.goodlike.wav abgespielt. Dafür sind in der 		***
*******  	vault.ini IMP_SOUND_7, IMP_SOUND_8 und IMP_SOUND_9 reserviert.		***
*******								  			***
*******  	---FIRST-BLOOD-ANZEIGE:---			  			***
*******		Der erste Spieler, der ein Frag in der Runde macht, wird angekündigt.	***
*******		(IMP_SOUND_10)					  			***
*******								  			***
*******  	---MAP-FÜHRUNGS-ANZEIGE:---			  			***
*******		'Taken the Lead', 'tied for the lead' and 'lost the lead'		***
*******		sind IMP_SOUND_11 - 13 festgelegt.		  			***
*******								  			***
*******  	---TEAMATTACK-WARNUNG:---			  			***
*******		Anzeige an den TA mit entsprechendem Sound. (IMP_SOUND_14)		***
*******								  			***
*******  	---GRENADEKILL UND KNIFEKILL-ANZEIGE:---	  			***
*******  	Jeder Messer und Grantenkill wird entsprechend angezeigt und		***
*******  	mit Sound untermalt. (IMP_SOUND_15 u. 16)	  			***
*******  							  			***
*******  	---SPAWNED WITH THE BOMB-ANZEIGE:---		  			***
*******  	Den Teammitgliedern wird mitgeteilt, wer die Bombe hat und		***
*******  	dem BTräger mit entsprechendem Sound untermalt. Ausserdem glüht er für	***
*******		5 Sekunden. (IMP_SOUND_17)			  			***
*******  							  			***
*******  	---PREPARE TO FIGHT-ANZEIGE:---			  			***
*******  	Rundenanzahl wird angekündigt.						***
*******		(IMP_SOUND_18 und mit der HL-Sprachausgabe)				***
*******  							  			***
*******  	---PLANT BOMB:---			  				***
*******  	Bombenleger wird allen angekündigt. (IMP_SOUND_19)			***
*******  							  			***
*******  	---DROP BOMB:---			  				***
*******  	Spieler, der die Bombe verliert, wird dem Team angekündigt.		***
*******  	(IMP_SOUND_20)						  		***
*******  							  			***
*******  	---GET BOMB:---			  					***
*******  	Spieler, der die Bombe aufnimmt, wird dem Team wird angekündigt.	***
*******		(IMP_SOUND_21)								***
*******  							  			***
*******  	---TOUCHED HOSTAGE:---		  					***
*******  	Spieler, der die Hostages berührt wird dem Team wird angekündigt.	***
*******		(IMP_SOUND_22)								***
*******  							  			***
*******  	---BOMB-TIMER:---		  					***
*******  	Nach dem Legen der Bombe, wird die Zeit bis zur Explosion angekündigt.	***
*******		(IMP_SOUND_23 und mit der HL-Sprachausgabe)				***
*******  							  			***
*******  	---BENÖTIGT WIRD PLUGIN_SDAL_ALLOWSOUNDS!!!:---	  			***
*******  	Desweiteren gibt es die Option für jeden Spieler auf dem Server		***
*******  	die Sounds für sich zu deaktivieren.		  			***
*******  	Dafür muss er nur EINMAL "stopsounds" oder "stop" im Chat eingeben.	***
*******  	Dann ist es für die gesamte Mapzeit für ihn deaktiviert.		***
*******  	Mit "playsounds" bzw. "play" kann er es wieder aktivieren.		***
*******  							  			***
*******  	---Befehle innerhalb des Spiels in der Console:---  			***
*******  							  			***
*******  	INSTALLATION/EINSTELLUNGEN:			  			***
*******  	Als Grundbefehl dient immer admin_impressive.	  			***
*******  	Danach muss eine CommandNummer eingegeben werden.  			***
*******  	Bei CommandNummer 0 muss ein zusätzlicher Befehl plus Parameter 	***
*******  	eingegeben werden, um gewisse Sachen generell an- bzw. auszuschalten.	***
*******								  			***
*******  	Command		Befehl		Parameter	wird zu vault.ini	***
*******		-Nummer						Eintrag			***
*******		----------------------------------------------------------------------	***
*******  	0		plugin		0=aus/1=ein	IMP_PLUGIN 0/1		***
*******  	0		dk		0=aus/1=ein	IMP_DISPLAY_KILL 0/1	***
*******  	0		ds		0=aus/1=ein	IMP_DISPLAY_SCORE 0/1	***
*******		0		ls		0=aus/1=ein	IMP_LEADSOUNDS 0/1	***
*******		0		fb		0=aus/1=ein	IMP_FIRSTBLOOD 0/1	***
*******  	0		hs		0=aus/1=ein	IMP_HEADSHOT 0/1	***
*******  	0		ks		0=aus/1=ein	IMP_KILLSTREAK 0/1	***
*******  	0		kst		0-XX		IMP_KILLSTREAKTIME 0/XX	***
*******  	0		kk		0=aus/1=ein	IMP_KNIFEKILL 0/1	***
*******  	0		gk		0=aus/1=ein	IMP_GRENADEKILL 0/1	***
*******  	0		bs		0=aus/1=ein	IMP_BOMBSPAWNED 0/1	***
*******  	0		bp		0=aus/1=ein	IMP_BOMBPLANT 0/1	***
*******  	0		bd		0=aus/1=ein	IMP_BOMBDROP 0/1	***
*******  	0		bg		0=aus/1=ein	IMP_BOMBGET 0/1		***
*******  	0		bt		0=aus/1=ein	IMP_BOMBTIMER 0/1	***
*******  	0		sbd		0=aus/1=ein	IMP_STARTDEFUSE 0/1	***
*******  	0		fbd		0=aus/1=ein	IMP_BOMBDEFUSED 0/1	***
*******  	0		db		0=aus/1=ein	IMP_BOMBDET 0/1		***
*******  	0		th		0=aus/1=ein	IMP_TOUCHHOSTAGE 0/1	***
*******  	0		rc		0=aus/1=ein	IMP_ROUNDCOUNTER 0/1	***
*******  	0		ta		0=aus/1=ein	IMP_TEAMATTACK 0/1	***
*******  							  			***
*******  	SOUND-PFADANGABEN:				  			***
*******  	Das speichern der Pfadangabe und des Dateinamens in der vault.ini	***
*******  	soll eben die Möglichkeit bieten, jederzeit die Sounds auszuwechseln, 	***
*******  	in dem man eben andere Pfade und Dateinamen dort hineinschreibt.	***
*******  							  			***
*******  	Bei CommandNummer 1-x muss danach eine Pfadangabe und die Wave-Datei	***
*******  	folgen. (Dabei ist auf richtige Zeichensetzung zu achten!!!)		***
*******  	Die unten abgebildete Tabelle hat als Speicherort der Sounds den Ordner	***
*******  	MOD/sound/impressive. Folgende Wave-Dateien habe ich bei mir festgelegt.***
*******  							  			***
*******  	Com.	wird in	    PFADANGABE (Beispiel)		FEATURE		***
*******		-Nr	vault.ini							***
*******		----------------------------------------------------------------------	***
*******  	1	IMP_SOUND_1 sound/impressive/headshot.wav	HEADSHOT	***
*******  	2	IMP_SOUND_2 sound/impressive/impressive.wav	HEADSHOT	***
*******  	3	IMP_SOUND_3 sound/impressive/perfect.wav	HEADSHOT	***
*******		4	IMP_SOUND_4 sound/impressive/doublekill.wav	KILLSTREAK	***
*******		5	IMP_SOUND_5 sound/impressive/multikill.wav	KILLSTREAK	***
*******  	6	IMP_SOUND_6 sound/impressive/monsterkill.wav	KILLSTREAK	***
*******  	7	IMP_SOUND_7 sound/impressive/killingspree.wav	KILLSTREAK	***
*******  	8	IMP_SOUND_8 sound/impressive/dominating.wav	KILLSTREAK	***
*******  	9	IMP_SOUND_9 sound/impressive/godlike.wav	KILLSTREAK	***
*******  	10	IMP_SOUND_10 sound/impressive/firstblood.wav	FIRSTBLOOD	***
*******  	11	IMP_SOUND_11 sound/impressive/takenlead.wav	FÜHRUNG		***
*******  	12	IMP_SOUND_12 sound/impressive/lostlead.wav	FÜHRUNG		***
*******  	13	IMP_SOUND_13 sound/impressive/tiedlead.wav	FÜHRUNG		***
*******  	14	IMP_SOUND_14 sound/impressive/PayAttention.wav	TEAMATTACK	***
*******  	15	IMP_SOUND_15 sound/impressive/humiliation.wav	KNIFEKILL	***
*******  	16	IMP_SOUND_16 sound/impressive/humiliation.wav	GRENADEKILL	***
*******  	17	IMP_SOUND_17 sound/impressive/prepare.wav	PREPARE TO FIGHT***
*******  	18	IMP_SOUND_18 sound/impressive/becomeone.wav	BOMBSPAWNDED	***
*******  	19	IMP_SOUND_19 sound/impressive/execellent.wav	PLANT BOMB	***
*******  	20	IMP_SOUND_20 sound/impressive/doh.wav		DROP BOMB	***
*******  	21	IMP_SOUND_21 sound/impressive/becomeone.wav	GET BOMB	***
*******  	22	IMP_SOUND_22 sound/impressive/ticking.wav	BOMBTIMER	***
*******  	23	IMP_SOUND_23 sound/impressive/feelgood.wav	BOMBEXPLOSION	***
*******  	24	IMP_SOUND_24 sound/impressive/force2.wav	BEGINNDEFUSE	***
*******  	25	IMP_SOUND_25 sound/impressive/feelgood.wav	DEFUSEDBOMB	***
*******  	26	IMP_SOUND_26 sound/impressive/excellent.wav	TOUCHED HOSSI	***
*******  							  			***
********  	Thanks to Warhead,Biohazard,[Cola]-Whiskey, [WING] BlackKnight and the	**
*********  	www.admin-mod.de forumusers for help and the idea.			*
*********  	ALSO GREAT THANKS TO NETKOWALSKI FOR THE NEW CODE and			*
*********	Big THX an SR71GOKU for the Round-Counter-Code.				*
*********	Thx to [MOK] Appel for the newest bug report!				*
*********										*
*********	History:								*
*********	6.5: 									*
*********	- Sound für Bombtimer und Hostage waren vertauscht.			*
*********	- Bombtimer wurde nicht aktiviert, wenn nicht auch "Bomb Planted"	*
*********	  aktiviert war.							*
*********	- hinzugefügt: Begin_Bomb_Defuse, Defused_Bomb and Bomb Detonation	*
*********	6.4: 									*
*********	- Gallil und Defender Damage geaddet					*
*********	- show_stats() auch von allowsound(User[]) abhängig.			*
*********	- show_stats(): nur Spieler mit mehr als einem Kill werden angezeigt.	*
*********	- allowsounds() setinfo Abfrage verbessert.				*
*********	6.3:									*
*********	- Bugfix: Weapondamage							*
*********	6.2: 									*
*********	- Das Abschalten von displaykill (dk) betrifft jetzt nur noch 		*
*********	  die Feature Headshot, Killstreak, Firstblood und Führungsanzeige	*
*********	  Die Anzeigen der anderen Feature sind aktiv, wenn das gesamte Feature *
*********	  auch gewünscht und aktiviert ist.					*
*********	6.1: 									*
*********	- Neustrukturierung der Befehle. Man kann nur noch ganze Feature	*
*********	  an/bzw. ausschalten. Nicht einzelne Teile des Features.		*
*********	- Neue Befehls- und Vault.ini Verwaltung. 				*
*********	- Neue Feature: Bomb_Plant, Bomb_Drop, Bomb_Get, Touched_Hostage,	*
*********	  Bombtimer.								*
*********	- Die Sounds sollten für dieses Plugin jetzt im MOD unter		*
*********	  sound/impressive abgelegt weden. Kann man aber anhand des		*
*********	  vault.ini Eintrages selber festlegen.					*
*********	6.0:									*
*********	- Knifekill, Bombkill, Rundenanzahl uns Spawned with a bomb hinzugefügt.*
*********	- Code-Verbesserungen							*
*********	5.7:									*
*********	- erweiterte Score-Anzeige, wenn amv_enable_beta "menu1" aktiviert ist	*
*********	5.6.1:									*
*********	- eigenständiges Plugin geschrieben, was am_sound bei dem Client setzt. *
*********	  (plugin_sdal_allowsounds)						*
*********	- An Bots wird nichts mehr gesendet.					*
*********	5.6:									*
*********	- Überprüfung der Serverconfiguration erweitert				*
*********	- Plugin Konfiguration erweitert (soundsbest1,2,3), um Sounds zu	*
*********	  aktivieren/deaktivieren.						*
*********	- Sound-Priorität auf die Quake-Sounds festgelegt			*
*********	5.5:									*
*********	- internes Scoreboard in der Console für Debug-Zwecke			*
*********	- Selbstmord wird erkannt.						*
*********	- 2-Dimensionale Arrays für die Sounds und Textanzeigen 		*
*********	- Waffendamage über #define änderbar					*
*********	- über setinfo vom Spieler definierbar, ob er Sounds hören möchte	*
********	5.4:									*
*********	- Quake-Sounds hinzugefügt, um die Führungen zu signalisieren		*
*********	5.3:									*
*********	- Unreal-Tournament Sounds mit Zeitbegrenzung und Ohne. Killstreak	*
*********	5.0:									*
*********	- integriertes Killstreak						*
*********	< 5:									*
*********	- nur Headshotsound Analyse mit Ausgabe von Sounds und Anzeige		*
*********	- erstes Killstreak							*
*****************************************************************************************/ 
 
 
#include <core>
#include <console>
#include <string>
#include <admin>
#include <adminlib>
 
new STRING_VERSION[MAX_DATA_LENGTH] = "AM_2.50.59_11.02.04_v.6.5";
 
#define ACCESS_CONSOLE 131072
#define CLEAN_SLATE 0
#pragma dynamic 8192
 
 
new Key[]="am_sound";
 
/*13.04.03 erweiterte Scoreanzeige*/
new menuenabled;
 
//////////////////////////////////////////
/////// SOUND UND TEXT-VERWALTUNG ////////
//////////////////////////////////////////
/*Legt die momentane Anzahl der Sounds und Textmeldungen in diesem Plugin fest und speichert sie im 2-Dim-Array*/
#define ALL_SOUNDS 	26
#define HEADSHOT1	0
#define HEADSHOT2	1
#define HEADSHOT3	2
#define DOUBLEKILL	3
#define MULTIKILL	4
#define MONSTERKILL	5
#define	KILLINGSPREE	6
#define DOMINATING	7
#define GODLIKE		8
#define FIRSTBLOOD	9
#define TAKENLEAD	10
#define LOSTLEAD	11
#define	TIEDLEAD	12
#define PAYATTENTION	13
#define KNIFEKILL	14
#define GRENKILL	15
#define	PREPAREFIGHT	16
#define	BOMBSPAWNED	17
#define	PLANTBOMB	18
#define	DROPBOMB	19
#define	GOTBOMB		20
#define BOMBTIMER	21
#define BOMBDETONATION	22
#define BOMBDEFUSE	23
#define DEFUSEDBOMB	24
#define TOUCHEDHOSTAGE	25
new IMP_SOUND[ALL_SOUNDS][MAX_TEXT_LENGTH];
 
/*Textmeldungen*/
new TextMessage[ALL_SOUNDS][]={{"%s made^na headshot!"},{"%s made^nan impressive headshot"},{"%s made^na perfekt headshot!"},
				{"%s made^na doublekill!"},{"%s made^na multikill"},{"%s made^na monsterkill"},
				{"%s:^nKILLINGSPREE!"},{"%s:^nDOMINATING"},{"%s:^nGODLIKE"},{"%s:^nFIRST BLOOD"},{"%s has^ntaken the lead!"},
				{"%s has^nlost the lead!"},{"You are tied^nfor the lead!"},{"STOP SHOOTING YOUR TEAMMATE"},{"%s killed^n%s with a knife!"},
				{"%s killed^n%s with a grenade!"},{"--PREPARE TO FIGHT--^n        ROUND %i"},{"%s^nspawned with the bomb"},
				{"%s^nplanted the bomb"},{"%s^ndropped the bomb"},{"%s^ngot the bomb"},{""},{"Terrorists win!"},
				{"%s^nbegins to defuse the bomb!"},{"%s^ndefused the bomb!"},{"%s^ntouched a hostage"}};
 
/*17.04.03 Um Zahlen korrekt mit HL-Speech als String auszusprechen*/
static OnesLib[10][] = { "", "one ", "two ", "three ", "four ", "five ", "six ", "seven ", "eight ", "nine " };
static TensLib[10][] = {"", "ten ", "twenty ", "thirty ", "fourty ", "fifty ", "sixty ", "seventy ", "eighty ", "ninety " } ;
static TeensLib[10][] = {"", "eleven ", "twelve ", "thirteen ", "fourteen ", "fifteen ", "sixteen ", "seventeen ", "eighteen ", "nineteen " };
static HundredsLib[10][] = { "", "one hundred ", "two hundred ", "three hundred ", "four hundred ", "five hundred ", "six hundred ", "seven hundred ", "eight hundred ", "nine hundred " };
static GroupNamesLib[5][] = {"", "thousand ", "million ", "billion ", "trillion " };
 
//////////////////////////////////
/////// WAFFEN-VERWALTUNG ////////
//////////////////////////////////
/*Ausgetestete Damage-Werte der Waffen. Ausgehend vom maximaler Bodydamage. 
Jeder höhere Damage-Wert muss also ein Headshot sein. Werte sind aufgerundet, um wirklich sicher zu sein, 
dass es sich um einen Headshot handelt. Naja, sind eben Annäherungswerte.*/
#define MAX_WEAPONS	24
/*Pistolen*/
#define DEAGLE		80
#define GLOCK		40
#define USP		40
#define ELITE		40
#define FIVESEVEN	40
#define P228		40
/*Shotguns, unmöglich mit Annäherung genau den Headshot zu definieren.*/
#define M3		200
#define XM1014		200
/*SMG*/
#define MP5		36
#define P90		40
#define TMP		36
#define MAC		40
#define UMP40		45
/*Rifles*/
#define GALLIL		45
#define DEFENDER	45
#define AUG		50
#define SG552		50
#define AWP		155
#define M4A1		50
#define AK47		50
#define SCOUT		95
#define SG550		80
#define G3SG1		80
/*MG*/
#define M249		50
 
/*15.04.03 Weapon Arrays und Weapon Damage*/	
new g_WeaponName[MAX_WEAPONS][MAX_NAME_LENGTH]	=	{{"usp"},{"glock18"},{"deagle"},{"mp5navy"},{"gallil"},{"defender"},{"m4a1"},
							{"ak47"},{"awp"},{"aug"},{"sg552"},
							{"scout"},{"m249"},{"p90"},{"p228"},{"tmp"},{"mac10"},{"ump40"},{"fiveseven"},
							{"elite"},{"m3"},{"xm1014"},{"sg550"},{"g3sg1"}};
 
new g_WeaponDamage[MAX_WEAPONS][MAX_NUMBER_LENGTH]= 	{{USP},{GLOCK},{DEAGLE},{MP5},{GALLIL},{DEFENDER},{M4A1},
							{AK47},{AWP},{AUG},{SG552},{SCOUT},{M249},
							{P90},{P228},{TMP},{MAC},{UMP40},{FIVESEVEN},{ELITE},{M3},{XM1014},{SG550},
							{G3SG1}};
 
//////////////////////////////////////////////////////
/////// BEFEHLS- UND INSTALLATIONS-VERWALTUNG ////////
//////////////////////////////////////////////////////
/*Befehlsverwaltung für admin_impressive*/
#define MAX_COMMANDS 	21
#define STATUS_PLUGIN		0
#define STATUS_DK		1
#define STATUS_DS		2
#define STATUS_LS		3
#define	STATUS_FB		4
#define STATUS_HS		5
#define STATUS_KS		6
#define STATUS_KST		7
#define STATUS_KK		8
#define STATUS_GK		9
#define STATUS_BS		10
#define STATUS_BP		11
#define STATUS_BD		12
#define STATUS_BG		13
#define STATUS_BT		14
#define STATUS_SBD		15
#define STATUS_FBD		16
#define STATUS_DB		17
#define STATUS_TH		18
#define STATUS_RC		19
#define STATUS_TA		20
 
 
new CommandName[MAX_COMMANDS][]={{"plugin"},{"dk"},{"ds"},{"ls"},{"fb"},{"hs"},{"ks"},{"kst"},
				{"kk"},{"gk"},{"bs"},{"bp"},{"bd"},{"bg"},{"bt"},{"sbd"},{"fbd"},{"db"},{"th"},{"rc"},{"ta"}};
 
new VaultCommandData[MAX_COMMANDS][]={{"IMP_PLUGIN"},{"IMP_DISPLAY_KILL"}, {"IMP_DISPLAY_SCORE"},{"IMP_LEADSOUNDS"},
				{"IMP_FIRSTBLOOD"},{"IMP_HEADSHOT"},{"IMP_KILLSTREAK"},{"IMP_KILLSTREAKTIME"},{"IMP_KNIFEKILL"},
				{"IMP_GRENADEKILL"},{"IMP_BOMBSPAWNED"},{"IMP_BOMBPLANT"},{"IMP_BOMBDROP"},
				{"IMP_BOMBGET"},{"IMP_BOMBTIMER"},{"IMP_STARTDEFUSE"},{"IMP_BOMBDEFUSED"},{"IMP_BOMBDET"},
				{"IMP_TOUCHHOSTAGE"},{"IMP_ROUNDCOUNTER"},{"IMP_TEAMATTACK"}};
 
new CommandText[MAX_COMMANDS][]={{"plugin: Das gesamte Plugin ist %s."},{"dk:^t Die Anzeige der Kills und Headshots ist %s."},
		{"ds:^t TeamScore- und Bester-Spieler-Anzeige ist %s."},{"ls:^t Fuehrungs-Sounds sind generell %s."},
		{"fb:^t 'First Blood' ist %s."},{"hs:^t Die Headshotsounds sind %s."},{"ks:^t Das Killstreak ist %s."},{"kst:^t Die Killzeit wurde auf %s Sekunden gesetzt."},
		{"kk:^t Knife Kill ist %s."},{"gk:^t Grenade Kill ist %s."},{"bs:^t Bomb Spawned ist %s."},{"bp:^t Bomb_Planted ist %s."},
		{"bd:^t Bomb-Dropped ist %s."},{"bg:^t Got-Bomb ist %s."},{"bt:^t Bomb-Timer ist %s"},
		{"sbd:^t Start Bomb defusing ist %s."},{"fbd:^t Bomb defused ist %s."},{"db:^t Bomb Detonation ist %s."},
		{"th:^t Touched-Hostage ist %s."},{"rc:^t Round-Counter ist %s."},{"ta:^t Team-Attack ist %s"}};
 
/*Alle Einstellungen des Plugins werden hier gespeichert*/
new STATUS_COMMAND[MAX_COMMANDS][1];
new killtime=3;
 
///////////////////////////////////////////////
/////// Die Frag- und Score Verwaltung ////////
///////////////////////////////////////////////
 
/*ZÄHLER*/
new FragCount[MAX_PLAYERS] = {CLEAN_SLATE,...}; 	/*dient zum Zählen aller Kills*/
new KillCount[MAX_PLAYERS] = {CLEAN_SLATE,...}; 	/*dient zum Zählen der Kills im Zeitlimit*/
new TimerIndex[MAX_PLAYERS] = {CLEAN_SLATE,...}; 	/*merkt sich den TimerIndex des Spielers, um die Zeit zu überwachen*/
new HeadCount[MAX_PLAYERS] = {CLEAN_SLATE,...};		/*dient zum Zählen der Headshots*/
new KillCountAll[MAX_PLAYERS] = {CLEAN_SLATE,...}; 	/*dient zum Zählen der gesamten Frags über die gesamte Mapzeit*/
 
new ctscore [MAX_NUMBER_LENGTH];			/*speichert die Teamscore CT*/
new terrscore[MAX_NUMBER_LENGTH];			/*speichert die Teamscore T*/
new round=0;						/*speichert die Rundenzahl*/
new c4timer;						/*C4-Countdown*/
 
new SpielerID = 0;					/*speichert den UserIndex des besten Spielers der Runde*/
new SpielerIDBest =0;					/*speichert den UserIndex des besten Spielers der gesamten Mapzeit.*/
new MostFrags =0;					/*speichert die Anzahl der meisten Frags der gesamten Mapzeit.*/
new MostFrags2 =0;					/*wird nur benutzt, wenn der allerbeste Spieler den Server verlässt*/
new priority =0;					/*alle Sounds an den Spieler werden mit Priorität 1 ausgeführt.*/
 
////////////////////////////////////////////
/////// INITIALISIERUNG DES PLUGINS ////////
////////////////////////////////////////////
 
public plugin_init(){
	plugin_registerinfo("Impressive-Script","The ultimative Logd-Script: Announces headshots with sound and many more.",STRING_VERSION);
	plugin_registercmd("admin_impressive", "admin_impressive", ACCESS_BAN, "admin_impressive <CommandNo> <Foldername/Filename or Command> <0/1>:read manual");
	plugin_registercmd("say","HandleSay",ACCESS_ALL);
 
	/*HINZUGEFÜGT AM:09.09.02 :Server-Configuration wird überprüft---Ergänzt am: 29.09.02*/
	new Text[MAX_TEXT_LENGTH];
	new Menuactiv[MAX_TEXT_LENGTH];
	new mp_logdetail;
	new error;
	new VaultIni[MAX_TEXT_LENGTH];
	getstrvar( "admin_vault_file", VaultIni, MAX_TEXT_LENGTH );
	mp_logdetail = getvar("mp_logdetail");
	if(mp_logdetail==0){
		error++;
		snprintf(Text,MAX_TEXT_LENGTH,"[Impressive Plugin] FATAL ERROR: mp_logdetail ist auf %i gesetzt => LogD NICHT funktionsfaehig",mp_logdetail);
		log(Text);
	}else{
		plugin_registercmd("im_connect", "im_connect", ACCESS_CONSOLE, "");
		plugin_registercmd("im_disconnect", "im_disconnect", ACCESS_CONSOLE, "");
		plugin_registercmd("im_suicide", "im_suicide", ACCESS_CONSOLE, "");
		plugin_registercmd("im_kill", "im_kill", ACCESS_CONSOLE, "");
		plugin_registercmd("im_injure", "im_injure", ACCESS_CONSOLE, "");
		plugin_registercmd("im_playeraction", "im_playeraction", ACCESS_CONSOLE, "");
		plugin_registercmd("im_showintheend", "im_showintheend", ACCESS_CONSOLE, "");
		plugin_registercmd("im_resetscore", "im_resetscore", ACCESS_CONSOLE, "");
		exec( "logd_reg 51 admin_command im_connect" );
		exec( "logd_reg 52 admin_command im_disconnect" );
		exec( "logd_reg 53 admin_command im_suicide" );
		exec( "logd_reg 57 admin_command im_kill" );
		exec( "logd_reg 58 admin_command im_injure" );
		exec( "logd_reg 60 admin_command im_playeraction" ); 
		exec( "logd_reg 61 admin_command im_showintheend" );
		exec( "logd_reg 62 admin_command im_resetscore");
		snprintf(Text,MAX_TEXT_LENGTH,"[Impressive Plugin] LogD-Funktionen aktiviert");
		log(Text);
	}
	if(mp_logdetail <3){
		error++;
		snprintf(Text,MAX_TEXT_LENGTH,"[Impressive Plugin] mp_logdetail nicht auf 3 => Keine Headshot-Sounds moeglich.",mp_logdetail);
		log(Text);
	}
	if(!getvar("allow_client_exec")){
		error++;
		snprintf(Text,MAX_TEXT_LENGTH,"[Impressive Plugin] allow_exec_client nicht gesetzt => Client darf keine Sounds abspielen");
		log(Text);
	}
	getstrvar( "amv_enable_beta", Menuactiv, MAX_TEXT_LENGTH );
	if(strstrx(Menuactiv,"menu1")!=-1){
		menuenabled=1;
		log("[Impressive Plugin] Erweiterte Scoreanzeige nutzbar!");
	}else{
		menuenabled=0;
		log("[Impressive Plugin] Erweiterte Scoreanzeige nicht nutzbar!(amv_enable_beta 'menu1' fehlt)");
	}
	/*Alle Daten werden aus der vault.ini eingelesen, wenn sie nicht existieren, werden sie gesetzt und/oder Fehlermeldung*/
	if(!fileexists(VaultIni)){
		error++;
		snprintf(Text,MAX_TEXT_LENGTH,"[Impressive Plugin] FATAL ERROR: 'admin_vault_file' nicht gesetzt oder gefunden!");
		log(Text);
	}else{
		new i;
		for(i=0;i<MAX_COMMANDS;i++){
			get_vaultnumdata(VaultCommandData[i],STATUS_COMMAND[i][0]);
			if(i==STATUS_KST){
				killtime=STATUS_COMMAND[i][0];
			}
			if(strlen(STATUS_COMMAND[i])==0){
				error++;
				snprintf(Text,MAX_TEXT_LENGTH,"[Impressive Plugin] vault.ini: %s nicht gesetzt!",VaultCommandData[i]);
			}else{
				snprintf(Text,MAX_TEXT_LENGTH,"[Impressive Plugin] Status: %s -- %i ",VaultCommandData[i],STATUS_COMMAND[i][0]);
			}
			log(Text);
		}
 
		new Vault[MAX_NAME_LENGTH];	
		for(i=1;i<=ALL_SOUNDS;i++){
			snprintf(Vault,MAX_NAME_LENGTH,"IMP_SOUND_%i",i);
			get_vaultdata(Vault,IMP_SOUND[i-1],MAX_TEXT_LENGTH);
			if(!fileexists(IMP_SOUND[i-1])){
				error++;
				snprintf(Text,MAX_TEXT_LENGTH,"[Impressive Plugin] Wave Datei %s wurde nicht gefunden!",IMP_SOUND[i-1]);
				log(Text);
			}	
		}
	}
	if(error>=1){
		snprintf(Text,MAX_TEXT_LENGTH,"[Impressive Plugin] Es sind %i Fehler aufgetreten =>Impressive Plugin nicht voll funktionsfaehig.",error);
		log(Text);
	}else{
		snprintf(Text,MAX_TEXT_LENGTH,"[Impressive Plugin] Impressive Plugin erfolgreich initialisiert!(Wenn Log-File vorhanden!)");
		log(Text);
	}
	return PLUGIN_CONTINUE;
}
 
////////////////////////////////////
/////// ADMINMOD-FUNKTIONEN ////////
////////////////////////////////////
 
/*GEÄNDERT AM:09-09-02, Verwaltung des Plugins*/
public admin_impressive(HLCommand,HLData,HLUserName,UserIndex) {
	new Data[MAX_DATA_LENGTH];
	new Text[MAX_TEXT_LENGTH];
	new Number[MAX_NUMBER_LENGTH];
	new Commandname[MAX_TEXT_LENGTH];
	new CommandParam[MAX_NUMBER_LENGTH];
	new Vaultini[MAX_DATA_LENGTH];
	new Value[MAX_TEXT_LENGTH];
	new Value1[12];
	new iNumber;
	new i;
	new iCommandParam;
 
	convert_string(HLData,Data,MAX_DATA_LENGTH);
 
	strbreak(Data,Number,Commandname,MAX_TEXT_LENGTH);
	strbreak(Commandname,Commandname,CommandParam,MAX_TEXT_LENGTH);
	iNumber=strtonum(Number);
	if(iNumber>ALL_SOUNDS){
		selfmessage("Die Befehlsnummer existiert nicht!!");
		return PLUGIN_HANDLED;
	}
	selfmessage("=================== IMPRESSIVE-PLUGIN ==========================");
	selfmessage("* PLUGIN-SETTINGS: admin_impressive 0 'Befehl' 'Wert'");
	selfmessage("* SOUND-SETTINGS: admin_impressive 1-x 'Pfadangabe/sound.wav'");
	selfmessage("================================================================");
	if(iNumber==0){
		if(strlen(Commandname)!=0){
			for(i=0; i<MAX_COMMANDS;i++){
				if(strcmp(Commandname,CommandName[i])==0){
					iCommandParam = strtonum(CommandParam);
					if(i!=STATUS_KST && iCommandParam >1){
						iCommandParam = 1;
					}
					if(i==STATUS_KST){ // bei killtime Sonderbehandlung, sollten weitere Fälle auftreten -> switch/case Statement
						if(iCommandParam>9){
							iCommandParam = 9;
						}
						killtime = iCommandParam;
					}
					set_vaultnumdata(VaultCommandData[i],iCommandParam);
					break; 
				} 
			}
		}
		selfmessage("BEFEHL:	 STATUS:");
		for(i=0;i<MAX_COMMANDS;i++){
			get_vaultnumdata(VaultCommandData[i],STATUS_COMMAND[i][0]);
			if(i==STATUS_KST){
				killtime=STATUS_COMMAND[i][0];
				snprintf(Value1,15,"%i",killtime);
			}else{
				if(STATUS_COMMAND[i][0]!=0){
					snprintf(Value1,12,"AKTIVIERT");
				}else{
					snprintf(Value1,12,"DEAKTIVIERT");
				}
			}
			snprintf(Value,MAX_TEXT_LENGTH,CommandText[i],Value1);
			snprintf(Text,MAX_TEXT_LENGTH,"* %s",Value);
			selfmessage(Text);
		}
	}else{
		snprintf(Vaultini,MAX_DATA_LENGTH,"IMP_SOUND_%i",iNumber);
		if(strlen(Commandname)==0){
			set_vaultdata(Vaultini,"");
			snprintf(Text,MAX_TEXT_LENGTH,"IMP_SOUND_%i wurde DEAKTIVIERT",iNumber);
		}else{
			if(fileexists(Commandname)){
				set_vaultdata(Vaultini,Commandname);
				snprintf(Text,MAX_TEXT_LENGTH,"IMP_SOUND_%i wurde auf %s gesetzt",iNumber,Commandname);
			}else{
				snprintf(Text,MAX_TEXT_LENGTH,"[Impressive Plugin] Datei %s konnte auf dem Server nicht gefunden werden.",Commandname);
			}
		}
		selfmessage(Text);
		selfmessage("");
		selfmessage("VAULT.INI:        PFADANGABE:");
		for(i=1;i<=ALL_SOUNDS;i++){
			if(i==1){
				selfmessage("* HEADSHOT-SOUNDS:");
			}else if(i==4){
				selfmessage("* FRAGS-IN-TIME-SOUNDS:");
			}else if(i==7){
				selfmessage("* FRAGS-BY-NUMBER-SOUNDS:");
			}else if(i==10){
				selfmessage("* FIRSTBLOOD-SOUND:");
			}else if(i==11){
				selfmessage("* LEAD-SOUNDS:(Taken,Lost,Tied)");
			}else if(i==14){
				selfmessage("* TEAM-ATTACK-SOUND:");
			}else if(i==15){
				selfmessage("* KNIFEKILL-SOUND:");
			}else if(i==16){
				selfmessage("* GRENADEKILL-SOUND:");
			}else if(i==17){
				selfmessage("* ROUND-COUNTER-SOUND:");
			}else if(i==18){
				selfmessage("* BOMB-SOUNDS (Spawn,Plant,Drop,Get,Bomb-Timer,Detonate,Begin_Defuse,Bomb_Defused):");
			}else if(i==26){
				selfmessage("* TOUCH-HOSTAGE-SOUND:");
			}
			snprintf(Vaultini,MAX_DATA_LENGTH,"IMP_SOUND_%i",i);
			get_vaultdata(Vaultini,Commandname,MAX_TEXT_LENGTH);
			snprintf(Text,MAX_TEXT_LENGTH,"* IMP_SOUND_%i %s",i,Commandname);
			strcpy(IMP_SOUND[i-1],Commandname,MAX_TEXT_LENGTH);
			selfmessage(Text);
			strinit(Commandname);
		}
	}
	selfmessage("================== (c) by Sir Drink a lot ========================");
	return PLUGIN_HANDLED;
}
 
/*16.04.03: Bei der Chat-Eingabe 'score' wird die Score-Anzeige aktiviert.*/
/*29.01.03: plugin_sdal_allowsounds reagiert jetzt auf die chateingaben 'stop' und 'play'*/
public HandleSay(HLCommand,HLData,HLUserName,UserIndex){
	if(STATUS_COMMAND[STATUS_DS][0]!=0 && STATUS_COMMAND[STATUS_PLUGIN][0]!=0){
		new Data[MAX_DATA_LENGTH];
		new User[MAX_NAME_LENGTH];
		convert_string(HLData,Data,MAX_DATA_LENGTH);
		convert_string(HLUserName,User,MAX_DATA_LENGTH);
		strstripquotes(Data);
		if (strcasecmp(Data, "score")==0){
			show_stats(User);
		}
	}
        return PLUGIN_CONTINUE;
}
 
/* Nullung der SpielerIndex-Arrays und Neuberechnung des besten Spielers*/
public plugin_connect(HLUserName,HLIP, UserIndex){
	if (UserIndex >= 1 && UserIndex <= MAX_PLAYERS) {
		reset_playerarray(UserIndex);
 
	}	
	return PLUGIN_CONTINUE;
}
 
public plugin_disconnect(HLUserName,UserIndex){
	new loop;
	new maxplayers=maxplayercount();
	new Name[MAX_NAME_LENGTH];
	new a;
	new dummy;
	if (UserIndex >= 1 && UserIndex <= MAX_PLAYERS) {
		reset_playerarray(UserIndex);
		/*MenuID[UserIndex]=0;*/
		if(SpielerID == UserIndex){
			SpielerID =0;
		}
		/*Wenn der allerbeste Spieler den Server verlässt, muss ein neue beste Score und evt. Spieler gefunden werden!!*/
		if(SpielerIDBest==UserIndex){
			for(loop=1;loop <=maxplayers;loop++){
				if(loop!=UserIndex){
					if(KillCountAll[loop]>=MostFrags2){
						MostFrags2=KillCountAll[loop];
					}
				}
			}
			/*ERGÄNZT AM:10-09-02, Überprüft, ob es nur einen neuen besten Spieler gibt*/
			for(loop=1;loop<=maxplayers;loop++){
				if(KillCountAll[loop]==MostFrags2){
					a++;/*Dient als Identifizierung, ob es nur einen besten Spieler gibt!*/
					SpielerIDBest=loop;
				}
			}
			if(a==1){
				if(STATUS_COMMAND[STATUS_LS][0]!=0){
					if(playerinfo(SpielerIDBest,Name,MAX_NAME_LENGTH,dummy,dummy,dummy,dummy)){
						soundplayer(TextMessage[TAKENLEAD],IMP_SOUND[TAKENLEAD],Name,TAKENLEAD);
					}
				}
			}else{
				SpielerIDBest=0;
			}	
			MostFrags=MostFrags2;
			MostFrags2=0;
		}
	}
	return PLUGIN_CONTINUE;
}
 
//////////////////////////////////////////////
/////// LOGD-FUNKTIONEN NACH EVENT-NR ////////
//////////////////////////////////////////////
 
/*29.01.03: Eigenes Plugin für die Enter-Meldung geschrieben: plugin_sdal_allowsounds*/
/*18.11.02: Array-Nullung auch nochmal hier eingefügt.*/
public im_connect(HLCommand,HLUserIndex){
	new UserIndex;
	new strUserIndex[MAX_NAME_LENGTH];
	convert_string(HLUserIndex, strUserIndex, MAX_NAME_LENGTH);
	UserIndex=strtonum(strUserIndex);
	reset_playerarray(UserIndex);
	return PLUGIN_CONTINUE;
}
 
/*13.04.03 Nochmal die Logd Disconnect Funktion zur Sicherheit*/
public im_disconnect(HLCommand,HLUserIndex){
	new UserIndex;
	new strUserIndex[MAX_NAME_LENGTH];
	convert_string(HLUserIndex, strUserIndex, MAX_NAME_LENGTH);
	UserIndex=strtonum(strUserIndex);
	reset_playerarray(UserIndex);
	return PLUGIN_CONTINUE;
}
 
/*ERSTELLT AM:10-09-02, Selbstmorde erkennen und evt. neuen bester Spieler erkennen*/
public im_suicide(HLCommand,HLData){
	new Data[MAX_DATA_LENGTH];
	new UserIndex[MAX_NUMBER_LENGTH];
	new Weapon[MAX_NAME_LENGTH];
	new Name[MAX_NAME_LENGTH];
	new Text[MAX_TEXT_LENGTH];
	new iUserIndex;
	new dummy;
	new WONID;
	new loop;
	new maxplayers=maxplayercount();
	convert_string(HLData,Data,MAX_DATA_LENGTH);
 
	strsplit(Data," ",UserIndex,MAX_NUMBER_LENGTH,Weapon,MAX_NAME_LENGTH);
 
	iUserIndex=strtonum(UserIndex);
	/*Selbstmord mit 'worldspawn' gibt keinen Fragabzug*/
	if(strcmp(Weapon,"world")==0 || strcmp(Weapon,"grenade")==0){
		if(playerinfo(iUserIndex,Name,MAX_NAME_LENGTH,dummy,dummy,WONID,dummy)){
			snprintf(Text,MAX_TEXT_LENGTH,"%s beging Selbstmord",Name,Weapon);
			if(STATUS_COMMAND[STATUS_TA][0]==1){
				soundall(Text,IMP_SOUND[PAYATTENTION],Name,PAYATTENTION);
			}
			KillCountAll[iUserIndex]-= 1;
			if(SpielerIDBest == iUserIndex){
				MostFrags--;
				for(loop=1;loop<=maxplayers;loop++){
				/*Darf nicht mit Führenden selber vergeleichen :-) */
					if((KillCountAll[loop]==MostFrags) && (iUserIndex != loop)){
						if(STATUS_COMMAND[STATUS_LS][0]!=0){
							soundplayer(TextMessage[LOSTLEAD],IMP_SOUND[LOSTLEAD],Name,LOSTLEAD);
						}
						SpielerIDBest=0;
						break;
					}
				}
                        }
		}
	}
	return PLUGIN_CONTINUE;
}
 
public im_kill( HLCommand,HLData,HLUserName,UserIndex ){
	new Data[MAX_DATA_LENGTH];
	new Attacker[MAX_NAME_LENGTH];
	new Victim[MAX_NAME_LENGTH]; 
	new Weapon[MAX_NAME_LENGTH];
	new Text[MAX_TEXT_LENGTH];
	new iIDA;
	new iIDV;
	new iTeamA;
        new iTeamV;
	new dummy1;
	new loop;
	new maxplayers=maxplayercount();
 
	convert_string( HLData, Data, MAX_DATA_LENGTH ); 
 
	strsplit(Data," ",Attacker,MAX_NAME_LENGTH,Victim,MAX_NAME_LENGTH,Weapon,MAX_NAME_LENGTH); 
 
	iIDV 	=strtonum(Victim);
	iIDA 	=strtonum(Attacker);
 
	/*Frags werden gezählt.*/
	if(playerinfo(iIDA, Attacker, MAX_NAME_LENGTH,dummy1,dummy1, iTeamA,dummy1)){
                if(playerinfo(iIDV, Victim, MAX_NAME_LENGTH,dummy1,dummy1,iTeamV,dummy1)){
                        if(iTeamV != iTeamA){
				KillCount[iIDA] +=1;
				FragCount[iIDA] +=1;
				KillCountAll[iIDA] +=1;
				/*First Blood Analyse*/
				if(STATUS_COMMAND[STATUS_FB][0]!=0){
					if(SpielerID == 0){
						snprintf(Text,MAX_TEXT_LENGTH,TextMessage[FIRSTBLOOD],Attacker);
						soundall(Text,IMP_SOUND[FIRSTBLOOD],Attacker,FIRSTBLOOD);
					}
				}
				/*wenn die zeitunabhängigen Killstreak-Sounds erlaubt sind*/
				if(STATUS_COMMAND[STATUS_KS][0]!=0){
					imp_killstreak(Attacker,iIDA);
				}
				/*wenn die Zeitabhängigen Killstreak-Sounds erlaubt sind*/
				if(STATUS_COMMAND[STATUS_KST][0]!=0){
					if(TimerIndex[iIDA]==0){
						TimerIndex[iIDA]=set_timer("imp_killstreaktime",killtime,0,Attacker);
					}
				}
				/*wenn die Maplead-Sounds erlaubt sind*/
				if(STATUS_COMMAND[STATUS_LS][0]!=0){
					imp_MapLeader(Attacker,iIDA);
				}
				/*15.04.03: Messer oder Grenade Analyse*/
				if(strcmp(Weapon,"knife")==0 && STATUS_COMMAND[STATUS_KK][0]!=0 ){
					snprintf(Text,MAX_TEXT_LENGTH,TextMessage[KNIFEKILL],Attacker,Victim);
					soundall(Text,IMP_SOUND[KNIFEKILL],Attacker,KNIFEKILL);
				}else if (strcmp(Weapon,"grenade")==0 && STATUS_COMMAND[STATUS_GK][0]!=0){
					snprintf(Text,MAX_TEXT_LENGTH,TextMessage[GRENKILL],Attacker,Victim);
					soundall(Text,IMP_SOUND[GRENKILL],Attacker,GRENKILL);
				}
                        }else{
                        	KillCount[iIDA] -=1;
				FragCount[iIDA] -=1;
				KillCountAll[iIDA] -=1;
				/*GEÄNDERT AM:10-09-02, Vergleich jetzt mit MostFrags anstatt mit KillCountAll[iIDA]*/
				/*Wenn der Führende einen TK gemacht hat und nun nicht mehr der Führenden ist*/
				if(SpielerIDBest == iIDA){
					MostFrags--;
					for(loop=1;loop<=maxplayers;loop++){
					/*Darf nicht mit Führenden selber vergeleichen :-) */
						if(((KillCountAll[loop]==MostFrags) && (iIDA != loop))){
							if(STATUS_COMMAND[STATUS_LS][0]!=0){
								soundplayer(TextMessage[LOSTLEAD],IMP_SOUND[LOSTLEAD],Attacker,LOSTLEAD);
							}
							SpielerIDBest=0;
							break;
						}
					}
				}
			}		
                }
        }
	/*Best Player-Analyse für die Runde*/
	if(FragCount[iIDA] > FragCount[SpielerID]){
		SpielerID = iIDA;
	}
	return PLUGIN_CONTINUE;
}
 
public im_injure( HLCommand,HLData,HLUserName,UserIndex ){
	new Attacker[MAX_NAME_LENGTH];
	new Victim[MAX_NAME_LENGTH]; 
	new Weapon[MAX_NAME_LENGTH];
	new Damage[MAX_NUMBER_LENGTH];
	new Rest_Health[MAX_NUMBER_LENGTH];
	new dummy[MAX_NAME_LENGTH];
	new Rest[MAX_DATA_LENGTH];
	new Data[MAX_DATA_LENGTH];
	new iIDD;
	new iDH;
	new iIDA;
	new iIDV;
	new dummy1;
	new iTeamA;
        new iTeamV;
	new i;
 
	convert_string( HLData, Data, MAX_DATA_LENGTH ); 
 
	strsep(Data," ",Attacker,MAX_NAME_LENGTH,Victim,MAX_NAME_LENGTH,Weapon,MAX_NAME_LENGTH,Rest,MAX_DATA_LENGTH); 
	strsplit(Rest," ",Damage,MAX_NUMBER_LENGTH,dummy,MAX_NAME_LENGTH,Rest_Health,MAX_NUMBER_LENGTH,dummy,MAX_NAME_LENGTH);
	strsplit(Damage,"#",dummy,MAX_NAME_LENGTH,Damage,MAX_NUMBER_LENGTH);
	strsplit(Rest_Health,"#",dummy,MAX_NAME_LENGTH,Rest_Health,MAX_NUMBER_LENGTH);
 
	iIDD 	=strtonum(Damage);
	iDH 	=strtonum(Rest_Health);
	iIDA 	=strtonum(Attacker);
	iIDV 	=strtonum(Victim);
 
	/*Um einen Sound abzugeben, wenn man den Teamkollegen trifft*/
	if(STATUS_COMMAND[STATUS_TA][0]!=0){
		if(playerinfo(iIDA, Attacker, MAX_NAME_LENGTH,dummy1,dummy1, iTeamA,dummy1)){
	                if(playerinfo(iIDV, Victim, MAX_NAME_LENGTH,dummy1,dummy1,iTeamV,dummy1)){
				/*GEÄNDERT AM:10-09-02, Änderung, damit nicht auch bei Selbstdamage die Warnung kommt!*/
	                        if(iTeamV == iTeamA && iIDA != iIDV){
					soundplayer(TextMessage[PAYATTENTION],IMP_SOUND[PAYATTENTION],Attacker,PAYATTENTION);				
				}
			}
		}
	}
	/*Headshot-Analyse*/
	if(STATUS_COMMAND[STATUS_HS][0]!=0){
		if( iDH <=0 ){
			for(i=0;i<MAX_WEAPONS;i++){
				if (strcmp(Weapon,g_WeaponName[i])==0 && iIDD >= g_WeaponDamage[i][0]){
					imp_HeadSounds(Attacker,iIDA);
					break;
				}
			}
		}
	}
	return PLUGIN_CONTINUE;
}
 
/*15.04.03: Spawned with the bomb hinzugefügt*/
public im_playeraction(HLCommand,HLData,HLUserName,UserIndex){
	if(STATUS_COMMAND[STATUS_PLUGIN][0]!=0){
		new Data[MAX_DATA_LENGTH];
		new Name[MAX_NAME_LENGTH];
		new Player[MAX_NAME_LENGTH];
		new Text[MAX_TEXT_LENGTH];
		new Authid[MAX_AUTHID_LENGTH];
		new sAID[3];
		new iAID;
		new dummy;
		new iTeam1;
		new iTeam2;
		new i;
		new maxplayers=maxplayercount();
 
		convert_string(HLData, Data, MAX_DATA_LENGTH); 
		strbreak(Data, sAID, Data, MAX_DATA_LENGTH);
 
		iAID=strtonum(sAID);
		playerinfo(iAID,Name,MAX_NAME_LENGTH,dummy,dummy,iTeam1,dummy);
 
 
		if(strcmp(Data, "Spawned_With_The_Bomb") == 0) {
			if(STATUS_COMMAND[STATUS_BS][0]!=0){
				snprintf(Text,MAX_TEXT_LENGTH,TextMessage[BOMBSPAWNED],Name);
				soundplayer(Text,IMP_SOUND[BOMBSPAWNED],Name,BOMBSPAWNED);
				glow(Name,250,10,10);
				set_timer("glow_off",10,0,Name);
				/*Text-Ausgabe ans ganze Team*/
				for(i=1;i<=maxplayers;i++){
					playerinfo(i,Player,MAX_NAME_LENGTH,dummy,dummy,iTeam2,dummy,Authid);
					if(iTeam1==iTeam2){
						if(strcmp(Authid,"BOT")!=0){
							soundplayer(Text,"0",Player,BOMBSPAWNED);
						}
					}
				}
			}
		}else if(strcmp(Data, "Planted_The_Bomb") == 0) {
			if(STATUS_COMMAND[STATUS_BP][0]!=0){	
				snprintf(Text,MAX_TEXT_LENGTH,TextMessage[PLANTBOMB],Name);
				soundall(Text,IMP_SOUND[PLANTBOMB],Name,PLANTBOMB);
			}
			new c4timerorig;
			new wait;
			c4timerorig=getvar("mp_c4timer");
			if(c4timerorig>=30){
				wait=c4timerorig-30;
				c4timer=30;
			}else if(c4timerorig>=20 && c4timerorig<30){
				wait=c4timerorig-20;
				c4timer=20;
			}
			set_timer("imp_bombtimer",wait,0);
		}else if(strcmp(Data, "Dropped_The_Bomb") == 0) {
			if(STATUS_COMMAND[STATUS_BD][0]!=0){	
				snprintf(Text,MAX_TEXT_LENGTH,TextMessage[DROPBOMB],Name);
				soundplayer(Text,IMP_SOUND[DROPBOMB],Name,DROPBOMB);
				for(i=1;i<=maxplayers;i++){
					playerinfo(i,Player,MAX_NAME_LENGTH,dummy,dummy,iTeam2,dummy,Authid);
					if(iTeam1==iTeam2){
						if(strcmp(Authid,"BOT")!=0){
							soundplayer(Text,IMP_SOUND[DROPBOMB],Player,DROPBOMB);
						}
					}
				}
			}
		}else if(strcmp(Data, "Got_The_Bomb") == 0) {
			if(STATUS_COMMAND[STATUS_BG][0]!=0){
				snprintf(Text,MAX_TEXT_LENGTH,TextMessage[GOTBOMB],Name);
				soundplayer(Text,IMP_SOUND[GOTBOMB],Name,GOTBOMB);
				for(i=1;i<=maxplayers;i++){
					playerinfo(i,Player,MAX_NAME_LENGTH,dummy,dummy,iTeam2,dummy,Authid);
					if(iTeam1==iTeam2){
						if(strcmp(Authid,"BOT")!=0){
							soundplayer(Text,"0",Player,GOTBOMB);
						}
					}
				}
			}
		}else if(strcmp(Data, "Touched_A_Hostage") == 0) {
			if(STATUS_COMMAND[STATUS_TH][0]!=0){
				snprintf(Text,MAX_TEXT_LENGTH,TextMessage[TOUCHEDHOSTAGE],Name);
				soundall(Text,IMP_SOUND[TOUCHEDHOSTAGE],Name,TOUCHEDHOSTAGE);
			}
		}else if(strncmp(Data, "Begin_",6) == 0) {
			if(STATUS_COMMAND[STATUS_SBD][0]!=0){
				soundplayer("Good Luck!",IMP_SOUND[BOMBDEFUSE],Name,PAYATTENTION);
				for(i=1;i<=maxplayers;i++){
					playerinfo(i,Player,MAX_NAME_LENGTH,dummy,dummy,iTeam2,dummy,Authid);
					if(iTeam1==iTeam2){
						if(strcmp(Authid,"BOT")!=0){
							snprintf(Text,MAX_TEXT_LENGTH,TextMessage[BOMBDEFUSE],Name);
							soundplayer(Text,"0",Player,BOMBDEFUSE);
						}
					}
				}
			}
		}else if(strcmp(Data, "Defused_The_Bomb") == 0) {
			if(STATUS_COMMAND[STATUS_FBD][0]!=0){
				snprintf(Text,MAX_TEXT_LENGTH,TextMessage[DEFUSEDBOMB],Name);
				soundall(Text,IMP_SOUND[DEFUSEDBOMB],Name,DEFUSEDBOMB);
			}
		}
 
 
	}			
	return PLUGIN_CONTINUE;
}
 
public im_showintheend(HLCommand,HLData,HLUserName,UserIndex){
	if(STATUS_COMMAND[STATUS_DS][0]!=0 && STATUS_COMMAND[STATUS_PLUGIN][0]!=0){
		new Data1[MAX_DATA_LENGTH];                                
	        new Data2[MAX_DATA_LENGTH];  
	        new Params[MAX_DATA_LENGTH];
		new dummy[MAX_DATA_LENGTH];
	        new Name[MAX_NAME_LENGTH];
		new Text[MAX_TEXT_LENGTH];
		new dummy1;
		new i;
		new maxplayers=maxplayercount();
		new Authid[MAX_AUTHID_LENGTH];
 
		convert_string(HLData,Params,MAX_DATA_LENGTH);
 
	        strbreak(Params,Data1,Data2,MAX_DATA_LENGTH);
		strsplit(Data2, "# " ,dummy,MAX_DATA_LENGTH,dummy,MAX_DATA_LENGTH,ctscore,MAX_NUMBER_LENGTH,dummy,MAX_DATA_LENGTH,terrscore,MAX_NUMBER_LENGTH);
 
	        if(strmatch(Data1, "CT", strlen("CT")) || strmatch(Data1, "TERRORIST", strlen("TERRORIST"))){
			if(menuenabled==1 && vote_allowed()==1){
				for(i=1;i<=maxplayers;i++){
					if(playerinfo(i,Name,MAX_NAME_LENGTH,dummy1,dummy1,dummy1,dummy1,Authid)){
						if(strcmp(Authid,"BOT")!=0){
							if(allowsound(Name)){
								show_stats(Name);
							}
						}
					}
				}
			}else{
				if(SpielerID!=0){
					if(playerinfo(SpielerID,Name,MAX_NAME_LENGTH,dummy1,dummy1,dummy1,dummy1)){
						snprintf(Text,MAX_TEXT_LENGTH,"T:%s-CT:%s Best in round:^n%s^nwith %i Frags and %i Hs",terrscore,ctscore,Name,FragCount[SpielerID],HeadCount[SpielerID]);
					}
				}else{
					snprintf(Text,MAX_TEXT_LENGTH,"T:%s - CT:%s^nNo best player available for this round!",terrscore,ctscore);
				}
				typesay(Text,12,47,74,206);
			}
			SpielerID=0;
			c4timer=999;
		}
	}
        return PLUGIN_CONTINUE;
}
 
public im_resetscore(HLCommand,HLData,HLUserName,UserIndex,Param){
	new loop;
	new Data[MAX_NAME_LENGTH];
	new Text[MAX_TEXT_LENGTH];
	new Dummy[MAX_NAME_LENGTH];
	new Number[MAX_NUMBER_LENGTH];
	convert_string(HLData,Data,MAX_NAME_LENGTH);
	/*Bitweiser Vergleich (ab 0):Restart_'R'ound -> 8 = R, ERGÄNZT AM:10.09.02, 'G'ame_Commencing = 0*/
	if(Data[8]=='R' || Data[0]=='G'){
		for( loop = 0; loop < MAX_PLAYERS; loop ++) {
			KillCountAll[loop]=CLEAN_SLATE;
		}
		SpielerIDBest=0;
		MostFrags=0;
		round = 0;
		c4timer=999;
	}else if(Data[6]=='S') {
		for( loop = 0; loop < MAX_PLAYERS; loop ++) {
			KillCount[loop] = CLEAN_SLATE;
			TimerIndex[loop]=CLEAN_SLATE;
			FragCount[loop]=CLEAN_SLATE;
			HeadCount[loop]=CLEAN_SLATE;
		}
		SpielerID=0;
		round++;
		c4timer=999;
		if(STATUS_COMMAND[STATUS_PLUGIN][0]!=0){
			if(STATUS_COMMAND[STATUS_RC][0]!=0){
				snprintf(Text,MAX_TEXT_LENGTH,TextMessage[PREPAREFIGHT],round);
				soundall(Text,IMP_SOUND[PREPAREFIGHT],Dummy,PREPAREFIGHT);
				numtoword(round,Number,MAX_NUMBER_LENGTH);
				snprintf(Text,MAX_TEXT_LENGTH,"round %s",Number);
				speak_number(Text);
			}
		}
	}
	return PLUGIN_CONTINUE;
}
 
/////////////////////////////////
/////// HILFS-FUNKTIONEN ////////
/////////////////////////////////
 
/*------------------------------*/
/*---- ALLES WAS MIT SOUND -----*/
/*---- UND DISPLAY ZU TUN  -----*/
/*----          HAT        -----*/
/*--------------------------------*/
 
/*Check, ob Client die Sounds hören will*/
public allowsound(User[]){
	new Info[MAX_NUMBER_LENGTH];
	new iInfo;
	new Authid[MAX_AUTHID_LENGTH];
	get_userAuthID(User,Authid,MAX_AUTHID_LENGTH);
	if(strcmp(Authid,"BOT")!=0){
		get_userinfo(User,Key,Info,MAX_NUMBER_LENGTH);
		iInfo=strtonum(Info);
		if(strlen(Info)==0 || iInfo > 0){/*damit wird automatisch immer der Sound auf 1 gesetzt,wenn kein setinfo vorhanden, bis 'stop' eingegeben wird*/
			return 1;
		}
	}
	return 0;
}
/*Sound- und Textausgabe, wenn es an alle Spieler auf dem Server gehen soll*/
soundall(Text[],Sound[],Attacker[],ID){
	if(STATUS_COMMAND[STATUS_PLUGIN][0]==0){
		return PLUGIN_CONTINUE;
	}
	new Name[MAX_NAME_LENGTH];
	new maxplayers = maxplayercount();
	new Authid[MAX_AUTHID_LENGTH];
 
	if(strcmp(Sound,"0")!=0){
		for( new i = 1; i <= maxplayers; i++ ){
			if( playerinfo(i, Name, MAX_NAME_LENGTH,_,_,_,_,Authid) ){
				//if its not a bot
				if(strcmp(Authid,"BOT")!=0){
				/*wenn der Spieler es erlaubt*/
					if(allowsound(Name)){
						if(priority==0){ 
							playsound(Name,Sound);
						}else{
							if(strcmp(Attacker,Name)!=0){
								playsound(Name,Sound);
							}
						}
					}
				}
			}
		}
	}
	if(STATUS_COMMAND[STATUS_DK][0]!=0 || ID>=PAYATTENTION){
		typesay(Text,12,random(255),random(255),random(255));
	}
	return PLUGIN_CONTINUE;
}
 
/*15.04.03: soundplayer(...) als Hilfsfunktion eingefügt*/
soundplayer(Text[],Sound[],Attacker[],ID){
	if(STATUS_COMMAND[STATUS_PLUGIN][0]==0){
		return PLUGIN_CONTINUE;
	}
 
 
	new Authid[MAX_AUTHID_LENGTH];
	priority=1;
	get_userAuthID(Attacker,Authid,MAX_AUTHID_LENGTH);
	if(strcmp(Authid,"BOT")!=0){
		if(allowsound(Attacker)){
			if(strcmp(Sound,"0")!=0){
				playsound(Attacker,Sound);
			}
			if(STATUS_COMMAND[STATUS_DK][0]!=0 && strlen(Text)!=0){
				messageex(Attacker,Text,print_tty);
			}
		}else if(ID==PAYATTENTION && strlen(Text)!=0){
			messageex(Attacker,Text,print_tty);
		}
	}
	priority=0;
	return PLUGIN_CONTINUE;
}
 
/*17.04.03: Um die Zahl + Text auszusprechen. Big THX an SR71GOKU*/
speak_number(Speak[]) {
	new Output[MAX_TEXT_LENGTH];
	new maxplayers=maxplayercount();
	new Target[MAX_NAME_LENGTH];
	new SessionID,WONID,Team,Dead;
	new Authid[MAX_AUTHID_LENGTH];
	new i;
 
	snprintf(Output,MAX_TEXT_LENGTH,"vox/%s",Speak);
	for(i=1; i<=maxplayers; i++) {
		strinit(Target);
		if(playerinfo(i,Target,MAX_NAME_LENGTH,SessionID,WONID,Team,Dead,Authid)==1) {
			if(strcmp(Authid,"BOT")!=0 && allowsound(Target)==1 ){
				speakto(Target,Output);
			}
		}
	}
	return PLUGIN_CONTINUE;
}
 
/*--------------------------------*/
/*---- DIE FRAG UND HEADSHOT -----*/
/*----       ANALAYSEN	     -----*/
/*--------------------------------*/
 
/*Die Headshot-Sounds-Analyse*/
imp_HeadSounds(Attacker[],iIDA){
	new Text[MAX_TEXT_LENGTH];
	new a;
	/*Headshots werden gezählt*/
	HeadCount[iIDA]+=1;
	/*Zufälliger Headshotsound wird ausgewählt*/
	a= random(3);
	snprintf(Text,MAX_TEXT_LENGTH,TextMessage[a],Attacker);
	soundall(Text,IMP_SOUND[a],Attacker,a);
}
 
/*19.04.03: Die MapLead-Analyse, Firstblood entfernt*/
imp_MapLeader( Attacker[],iIDA ){
	new Text[MAX_TEXT_LENGTH];
	new Victim[MAX_NAME_LENGTH];
	new dummy1;
	/*"Taken the lead", "Lost the lead" und "tied for the lead"-Gesamte Mapzeit-Analyse*/
	/*Der beste Spieler der gesamten Mapzeit wird ermittelt*/
 
	/*Gleichstand an Frags und kein bester Spieler mehr vorhanden*/
	if(KillCountAll[iIDA] == MostFrags){
		if(SpielerIDBest != iIDA){ /*Den Führenden ausschließen*/
			soundplayer(TextMessage[TIEDLEAD],IMP_SOUND[TIEDLEAD],Attacker,TIEDLEAD);
			/*Wenn es einen Führenden gab, ist er es nun nicht mehr, da Gleichstand eingetreten.*/
			if(SpielerIDBest!=0){
				playerinfo(SpielerIDBest,Victim,MAX_NAME_LENGTH,dummy1,dummy1,dummy1,dummy1);
				snprintf(Text,MAX_TEXT_LENGTH,TextMessage[LOSTLEAD],Attacker,LOSTLEAD);
				soundall(Text,"0",Victim,LOSTLEAD);
				soundplayer(Text,IMP_SOUND[LOSTLEAD],Victim,LOSTLEAD);
			}
			SpielerIDBest = 0;
		}	
	}
	/*Wenn es einen besten Spieler gibt*/
	if(KillCountAll[iIDA] > MostFrags){
		if(  SpielerIDBest != iIDA ){ /*Damit es dem Führenden nicht dauernd gesagt wird*/
				snprintf(Text,MAX_TEXT_LENGTH,TextMessage[TAKENLEAD],Attacker,TAKENLEAD);
				soundall(Text,"0",Attacker,TAKENLEAD);
				soundplayer(Text,IMP_SOUND[TAKENLEAD],Attacker,TAKENLEAD);
		}
		SpielerIDBest = iIDA;
		MostFrags = KillCountAll[iIDA];		
	}
	return PLUGIN_CONTINUE;
}
 
/*Die zeitunabhängigen UT-Sounds-Analayse*/
imp_killstreak( Attacker[],iIDA ){
	new Text[MAX_TEXT_LENGTH];
	/*Kill-Anzahl in der Runde-Analyse*/
	if(FragCount[iIDA] == 4){
			snprintf(Text,MAX_TEXT_LENGTH,TextMessage[KILLINGSPREE],Attacker);
			soundall(Text,IMP_SOUND[KILLINGSPREE],Attacker,KILLINGSPREE);
	}else if(FragCount[iIDA] == 5){
			snprintf(Text,MAX_TEXT_LENGTH,TextMessage[DOMINATING],Attacker);
			soundall(Text,IMP_SOUND[DOMINATING],Attacker,DOMINATING);
	}else if(FragCount[iIDA] >= 6){
			snprintf(Text,MAX_TEXT_LENGTH,TextMessage[GODLIKE],Attacker);
			soundall(Text,IMP_SOUND[GODLIKE],Attacker,GODLIKE);
	}
}
 
/*Die zeitabhängigen UT-Sounds*/
public imp_killstreaktime(Timer,Repeat,HLName,HLParam) {
  	new Attacker[MAX_NAME_LENGTH];
	new iIDA;
	new Text[MAX_TEXT_LENGTH];
  	convert_string(HLParam,Attacker,MAX_NAME_LENGTH);
	get_userindex(Attacker,iIDA);
	if( KillCount[iIDA]==2){
		snprintf(Text,MAX_TEXT_LENGTH,TextMessage[DOUBLEKILL],Attacker);
		soundall(Text,IMP_SOUND[DOUBLEKILL],Attacker,DOUBLEKILL);
	}else if(KillCount[iIDA]==3){
		snprintf(Text,MAX_TEXT_LENGTH,TextMessage[MULTIKILL],Attacker);
		soundall(Text,IMP_SOUND[MULTIKILL],Attacker,MULTIKILL);
	}else if(KillCount[iIDA]>=4 ){
		snprintf(Text,MAX_TEXT_LENGTH,TextMessage[MONSTERKILL],Attacker);
		soundall(Text,IMP_SOUND[MONSTERKILL],Attacker,MONSTERKILL);
	}
	KillCount[iIDA]=CLEAN_SLATE;
	TimerIndex[iIDA]=CLEAN_SLATE;
	return PLUGIN_CONTINUE;
}
 
/*-----------------------------------*/
/*---- SONSTIGE HILFSFUNKTIONEN -----*/
/*-----------------------------------*/
 
/*Bombenträger glüht bei Bomb_Spawned. Aufruf in Funktion im_playeraction*/
public glow_off(Timer,Repeat,HLName,HLParam) {
	new Player[MAX_NAME_LENGTH];
  	convert_string(HLParam,Player,MAX_NAME_LENGTH);
  	glow(Player,0,0,0);
  	return PLUGIN_CONTINUE;
}
 
/*Zurücksetzen der Spieler-Arrays. Aufgerufen in plugin_connect,plugin_disconnect,im_connect und im_disconnect*/
reset_playerarray(UserIndex){
	KillCount[UserIndex] = CLEAN_SLATE;
	TimerIndex[UserIndex]=CLEAN_SLATE;
	FragCount[UserIndex]=CLEAN_SLATE;
	HeadCount[UserIndex]=CLEAN_SLATE;
	KillCountAll[UserIndex]=CLEAN_SLATE;
}
 
/*13.04.04 Menü für die erweiterte Stats-Anzeige. Aufgerufen in der AM-Funktion HandleSay(...)*/
show_stats(User[]){
	new Text[512];
	new loop;
	new loop2;
	new maxplayers=maxplayercount();
	new Name[MAX_NAME_LENGTH];
	new Dead[MAX_NAME_LENGTH];
	new x;
	new iDead;
 
	snprintf(Text,512,"Teamscore: \yCT:%s -- \rT:%s\w RUNDE:%i^n^n",ctscore,terrscore,round);
	snprintf(Text,512,"%s\yDie Besten Spieler dieser Runde:\w",Text);
	if(FragCount[SpielerID]>1){
		for(loop=FragCount[SpielerID];loop>1;loop--){
			if(x==3){
				break;
			}
			for(loop2=1;loop2<=maxplayers;loop2++){
				if(x==3){
					break;
				}
				if(playerinfo(loop2,Name,MAX_NAME_LENGTH,_,_,_,iDead)){
					if(FragCount[loop2]==loop){
						x++;
						if(iDead==1){
							strcpy(Dead,"TOT",MAX_NAME_LENGTH);
						}else{
							strcpy(Dead,"",MAX_NAME_LENGTH);
						}
						snprintf(Text,512,"%s^n%i (%i) ---- %s (%s)",Text,FragCount[loop2],HeadCount[loop2],Name,Dead);
					}
				}
			}
		}
	}else{
		snprintf(Text,512,"%s^nKein bester Spieler vorhanden.",Text);
	}
	snprintf(Text,512,"%s\y^n^nBester Spieler auf der gesamten Map:\w",Text);
	if(SpielerIDBest!=0){
		playerinfo(SpielerIDBest,Name,MAX_NAME_LENGTH);
	}else{
		strcpy(Name,"Niemand",MAX_NAME_LENGTH);
	}
	snprintf(Text,512,"%s^n%s ^nMeisten Frags: %i Frags",Text,Name,MostFrags);
	menu(User,Text,1023,8);
	return PLUGIN_HANDLED;
}
 
/*17.04.03: Zahlen in String umwandeln, um es mit HL-Speech auszuwerten. Big THX an SR71GOKU*/
stock do_numtoword(iNum,str[],iLevel,iLength) {
 
	/* If there is more than one group of 3, then take care of the others first. */
	if(iNum >= 1000) do_numtoword(iNum / 1000,str,iLevel + 1,iLength);
 
	/* Grab the the first 3 digits only */
	iNum %= 1000;	
 
	/* Isolate each digit */
	new _hundreds = iNum / 100;
	new _tens = (iNum / 10) % 10;
	new _ones = iNum % 10;
 
	/* Take care of the teen numbers */
	if(_tens == 1 && _ones != 0) {
		snprintf(str,iLength,"%s%s%s%s",str,HundredsLib[_hundreds],TeensLib[_ones],GroupNamesLib[iLevel]);
	} else {
		snprintf(str,iLength,"%s%s%s%s%s",str,HundredsLib[_hundreds], TensLib[_tens], OnesLib[_ones],GroupNamesLib[iLevel]);
	}
 
	if(iLevel==0) str[strlen(str)-1] = 0; /* Gets rid of the trailing space*/
	return 1;
}
 
stock numtoword(iNum,str[],iLength) {
	/* Empties the first char of the string */
	str[0] = 0;
	str[iLength-1] = 0;
	if(iNum == 0) {
		snprintf(str,iLength,"zero");
		return 1;
	}
	if(iNum < 0) {
		iNum *= -1;
		snprintf(str,iLength,"negative ");
	}
 
	return do_numtoword(iNum,str,0,iLength); 
}
 
/*19.04.03: Der Bombtimer*/
 
public imp_bombtimer(Timer,Repeat,HLName,HLParam) {
	if(c4timer!=999){
		new Text[MAX_TEXT_LENGTH];
		new C4Timer[MAX_NUMBER_LENGTH];
		new wait;
		new Dummy[MAX_NAME_LENGTH];
		if(STATUS_COMMAND[STATUS_BT][0]!=0){
			numtoword(c4timer,C4Timer,MAX_NUMBER_LENGTH);
			if(c4timer>5){
				snprintf(Text,MAX_TEXT_LENGTH,"detonation in %s seconds",C4Timer);
				speak_number(Text);
				soundall(Text,IMP_SOUND[BOMBTIMER],Dummy,BOMBTIMER);
			}else if(c4timer!=0){
				snprintf(Text,MAX_TEXT_LENGTH,"%s",C4Timer);
				speak_number(Text);
				soundall(Text,IMP_SOUND[BOMBTIMER],Dummy,BOMBTIMER);
			}
		}
		switch(c4timer){
			case 30:{ 
				c4timer=20;
				wait=10;
			}
			case 20:{ 
				c4timer=10;
				wait=10;
			}
			case 10:{
				c4timer=5;
				wait=4;
			}
			case 5: {
				c4timer=4;
				wait=1;
			}
			case 4: {
				c4timer=3;
				wait=1;
			}
			case 3: {
				c4timer=2;
				wait=1;
			}
			case 2: {
				c4timer=1;
				wait=1;
			}
			case 1: {
				c4timer=0;
				wait=1;
			}	
			case 0: {
				if(STATUS_COMMAND[STATUS_DB][0]!=0){
					soundall(TextMessage[BOMBDETONATION],IMP_SOUND[BOMBDETONATION],Dummy,BOMBDETONATION);
				}
				return PLUGIN_CONTINUE;
			}			
		}
		set_timer("imp_bombtimer",wait,0);
	}
	return PLUGIN_CONTINUE;
}