/*ultimate Killingspree
 
1.Kill     >>> Firstblood
 
4.Kills  >>> Killingspree
 
5.Kills  >>> Rampage
 
6.Kills  >>> Domination
 
7.Kills  >>> Unstoppable
 
8.Kills  >>> Godlike
 
9.Kills  >>> Wickedsick
 
Zeitabhängige Awards
 
2.Kills >>> Doublekill
 
3.Kills >>> Triplekill
 
4.Kills >>> Multikill
 
5.Kills >>> Megakill
 
6.Kills >>> Ultrakill
 
7.Kills >>> Monsterkill
 
*/
 
 
#include <string>
#include <admin>
#include <adminlib>
 
#define ACCESS_CONSOLE	131072
 
new g_SoundFile[MAX_TEXT_LENGTH]="sound/misc/";
new g_maxplayers;
 
/////////////////////////////////////
//// Kills-Reset bei Round_Start ////
//// wenn = 0, dann nur bei TOD  ////
/////////////////////////////////////
new g_resetround=1;
 
////////////////////////
//// Zeitunabhängig ////
////////////////////////
 
//Anzahl der AWARDS
#define MAX_KILLS		10
 
//Anzahl der notwendigen Kills für AWARD (-1 = nicht belegt)
new g_Kills1[MAX_KILLS]={
	-1,
	-1,
	-1,
	-1,
	4,
	5,
	6,
	7,
	8,
	9
};
 
//Nachricht für AWARD z.B. Spielername: KILLINGSPREE!
new g_Announce1[MAX_KILLS][MAX_TEXT_LENGTH]={
	"",
	"",
	"",
	"",
	"KILLINGSPREE!",
	"RAMPAGE!",
	"DOMINATION!",
	"UNSTOPPABLE!",
	"GODLIKE!!!",
	"WHICKEDSICK!"
};
 
//Farbe der typesay Anzeige (rot, grün, blau)
new g_Color1[3]={
	200,
	20,
	20
};
 
//Sound für AWARD
new g_Sound1[MAX_KILLS][MAX_TEXT_LENGTH]={
	"",
	"",
	"",
	"",
	"killingspree.wav",
	"rampage.wav",
	"dominating.wav",
	"unstoppable.wav",
	"godlike.wav",
	"whickedsick.wav"
};
 
////////////////////////
////  Zeitabhängig  ////
////////////////////////
#define MAX_TIME_KILLS	8
 
new g_Kills2[MAX_TIME_KILLS]={
	-1,
	-1,
	2,
	3,
	4,
	5,
	6,
	7
};
 
new g_Announce2[MAX_TIME_KILLS][MAX_TEXT_LENGTH]={
	"",
	"",
	"DOUBLEKILL!",
	"TRIPLEKILL!",
	"MULTIKILL!",
	"MEGAKILL!",
	"ULTRAKILL!",
	"MONSTERKILL!"
};
new g_Sound2[MAX_TIME_KILLS][MAX_TEXT_LENGTH]={
	"",
	"",
	"doublekill.wav",
	"tripplekill.wav",
	"multikill.wav",
	"megakill.wav",
	"ultrakill.wav",
	"monsterkill.wav"
};
 
new g_KillTime=5;
 
//Farbe der typesay Anzeige (rot, grün, blau)
new g_Color2[3]={
	20,
	20,
	200
};
 
////////////////////////
////    sonstige    ////
////////////////////////
 
new g_firstblood;
new g_UserKills[MAX_PLAYERS];
new g_UserTimeKills[MAX_PLAYERS];
new g_UserTimer[MAX_PLAYERS];
 
public plugin_init() {
	plugin_registerinfo("Ultimate Killingspree","Announces Doublekills, Monsterkills etc.","0.8");
	plugin_registercmd("uk_kill","uk_kill",ACCESS_CONSOLE);
	exec( "logd_reg 57 admin_command uk_kill" );		/*KILL-EVENT*/
	plugin_registercmd("uk_world","uk_world",ACCESS_CONSOLE);
	exec( "logd_reg 62 admin_command uk_world" );		/*WORLD-EVENT*/
	g_maxplayers=maxplayercount();
	return PLUGIN_CONTINUE;
}
 
