Achievements bug fix
hi,
I tried to edit achievements by flaxxie (I know it's not good but there aren't any other achievement plugins with menu style progress. MOTD style isn't for me)
Problem:
Progress resets to 0 on new round
PHP Code:
#include <amxmodx>
#include <cstrike>
#include <sqlx>
#include <csgo>
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[] = ""
new User[] = ""
new Pass[] = ""
new Db[] = ""
//NEW
new g_iPlanter
new g_iDefuser
//NEW END
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
PLANT,
RITE,
BOOMALA,
DEFUSE,
DAILININKAS,
HATTRICK
}
new const AchName[Achieves][] = // Define the Achievements Names, dont forget commas
{
"Karo Dievas",
"Išgyventojas",
"Aimas",
"Ace",
"1 HP Didvyris",
"Sprogdintojas", //NEW
"Išminuotojas",
"Bombermenas",
"Elitinis Išminuotojas",
"Dailininkas",
"Hat Trick"
}
new const AchDescription[Achieves][] = // Define the Achievements Description, dont forget commas
{
"Nužudyk 500 priešų",
"Išgyvenk 250 raundų",
"Padaryk 125 HS",
"Padaryk ACE",
"Nužudyk 5 priešus su 1 HP",
"Laimėk raundą susprogdinęs C4", //NEW
"Laimėk raundą išminavęs C4",
"Padėk 50 C4 bombų",
"Išminuok 50 C4 bombų",
"Nupiešk 50 graffiti (spray)",
"Padaryk 3 HS iš eilės"
}
new const AchRequirement[Achieves] = // Define Requirements. For non progress achievements use 1 (Like Secret Phrase), dont forget commas
{
500,
250,
125,
5,
5,
1, //NEW
1,
50,
50,
50,
3
}
new const prefix[] = "pasiekimai >> "
new Achievement[33][Achieves]
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_logevent( "Event_Roundend", 2, "1=Round_End" );
//NEW
register_logevent( "EventBombDefused", 3, "2=Defused_The_Bomb" );
register_logevent( "EventPlantTheBomb", 3, "2=Planted_The_Bomb" );
register_logevent( "EventBombExploded", 6, "3=Target_Bombed" );
//NEW END
register_clcmd("say /achievements", "CmdAch")
register_clcmd("say /ach", "CmdAch")
register_clcmd("say /a", "CmdAch")
set_task(1.0, "MySql_Init")
}
public client_putinserver(iPlayer)
Load_MySql(iPlayer)
public client_disconnect(iPlayer)
{
Save_MySql(iPlayer)
}
public plugin_end()
SQL_FreeHandle(g_SqlTuple)
public CmdAch(iPlayer)
{
new g_AchMenu = menu_create("\wPasiekimai", "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])
{
CmdAch(iPlayer);
}
else
{
CmdAch(iPlayer);
}
}
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, RED, "%s ^4%s ^1Sėkmingai atrakino ^4%s ^1pasiekimą ir gavo^3 500 ^1taškų!", prefix, szName, AchName[EXECUTION])
set_user_points(iKiller, get_user_points(iKiller) + 500);
}
if(is_user_alive(iKiller) && get_user_team(iKiller) != get_user_team(iVictim))
{
Achievement[iKiller][MURDER]++
if(Achievement[iKiller][MURDER] == AchRequirement[MURDER])
{
ColorChat(0, RED, "%s ^4%s ^1Sėkmingai atrakino ^4%s ^1pasiekimą ir gavo^3 1000 ^1taškų!", prefix, szName, AchName[MURDER])
set_user_points(iKiller, get_user_points(iKiller) + 1000);
}
}
if(get_user_health(iKiller) == 1)
{
Achievement[iKiller][ONEHPHERO]++
if(Achievement[iKiller][ONEHPHERO] == AchRequirement[ONEHPHERO])
{
ColorChat(0, RED, "%s ^4%s ^1Sėkmingai atrakino ^4%s ^1pasiekimą ir gavo^3 2000 ^1taškų!", prefix, szName, AchName[ONEHPHERO])
set_user_points(iKiller, get_user_points(iKiller) + 2000);
}
}
if(read_data(3))
{
Achievement[iKiller][AIMKEY]++
if(Achievement[iKiller][AIMKEY] == AchRequirement[AIMKEY])
{
ColorChat(0, RED, "%s ^4%s ^1Sėkmingai atrakino ^4%s ^1pasiekimą ir gavo^3 1000 ^1taškų!", prefix, szName, AchName[AIMKEY])
set_user_points(iKiller, get_user_points(iKiller) + 1000);
}
if( ++Achievement[iKiller][HATTRICK] == AchRequirement[HATTRICK] ) {
ColorChat(0, RED, "%s ^4%s ^1Sėkmingai atrakino ^4%s ^1pasiekimą ir gavo^3 700 ^1taškų!", prefix, szName, AchName[HATTRICK])
set_user_points(iKiller, get_user_points(iKiller) + 700);
}
}
}
return PLUGIN_CONTINUE
}
public EventRoundStart()
{
new iPlayers[32], iNum, iPlayer, szName[33]
get_players(iPlayers, iNum, "a")
arrayset( Achievement[iPlayer][HATTRICK], 0, 33 );
g_iPlanter = 0;
g_iDefuser = 0;
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
}
return PLUGIN_CONTINUE
}
public Event_Roundend() {
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(is_user_alive(iPlayer))
{
Achievement[iPlayer][SURVIVOR]++
if(Achievement[iPlayer][SURVIVOR] == AchRequirement[SURVIVOR])
{
ColorChat(0, RED, "%s ^4%s ^1Sėkmingai atrakino ^4%s ^1pasiekimą ir gavo^3 1000 ^1taškų!", prefix, szName, AchName[SURVIVOR])
set_user_points(iPlayer, get_user_points(iPlayer) + 1000);
}
}
}
Save_MySql(iPlayer)
return PLUGIN_CONTINUE
}
//NEW
public EventBombExploded( )
{
new szName[33];
get_user_name(g_iPlanter, szName, charsmax(szName))
if( is_user_connected( g_iPlanter ) )
{
Achievement[g_iPlanter][PLANT]++;
if(Achievement[g_iPlanter][PLANT] == AchRequirement[PLANT])
{
ColorChat(0, RED, "%s ^4%s ^1Sėkmingai atrakino ^4%s ^1pasiekimą ir gavo^3 300 ^1taškų!", prefix, szName, AchName[PLANT])
set_user_points(g_iPlanter, get_user_points(g_iPlanter) + 300);
}
}
}
public EventBombDefused( )
{
new szName[33];
get_user_name(g_iDefuser, szName, charsmax(szName))
if( is_user_alive( g_iDefuser ) ) {
Achievement[g_iDefuser][PLANT]++;
if(Achievement[g_iDefuser][RITE] == AchRequirement[RITE])
{
ColorChat(0, RED, "%s ^4%s ^1Sėkmingai atrakino ^4%s ^1pasiekimą ir gavo^3 300 ^1taškų!", prefix, szName, AchName[RITE])
set_user_points(g_iDefuser, get_user_points(g_iDefuser) + 300);
}
Achievement[g_iPlanter][DEFUSE]++;
if(Achievement[g_iPlanter][DEFUSE] == AchRequirement[DEFUSE])
{
ColorChat(0, RED, "%s ^4%s ^1Sėkmingai atrakino ^4%s ^1pasiekimą ir gavo^3 1200 ^1taškų!", prefix, szName, AchName[DEFUSE])
set_user_points(g_iDefuser, get_user_points(g_iDefuser) + 1200);
}
}
}
public EventPlantTheBomb( )
{
new szName[33];
get_user_name(g_iPlanter, szName, charsmax(szName))
if( get_playersnum( ) < 2 ) return;
if( is_user_connected( g_iPlanter ) )
{
Achievement[g_iPlanter][BOOMALA]++;
if(Achievement[g_iPlanter][BOOMALA] == AchRequirement[BOOMALA])
{
ColorChat(0, RED, "%s ^4%s ^1Sėkmingai atrakino ^4%s ^1pasiekimą ir gavo^3 1200 ^1taškų!", prefix, szName, AchName[BOOMALA])
set_user_points(g_iPlanter, get_user_points(g_iPlanter) + 1200);
}
}
}
public EventSpray( )
{
new sprayer = read_data( 2 )
new szName[33];
get_user_name(sprayer, szName, charsmax(szName))
Achievement[sprayer][DAILININKAS]++;
if(Achievement[sprayer][DAILININKAS] == AchRequirement[DAILININKAS])
{
ColorChat(0, RED, "%s ^4%s ^1Sėkmingai atrakino ^4%s ^1pasiekimą ir gavo^3 400 ^1taškų!", prefix, szName, AchName[DAILININKAS])
set_user_points(sprayer, get_user_points(sprayer) + 400);
}
}
///////////////////////////////////////////////////
////////// 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), murder INT(11), survivor INT(11), aimkey INT(11), execution INT(11), onehphero INT(11), plant INT(11), rite INT(11), boomala INT(11), defuse INT(11), dailininkas INT(11), hattrick INT(11))")
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`, `murder`, `survivor`, `aimkey`, `execution`, `onehphero`, `plant`, `rite`, `boomala`, `defuse`, `dailininkas`, `hattrick`)VALUES ('%s', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0')", szSteamId)
SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
}
else
{
Achievement[iPlayer][MURDER] = SQL_ReadResult(Query, 1)
Achievement[iPlayer][SURVIVOR] = SQL_ReadResult(Query, 2)
Achievement[iPlayer][AIMKEY] = SQL_ReadResult(Query, 3)
Achievement[iPlayer][EXECUTION] = SQL_ReadResult(Query, 4)
Achievement[iPlayer][ONEHPHERO] = SQL_ReadResult(Query, 5)
Achievement[iPlayer][PLANT] = SQL_ReadResult(Query, 6)
Achievement[iPlayer][RITE] = SQL_ReadResult(Query, 7)
Achievement[iPlayer][BOOMALA] = SQL_ReadResult(Query, 8)
Achievement[iPlayer][DEFUSE] = SQL_ReadResult(Query, 9)
Achievement[iPlayer][DAILININKAS] = SQL_ReadResult(Query, 10)
Achievement[iPlayer][HATTRICK] = SQL_ReadResult(Query, 11)
}
return PLUGIN_HANDLED
}
public Save_MySql(iPlayer)
{
new szSteamId[32], szTemp[512], szTemp2[512]
get_user_authid(iPlayer, szSteamId, charsmax(szSteamId))
format(szTemp,charsmax(szTemp),"UPDATE `achievements` SET `murder` = '%d', `survivor` = '%d', `aimkey` = '%d', `execution` = '%d', `onehphero` = '%d' WHERE `achievements`.`steamid` = '%s';", Achievement[iPlayer][MURDER], Achievement[iPlayer][SURVIVOR], Achievement[iPlayer][AIMKEY], Achievement[iPlayer][EXECUTION], Achievement[iPlayer][ONEHPHERO], szSteamId)
format(szTemp2,charsmax(szTemp2),"UPDATE `achievements` SET `plant` = '%d', `rite` = '%d', `boomala` = '%d', `defuse` = '%d', `dailininkas` = '%d', `hattrick` = '%d' WHERE `achievements`.`steamid` = '%s';", Achievement[iPlayer][PLANT], Achievement[iPlayer][RITE], Achievement[iPlayer][BOOMALA], Achievement[iPlayer][DEFUSE], Achievement[iPlayer][DAILININKAS], Achievement[iPlayer][HATTRICK], szSteamId)
SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp2)
}
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 }
*/
|