#include <amxmodx>
#include <cstrike>
#include <sqlx>
enum Color
{
NORMAL = 1, // clients scr_concolor cvar color
GREEN, // Green Color
TEAM_COLOR, // Red, grey, blue
GREY, // grey
RED, // Red
BLUE, // Blue
}
new TeamName[][] =
{
"",
"TERRORIST",
"CT",
"SPECTATOR"
}
new Host[] = "host"
new User[] = "user"
new Pass[] = "password"
new Db[] = "db"
new Handle:g_SqlTuple
new g_Error[512]
enum _:Achieves // Define the available Achievements, dont forget commas
{
MURDER, // Done
SURVIVOR, // Done
AIMKEY, // Done
EXECUTION, // Done
ONEHPHERO // Done
}
new const AchName[Achieves][] = // Define the Achievements Names, dont forget commas
{
"Kivgz",
"Tllsre szletett",
"Mester",
"Vgrehajts kre",
"Hs"
}
new const AchDescription[Achieves][] = // Define the Achievements Description, dont forget commas
{
"lj meg 500 ellensget",
"lj tl 250 krt",
"lj 125 fejlvssel",
"lj meg 5 ellenfelet egy krben",
"lj meg 5 ellenfelet 1 HP-val"
}
new const AchRequirement[Achieves] = // Define Requirements. For non progress achievements use 1 (Like Secret Phrase), dont forget commas
{
500,
250,
125,
5,
5
}
new const prefix[] = "^4[ClanTag] Achievements:^3"
new Achievement[33][Achieves]
new iAchTag[33]
new szTemp[555 char]
public plugin_init()
{
register_plugin("Achievements", "5.0", "fLaXXiE")
register_event("DeathMsg", "Event_DeathMsg", "a")
register_logevent("EventRoundStart", 2, "1=Round_Start")
register_clcmd("say /achievements", "CmdAch")
register_clcmd("say /ach", "CmdAch")
register_clcmd("say /a", "CmdAch")
register_clcmd("say", "CmdSay")
register_clcmd("say_team", "CmdSayTeam")
set_task(1.0, "MySql_Init")
}
public CmdSayTeam(iPlayer)
{
new iTag[120]
switch(iAchTag[iPlayer])
{
case 0: return PLUGIN_CONTINUE
case 1: formatex(iTag, charsmax(iTag), "Kivgz")
case 2: formatex(iTag, charsmax(iTag), "Tllsre szletett")
case 3: formatex(iTag, charsmax(iTag), "Mester")
case 4: formatex(iTag, charsmax(iTag), "Vgrehajts kre")
case 5: formatex(iTag, charsmax(iTag), "Hs")
}
new iMessage[192], szName[32], None[2][32], iChat[192]
read_args(iMessage, 191)
remove_quotes(iMessage)
formatex(None[0], 31, ""), formatex(None[1], 31, " ")
if(equal(iMessage, ""))
return PLUGIN_HANDLED
if(!equali(iMessage, None[0]) && !equali(iMessage, None[1]))
{
get_user_name(iPlayer, szName, 31)
if(is_user_alive(iPlayer))
{
switch(cs_get_user_team(iPlayer))
{
case 1: formatex(iChat, 191, "^4[%s]^1 (Terrorist)^3 %s^1 : %s", iTag, szName, iMessage)
case 2: formatex(iChat, 191, "^4[%s]^1 (Counter-Terrorist)^3 %s^1 : %s", iTag, szName, iMessage)
case 3: formatex(iChat, 191, "^4[%s]^1 (Spectator)^3 %s^1 : %s", iTag, szName, iMessage)
}
}
else
{
switch(cs_get_user_team(iPlayer))
{
case 1: formatex(iChat, 191, "^1*DEAD* ^4[%s]^1 (Terrorist)^3 %s^1 : %s", iTag, szName, iMessage)
case 2: formatex(iChat, 191, "^1*DEAD* ^4[%s]^1 (Counter-Terrorist)^3 %s^1 : %s", iTag, szName, iMessage)
case 3: formatex(iChat, 191, "^1*DEAD* ^4[%s]^1 (Spectator)^3 %s^1 : %s", iTag, szName, iMessage)
}
}
switch(cs_get_user_team(iPlayer))
{
case 1: ColorChat(0, RED, iChat)
case 2: ColorChat(0, BLUE, iChat)
case 3: ColorChat(0, GREY, iChat)
}
return PLUGIN_HANDLED_MAIN
}
return PLUGIN_CONTINUE
}
public CmdSay(iPlayer)
{
new iTag[120]
switch(iAchTag[iPlayer])
{
case 0: return PLUGIN_CONTINUE
case 1: formatex(iTag, charsmax(iTag), "Kivgz")
case 2: formatex(iTag, charsmax(iTag), "Tllsre szletett")
case 3: formatex(iTag, charsmax(iTag), "Mester")
case 4: formatex(iTag, charsmax(iTag), "Vgrehajts kre")
case 5: formatex(iTag, charsmax(iTag), "Hs")
}
new iMessage[192], szName[32], None[2][32], iChat[192]
read_args(iMessage, 191)
remove_quotes(iMessage)
formatex(None[0], 31, ""), formatex(None[1], 31, " ")
if(equal(iMessage, ""))
return PLUGIN_HANDLED
if(!equali(iMessage, None[0]) && !equali(iMessage, None[1]))
{
get_user_name(iPlayer, szName, 31)
if(is_user_alive(iPlayer)) formatex(iChat, 191, "^4[%s]^3 %s^1 : %s", iTag, szName, iMessage)
else formatex(iChat, 191, "^1*DEAD* ^4[%s]^3 %s^1 : %s", iTag, szName, iMessage)
switch(cs_get_user_team(iPlayer))
{
case 1: ColorChat(0, RED, iChat)
case 2: ColorChat(0, BLUE, iChat)
case 3: ColorChat(0, GREY, iChat)
}
return PLUGIN_HANDLED_MAIN
}
return PLUGIN_CONTINUE
}
public client_putinserver(iPlayer)
Load_MySql(iPlayer)
public client_disconnect(iPlayer)
{
Save_MySql(iPlayer)
iAchTag[iPlayer] = 0
}
public plugin_end()
SQL_FreeHandle(g_SqlTuple)
public CmdAch(iPlayer)
{
new g_AchMenu = menu_create("\wAchievements^n^n", "Achievements_Handler")
new Key[6]
for(new iAch = 0; iAch < Achieves; iAch++)
{
if(Achievement[iPlayer][iAch] == 0) formatex(szTemp, charsmax(szTemp), "\d%s - [%s] [%d/%d]", AchName[iAch], AchDescription[iAch], Achievement[iPlayer][iAch], AchRequirement[iAch])
else if(Achievement[iPlayer][iAch] >= AchRequirement[iAch]) formatex(szTemp, charsmax(szTemp), "\y%s \w- [\rCOMPLETED\w]", AchName[iAch])
else formatex(szTemp, charsmax(szTemp), "\y%s \w- [\r%s\w]\w [\r%d\w/\r%d\w]", AchName[iAch], AchDescription[iAch], Achievement[iPlayer][iAch], AchRequirement[iAch])
menu_additem(g_AchMenu, szTemp, Key)
}
menu_setprop(g_AchMenu, MPROP_EXIT, MEXIT_ALL)
menu_display(iPlayer, g_AchMenu, 0)
}
public Achievements_Handler(iPlayer, g_AchMenu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(g_AchMenu)
return PLUGIN_HANDLED
}
else
{
if(Achievement[iPlayer][item] >= AchRequirement[item])
{
iAchTag[iPlayer] = item+1
ColorChat (iPlayer, GREY, "%s Te kivlasztottad^4 %s^3 ezt", prefix, AchName[item])
}
else
{
ColorChat(iPlayer, GREY, "%s Nincs feloldva a kvetkez teljestmny.", prefix)
}
}
return PLUGIN_CONTINUE
}
///////////////////////////////////////////////////
///////// START OF ACHIEVEMENT ACTIONS ////////////
///////////////////////////////////////////////////
public Event_DeathMsg()
{
new iKiller = read_data(1)
new iVictim = read_data(2)
new szName[33]; get_user_name(iKiller, szName, charsmax(szName))
if(is_user_alive(iKiller) && get_user_team(iKiller) != get_user_team(iVictim))
{
Achievement[iKiller][EXECUTION]++
if(Achievement[iKiller][EXECUTION] == AchRequirement[EXECUTION])
{
ColorChat(0, GREY, "%s %s sikeresen feloldottad a kvetkez teljestmnyt %s!", prefix, szName, AchName[EXECUTION])
}
if(is_user_alive(iKiller) && get_user_team(iKiller) != get_user_team(iVictim))
{
Achievement[iKiller][MURDER]++
if(Achievement[iKiller][MURDER] == AchRequirement[MURDER])
{
ColorChat(0, GREY, "%s %s sikeresen feloldottad a kvetkez teljestmnyt %s!", prefix, szName, AchName[MURDER])
}
}
if(get_user_health(iKiller) == 1)
{
Achievement[iKiller][ONEHPHERO]++
if(Achievement[iKiller][ONEHPHERO] == AchRequirement[ONEHPHERO])
{
ColorChat(0, GREY, "%s %s sikeresen feloldottad a kvetkez teljestmnyt %s!", prefix, szName, AchName[ONEHPHERO])
}
}
if(read_data(3))
{
Achievement[iKiller][AIMKEY]++
if(Achievement[iKiller][AIMKEY] == AchRequirement[AIMKEY])
{
ColorChat(0, GREY, "%s %s sikeresen feloldottad a kvetkez teljestmnyt %s!", prefix, szName, AchName[AIMKEY])
}
}
}
return PLUGIN_CONTINUE
}
public EventRoundStart()
{
new iPlayers[32], iNum, iPlayer, szName[33]
get_players(iPlayers, iNum, "a")
for(new i = 0; i < iNum; i++)
{
iPlayer = iPlayers[i]
get_user_name(iPlayer, szName, charsmax(szName))
if(Achievement[iPlayer][EXECUTION] < 5)
Achievement[iPlayer][EXECUTION] = 0
if(is_user_alive(iPlayer))
{
Achievement[iPlayer][SURVIVOR]++
if(Achievement[iPlayer][SURVIVOR] == AchRequirement[SURVIVOR])
{
ColorChat(0, GREY, "%s %s sikeresen feloldottad a kvetkez teljestmnyt %s!", prefix, szName, AchName[SURVIVOR])
}
}
}
return PLUGIN_CONTINUE
}
///////////////////////////////////////////////////
////////// END OF ACHIEVEMENT ACTIONS /////////////
///////////////////////////////////////////////////
///////////////////////////////////////////////////
///////// START OF ACHIEVEMENT SAVING /////////////
///////////////////////////////////////////////////
public MySql_Init()
{
g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db)
new ErrorCode,Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,charsmax(g_Error))
if(SqlConnection == Empty_Handle)
set_fail_state(g_Error)
new Handle:Queries
Queries = SQL_PrepareQuery(SqlConnection,"CREATE TABLE IF NOT EXISTS achievements(steamid varchar(32), tag varchar(32), murder SMALLINT(1), survivor SMALLINT(1), aimkey SMALLINT(1), threesome SMALLINT(1), onehphero SMALLINT(1))")
if(!SQL_Execute(Queries))
{
SQL_QueryError(Queries,g_Error,charsmax(g_Error))
set_fail_state(g_Error)
}
SQL_FreeHandle(Queries)
SQL_FreeHandle(SqlConnection)
}
public Load_MySql(iPlayer)
{
new szSteamId[32], szTemp[512]
get_user_authid(iPlayer, szSteamId, charsmax(szSteamId))
new Data[1]
Data[0] = iPlayer
format(szTemp,charsmax(szTemp),"SELECT * FROM `achievements` WHERE (`achievements`.`steamid` = '%s')", szSteamId)
SQL_ThreadQuery(g_SqlTuple,"register_client",szTemp,Data,1)
}
public register_client(FailState,Handle:Query,Error[],Errcode,Data[],DataSize)
{
if(FailState == TQUERY_CONNECT_FAILED)
{
log_amx("Load - Could not connect to SQL database. [%d] %s", Errcode, Error)
}
else if(FailState == TQUERY_QUERY_FAILED)
{
log_amx("Load Query failed. [%d] %s", Errcode, Error)
}
new iPlayer
iPlayer = Data[0]
if(SQL_NumResults(Query) < 1)
{
new szSteamId[32]
get_user_authid(iPlayer, szSteamId, charsmax(szSteamId))
if (equal(szSteamId,"ID_PENDING"))
return PLUGIN_HANDLED
new szTemp[512]
format(szTemp,charsmax(szTemp),"INSERT INTO `achievements` (`steamid` , `tag`, `murder`, `survivor`, `aimkey`, `execution`, `onehphero`)VALUES ('%s', '0', '0', '0', '0', '0', '0')", szSteamId)
SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
}
else
{
iAchTag[iPlayer] = SQL_ReadResult(Query, 1)
Achievement[iPlayer][MURDER] = SQL_ReadResult(Query, 2)
Achievement[iPlayer][SURVIVOR] = SQL_ReadResult(Query, 3)
Achievement[iPlayer][AIMKEY] = SQL_ReadResult(Query, 4)
Achievement[iPlayer][EXECUTION] = SQL_ReadResult(Query, 5)
Achievement[iPlayer][ONEHPHERO] = SQL_ReadResult(Query, 6)
}
return PLUGIN_HANDLED
}
public Save_MySql(iPlayer)
{
new szSteamId[32], szTemp[512]
get_user_authid(iPlayer, szSteamId, charsmax(szSteamId))
format(szTemp,charsmax(szTemp),"UPDATE `achievements` SET `tag` = '%d', `murder` = '%d', `survivor` = '%d', `aimkey` = '%d', `execution` = '%d', `onehphero` = '%d' WHERE `achievements`.`steamid` = '%s';", iAchTag[iPlayer], Achievement[iPlayer][MURDER], Achievement[iPlayer][SURVIVOR], Achievement[iPlayer][AIMKEY], Achievement[iPlayer][EXECUTION], Achievement[iPlayer][ONEHPHERO], szSteamId)
SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
}
public IgnoreHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize)
{
SQL_FreeHandle(Query)
return PLUGIN_HANDLED
}
///////////////////////////////////////////////////
////////// END OF ACHIEVEMENT SAVING //////////////
///////////////////////////////////////////////////
///////////////////////////////////////////////////
///////// START OF ACHIEVEMENT COLORCHAT //////////
///////////////////////////////////////////////////
ColorChat(id, Color:type, const msg[], {Float,Sql,Result,_}:...)
{
static message[256];
switch(type)
{
case NORMAL: // clients scr_concolor cvar color
{
message[0] = 0x01;
}
case GREEN: // Green
{
message[0] = 0x04;
}
default: // White, Red, Blue
{
message[0] = 0x03;
}
}
vformat(message[1], 251, msg, 4);
// Make sure message is not longer than 192 character. Will crash the server.
message[192] = '^0';
static team, ColorChange, index, MSG_Type;
if(id)
{
MSG_Type = MSG_ONE;
index = id;
} else {
index = FindPlayer();
MSG_Type = MSG_ALL;
}
team = get_user_team(index);
ColorChange = ColorSelection(index, MSG_Type, type);
ShowColorMessage(index, MSG_Type, message);
if(ColorChange)
{
Team_Info(index, MSG_Type, TeamName[team]);
}
}
ShowColorMessage(id, type, message[])
{
message_begin(type, get_user_msgid("SayText"), _, id);
write_byte(id)
write_string(message);
message_end();
}
Team_Info(id, type, team[])
{
message_begin(type, get_user_msgid("TeamInfo"), _, id);
write_byte(id);
write_string(team);
message_end();
return 1;
}
ColorSelection(index, type, Color:Type)
{
switch(Type)
{
case RED:
{
return Team_Info(index, type, TeamName[1]);
}
case BLUE:
{
return Team_Info(index, type, TeamName[2]);
}
case GREY:
{
return Team_Info(index, type, TeamName[0]);
}
}
return 0;
}
FindPlayer()
{
static i;
i = -1;
while(i <= get_maxplayers())
{
if(is_user_connected(++i))
{
return i;
}
}
return -1;
}
///////////////////////////////////////////////////
///////// END OF ACHIEVEMENT COLORCHAT ////////////
///////////////////////////////////////////////////
///////////////////////////////////////////////////
///////// Stock Start//////////////////////////////
///////////////////////////////////////////////////
stock print_color(const id, const input[], any:...)
{
new count = 1, players[32]
static msg[191]
vformat(msg, 190, input, 3)
replace_all(msg, 190, "!g", "^4")
replace_all(msg, 190, "!y", "^1")
replace_all(msg, 190, "!t", "^3")
replace_all(msg, 190, "", "á")
replace_all(msg, 190, "", "é")
replace_all(msg, 190, "", "í")
replace_all(msg, 190, "", "ó")
replace_all(msg, 190, "", "ö")
replace_all(msg, 190, "", "ő")
replace_all(msg, 190, "", "ú")
replace_all(msg, 190, "", "ü")
replace_all(msg, 190, "", "ű")
replace_all(msg, 190, "", "Á")
replace_all(msg, 190, "", "É")
replace_all(msg, 190, "", "Í")
replace_all(msg, 190, "", "Ó")
replace_all(msg, 190, "", "Ö")
replace_all(msg, 190, "", "Ő")
replace_all(msg, 190, "", "Ú")
replace_all(msg, 190, "", "Ü")
replace_all(msg, 190, "", "Ű")
if (id) players[0] = id; else get_players(players, count, "ch")
{
for (new i = 0; i < count; i++)
{
if (is_user_connected(players[i]))
{
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
write_byte(players[i])
write_string(msg)
message_end()
}
}
}
return PLUGIN_HANDLED
}
///////////////////////////////////////////////////
///////// Stock END////////////////////////////////
///////////////////////////////////////////////////