public uk_kill(HLCommand,HLData,HLUserName,UserIndex) {
	new Data[MAX_DATA_LENGTH];
	new Weapon[MAX_NAME_LENGTH];
	new Attacker[MAX_NAME_LENGTH];
	new Victim[MAX_NAME_LENGTH];
	new sAID[3];
	new sVID[3];
	new iAID;
	new iVID;
	new iTeamA;
	new iTeamV;
 
	convert_string(HLData,Data,MAX_DATA_LENGTH);
 
	strsplit(Data," ",sAID,3,sVID,3,Weapon,MAX_NAME_LENGTH);
	iAID=strtonum(sAID);
	iVID=strtonum(sVID);
 
	if(playerinfo(iAID,Attacker,MAX_NAME_LENGTH,_,_,iTeamA)){
		if(playerinfo(iVID,Victim,MAX_NAME_LENGTH,_,_,iTeamV)){
			//Teamkillcheck
			if(iTeamA!=iTeamV){
 
				//Kills zählen
				g_UserKills[iAID]+=1;
				g_UserTimeKills[iAID]+=1;
 
				//Firstblood checken
				if(!g_firstblood){
					g_firstblood=1;
					sound_all(Attacker,"firstblood.wav","FIRSTBLOOD!",0);
				}
 
				//Timer für zeitabhängige Kills starten, wenn noch nicht vorhanden
				if(!g_UserTimer[iAID]){
					g_UserTimer[iAID]=1;
					set_timer("check_timer",g_KillTime,0,sAID);
				}
 
				//Überprüfen, ob ein zeitunabhängiger AWARD vorliegt//
				check_kills(iAID,0);
			}else{
				//Teamkill abziehen
				g_UserKills[iAID]-=1;
			}
			//Kills des toten Spieler nullen
			g_UserKills[iVID]=0;
			g_UserTimeKills[iVID]=0;
			g_UserTimer[iVID]=0;
		}
	}
	return PLUGIN_CONTINUE;
}
 
public check_timer(Timer,Repeat,HLName,HLParam) {
	new User[3];
	new iUser;
 
	convert_string(HLParam,User,3);
	iUser=strtonum(User);
	if(g_UserTimer[iUser]){
		g_UserTimer[iUser]=0;
		//Überprüfen, ob ein zeitabhängiger AWARD vorliegt//
		check_kills(iUser,1);
	}
}
 
check_kills(UserIndex,ID){
	new Player[MAX_NAME_LENGTH];
	new i;
	if(playerinfo(UserIndex,Player,MAX_NAME_LENGTH)){
		if(ID){
			//AWARD für zeitabhängige Kills prüfen
			for(i=0;i<MAX_TIME_KILLS;i++){
				if(g_Kills2[i]!=-1 && g_Kills2[i]==g_UserTimeKills[UserIndex]){
					sound_all(Player,g_Sound2[i],g_Announce2[i],ID);
					break;
				}
			}
			g_UserTimeKills[UserIndex]=0;
		}else{
			//AWARD für zeitunabhängige Kills prüfen
			for(i=0;i<MAX_KILLS;i++){
				if(g_Kills1[i]!=-1 && g_Kills1[i]==g_UserKills[UserIndex]){
					sound_all(Player,g_Sound1[i],g_Announce1[i],ID);
					break;
				}
			}
		}
	}
}
 
 
sound_all(UserName[],WavFile[],Msg[],ID){
	new Data[MAX_DATA_LENGTH];
	new Player[MAX_NAME_LENGTH];
	new i;
 
	snprintf(Data,MAX_DATA_LENGTH,"%s:^n%s",UserName,Msg);
	if(ID){
		typesay(Data,12,g_Color2[0],g_Color2[1],g_Color2[2]);
	}else{
		typesay(Data,12,g_Color1[0],g_Color1[1],g_Color1[2]);
	}
 
	snprintf(Data,MAX_DATA_LENGTH,"%s%s",g_SoundFile,WavFile);
 
	for(i=1;i<=g_maxplayers;i++){
		if(playerinfo(i,Player,MAX_NAME_LENGTH)){
			speakto(Player,Data);
		}
	}
}
 
//Kills der Spieler, die den Server verlassen oder neu connecten, nullen
public plugin_disconnect(HLUserName,UserIndex) {
	g_UserKills[UserIndex]=0;
	g_UserTimeKills[UserIndex]=0;
	g_UserTimer[UserIndex]=0;
}
 
public plugin_connect(HLUserName,HLIP, UserIndex) {
	g_UserKills[UserIndex]=0;
	g_UserTimeKills[UserIndex]=0;
	g_UserTimer[UserIndex]=0;
}
 
//Kills nach jeder Spielrunde resetten
public uk_world(HLCommand,HLData,HLUserName,UserIndex) {
	new Data[MAX_DATA_LENGTH];
	new i;
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	if(Data[8]=='R' || Data[0]=='G' || Data[6]=='S'){
		if(g_resetround){
			for(i=0;i<=g_maxplayers;i++){
				g_UserKills[i]=0;
				g_UserTimeKills[i]=0;
				g_UserTimer[i]=0;
			}
		}
		g_firstblood=0;
	}
	return PLUGIN_CONTINUE;
}