#include #include #include 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 { "I like Murdering", "Survivor", "Aimkey", "Round of Execution", "1 HP Hero" } new const AchDescription[Achieves][] = // Define the Achievements Description, dont forget commas { "Kill 500 Enemies", "Surieve 250 Rounds", "Make 125 Headshots", "Kill 5 Enemies in one Round", "Kill 5 Enemies with 1 HP" } 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), "I like Murdering") case 2: formatex(iTag, charsmax(iTag), "Survivor") case 3: formatex(iTag, charsmax(iTag), "Aimkey") case 4: formatex(iTag, charsmax(iTag), "Round of Execution") case 5: formatex(iTag, charsmax(iTag), "1 HP Hero") } 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), "I like Murdering") case 2: formatex(iTag, charsmax(iTag), "Survivor") case 3: formatex(iTag, charsmax(iTag), "Aimkey") case 4: formatex(iTag, charsmax(iTag), "Round of Execution") case 5: formatex(iTag, charsmax(iTag), "1 HP Hero") } 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 You have chosen^4 %s^3 as your tag", prefix, AchName[item]) } else { ColorChat(iPlayer, GREY, "%s You have not unlocked the achievement yet.", 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 successfully unlocked the achievement %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 successfully unlocked the achievement %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 successfully unlocked the achievement %s!", prefix, szName, AchName[ONEHPHERO]) } } if(read_data(3)) { Achievement[iKiller][AIMKEY]++ if(Achievement[iKiller][AIMKEY] == AchRequirement[AIMKEY]) { ColorChat(0, GREY, "%s %s successfully unlocked the achievement %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 successfully unlocked the achievement %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 //////////// /////////////////////////////////////////////////// /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE *{\\ rtf1\\ ansi\\ ansicpg1252\\ deff0\\ deflang1053{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ f0\\ fs16 \n\\ par } */