Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Köszönet Mike-nak és R_Hehl-nek az ELO Rankrendszerért: https://forums.alliedmods.net/showpost.php?p=728645&postcount=1
- mforce-nak és Akosch:.-nak a segítségért. :)*/
- /*
- v1.2.0 - Rankból olvas [csstats]
- v1.1.0 - sql.cfg-ből olvas SQL adatokat, chat rendszer bekerült.
- v1.0.0 - Alap rendszer elkészítése.
- */
- #include <amxmodx>
- #include <amxmisc>
- #include <csstats>
- #include <colorchat>
- #include <sqlx>
- enum _:DATA
- {
- Cht_Prefix[32],
- Name[32],
- Min_ELO,
- Max_ELO
- }
- new const g_Ranks[19][DATA] = {
- {"Unranked", "Unranked", -1, 0},
- {"Silver I", "Silver I", 0, 199},
- {"Silver II", "Silver II", 200, 399},
- {"Silver III", "Silver III", 400, 799},
- {"Silver IV", "Silver IV", 800, 1199},
- {"SE", "Silver Elite", 1200, 1599},
- {"SEM", "Silver Elite Master", 1600, 1999},
- {"Nova I", "Gold Nova I", 2000, 2399},
- {"Nova II", "Gold Nova II", 2400, 2799},
- {"Nova III", "Gold Nova III", 2800, 3199},
- {"Nova Master", "Gold Nova Master", 3200, 3599},
- {"Kala", "Master Guardian I", 3600, 3999},
- {"Kala II", "Master Guardian II", 4000, 4499},
- {"Kereszt Kala", "Master Guardian Elite", 4500, 4999},
- {"Sheriff", "Distinguished Master Guardian", 5000, 5999},
- {"Sas", "Legendary Eagle", 6000, 6999},
- {"Sas II", "Legendary Eagle Master", 7000, 7999},
- {"Supreme", "Supreme Master First Class", 8000, 9999},
- {"Global", "The Global Elite", 10000, 0}
- }
- #define GetBit(%1,%2) (%1 & (1 << (%2 & 31)))
- #define SetBit(%1,%2) %1 |= (1 << (%2 & 31))
- #define ResetBit(%1,%2) %1 &= ~(1 << (%2 & 31))
- new bitadmin, bitelo
- new const SQL_INFO[4][32]
- new Handle:g_SqlTuple
- new const Prefix[] = {"ELO"}
- new cvar_kValue, cvar_Advert
- enum _:P_DATA
- {
- Rank,
- Rating,
- Kills,
- Deaths,
- SessionRating,
- SessionKills,
- SessionDeaths,
- Name[64],
- AuthId[32],
- bool:Notify
- }
- new g_PlayerDatas[33][P_DATA]
- new bool:roundend
- enum _:TOP
- {
- Name[32],
- Kills,
- Deaths,
- Rating
- }
- new const g_Top10[10][TOP]
- public plugin_init() {
- register_plugin("ELO Stats", "1.1.0", "LyleChriss")
- cvar_kValue = register_cvar("amx_elo_k", "16.0")
- cvar_Advert = register_cvar("amx_elo_ads", "60.0")
- // Rank
- register_clcmd("say elo", "SQL_Rank")
- register_clcmd("say .elo", "SQL_Rank")
- register_clcmd("say !elo", "SQL_Rank")
- register_clcmd("say /elo", "SQL_Rank")
- // Top10
- register_clcmd("say top10", "SQL_Top10")
- register_clcmd("say .top10", "SQL_Top10")
- register_clcmd("say !top10", "SQL_Top10")
- register_clcmd("say /top10", "SQL_Top10")
- // Session Stats
- register_clcmd("say session", "SessionStats")
- register_clcmd("say .session", "SessionStats")
- register_clcmd("say !session", "SessionStats")
- register_clcmd("say /session", "SessionStats")
- // ELO Notify
- register_clcmd("say notify", "Notification")
- register_clcmd("say .notify", "Notification")
- register_clcmd("say !notify", "Notification")
- register_clcmd("say /notify", "Notification")
- register_event("DeathMsg", "eDeathMsg", "a")
- register_logevent("logevent_round_start", 2, "1=Round_Start")
- register_logevent("logevent_round_end", 2, "1=Round_End")
- //Chat cuccok
- register_clcmd("say", "HandlerSay");
- register_clcmd("say_team", "HandlerSayTeam");
- register_event("ResetHUD", "eResetHUD", "be");
- if(get_pcvar_float(cvar_Advert) > 0.0)
- set_task(get_pcvar_float(cvar_Advert), "Advertise", _, _, _, "b")
- get_cvar_string("amx_sql_host", SQL_INFO[0], charsmax(SQL_INFO[]))
- get_cvar_string("amx_sql_user", SQL_INFO[1], charsmax(SQL_INFO[]))
- get_cvar_string("amx_sql_pass", SQL_INFO[2], charsmax(SQL_INFO[]))
- get_cvar_string("amx_sql_db", SQL_INFO[3], charsmax(SQL_INFO[]))
- }
- public eDeathMsg()
- {
- ResetBit(bitelo, read_data(2))
- if(!roundend)
- {
- new attacker = read_data(1)
- new victim = read_data(2)
- if(attacker != victim)
- {
- new Float:rating = float(g_PlayerDatas[victim][Rating]-g_PlayerDatas[attacker][Rating])
- new Float:prob = 1.0/(power(floatround(rating)/400, 10)+1)
- new diff = floatround(get_pcvar_float(cvar_kValue)*(1.0-prob))
- g_PlayerDatas[victim][Rating] -= diff
- g_PlayerDatas[attacker][Rating] += diff
- g_PlayerDatas[victim][SessionRating] -= diff
- g_PlayerDatas[attacker][SessionRating] += diff
- g_PlayerDatas[victim][Deaths]++
- g_PlayerDatas[attacker][Kills]++
- g_PlayerDatas[victim][SessionDeaths]++
- g_PlayerDatas[attacker][SessionKills]++
- Update_SQL(victim)
- Update_SQL(attacker)
- new victName[32]; get_user_name(victim, victName, charsmax(victName))
- new attaName[32]; get_user_name(attacker, attaName, charsmax(attaName))
- if(g_PlayerDatas[attacker][Notify])
- {
- ColorChat(attacker, NORMAL, "^4[%s]^1 Megölted (^4%i^1) ^3%s^1-t (^4%i^1), ezért kaptál ^4%i ^1pontot.", Prefix, g_PlayerDatas[attacker][Rating], victName, g_PlayerDatas[victim][Rating], diff)
- }
- if(g_PlayerDatas[victim][Notify])
- {
- ColorChat(victim, NORMAL, "^4[%s]^1 Megölt téged (^4%i^1) ^3%s^1 (^4%i^1), ezért vesztettél ^4%i ^1pontot.", Prefix, g_PlayerDatas[victim][Rating], victName, g_PlayerDatas[attacker][Rating], diff)
- }
- }
- }
- }
- public logevent_round_start() roundend=false
- public logevent_round_end() roundend=true
- public eResetHUD(id, level, cid) SetBit(bitelo, id)
- public plugin_cfg()
- {
- g_SqlTuple = SQL_MakeDbTuple(SQL_INFO[0],SQL_INFO[1],SQL_INFO[2],SQL_INFO[3])
- SQL_ThreadQuery(g_SqlTuple,"createTableThread", "CREATE TABLE IF NOT EXISTS `elo_ranking` (authid varchar(32) NOT NULL, name varchar(64) NOT NULL, rating int(8) NOT NULL, kills int(8) NOT NULL, deaths int(8) NOT NULL, notify int(2) NOT NULL)")
- }
- public createTableThread(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime)
- {
- if(FailState == TQUERY_CONNECT_FAILED)
- set_fail_state("Nem lehet csatlakozni az adatbazishoz.")
- else if(FailState == TQUERY_QUERY_FAILED)
- set_fail_state("Query Error")
- if(Errcode)
- log_amx("Hiba: %s",Error)
- }
- public client_putinserver(id)
- {
- arrayset(g_PlayerDatas[id], 0, 7)
- g_PlayerDatas[id][SessionRating] = 1600
- g_PlayerDatas[id][Rating] = -1
- g_PlayerDatas[id][Name][0] = EOS
- g_PlayerDatas[id][AuthId][0] = EOS
- g_PlayerDatas[id][Notify] = true
- if(get_user_flags(id) & ADMIN_CHAT) SetBit(bitadmin, id)
- else ResetBit(bitadmin, id)
- if(!is_user_bot(id) && !is_user_hltv(id))
- {
- get_user_name(id, g_PlayerDatas[id][Name], charsmax(g_PlayerDatas[][Name]))
- get_user_authid(id, g_PlayerDatas[id][AuthId], charsmax(g_PlayerDatas[][AuthId]))
- if(contain(g_PlayerDatas[id][AuthId], "_ID_LAN") != -1) get_user_ip(id, g_PlayerDatas[id][AuthId], charsmax(g_PlayerDatas[][AuthId]), 1)
- new szStats[8], szBHits[8]
- get_user_stats(id, szStats, szBHits)
- g_PlayerDatas[id][Kills] = szStats[0]
- g_PlayerDatas[id][Deaths] = szStats[1]
- Load_SQL(id)
- }
- }
- public client_infochanged(id)
- {
- if(!is_user_connected(id))
- return PLUGIN_HANDLED
- get_user_info(id, "name", g_PlayerDatas[id][Name], charsmax(g_PlayerDatas[][Name]))
- return PLUGIN_CONTINUE
- }
- public client_disconnect(id)
- {
- ResetBit(bitelo, id)
- new szStats[8], szBHits[8]
- get_user_stats(id, szStats, szBHits)
- g_PlayerDatas[id][Kills] = szStats[0]
- g_PlayerDatas[id][Deaths] = szStats[1]
- if(!is_user_bot(id) && !is_user_hltv(id)) Update_SQL(id)
- arrayset(g_PlayerDatas[id], 0, 7)
- g_PlayerDatas[id][SessionRating] = 1600
- g_PlayerDatas[id][Rating] = -1
- g_PlayerDatas[id][Name][0] = EOS
- g_PlayerDatas[id][AuthId][0] = EOS
- g_PlayerDatas[id][Notify] = true
- }
- public Load_SQL(id)
- {
- static Query[512]
- new Data[1]; Data[0] = id
- formatex(Query, charsmax(Query), "SELECT * FROM `elo_ranking` WHERE authid = ^"%s^";", g_PlayerDatas[id][AuthId])
- SQL_ThreadQuery(g_SqlTuple, "QuerySelectData", Query, Data, 1)
- }
- public QuerySelectData(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime)
- {
- if(FailState == TQUERY_CONNECT_FAILED || FailState == TQUERY_QUERY_FAILED)
- {
- log_amx("%s", Error)
- return
- }
- else
- {
- new id = Data[0];
- if(SQL_NumRows(Query) > 0)
- {
- g_PlayerDatas[id][Kills] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "kills"))
- g_PlayerDatas[id][Deaths] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "deaths"))
- g_PlayerDatas[id][Rating] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "rating"))
- g_PlayerDatas[id][Notify] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "notify"))
- }
- else
- {
- Save_SQL(id)
- }
- }
- }
- public Save_SQL(id)
- {
- static Query[512]
- formatex(Query, charsmax(Query), "INSERT INTO `elo_ranking` (`authid`, `name`, `rating`, `kills`, `deaths`, `notify`) VALUES (^"%s^", ^"%s^", ^"1600^", ^"0^", ^"0v, ^"0^")", g_PlayerDatas[id][AuthId], g_PlayerDatas[id][Name])
- SQL_ThreadQuery(g_SqlTuple, "QuerySetData", Query)
- }
- public Update_SQL(id)
- {
- static Query[512]
- formatex(Query, charsmax(Query), "UPDATE `elo_ranking` SET `name` = ^"%s^", `rating` = %d, `kills` = %d, `deaths` = %d, `notify` = %d WHERE `authid` = ^"%s^";", g_PlayerDatas[id][Name], g_PlayerDatas[id][Rating], g_PlayerDatas[id][Kills], g_PlayerDatas[id][Deaths], g_PlayerDatas[id][Notify], g_PlayerDatas[id][AuthId])
- SQL_ThreadQuery(g_SqlTuple, "QuerySetData", Query)
- }
- public QuerySetData(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime)
- {
- if(FailState == TQUERY_CONNECT_FAILED || FailState == TQUERY_QUERY_FAILED)
- {
- log_amx("%s", Error)
- return
- }
- }
- public SQL_Rank(id)
- {
- static Query[512]
- new Data[1]; Data[0] = id
- formatex(Query, charsmax(Query), "SELECT COUNT(*) FROM `elo_ranking` WHERE `rating`>%i", g_PlayerDatas[id][Rating])
- SQL_ThreadQuery(g_SqlTuple, "QueryRank", Query, Data, 1)
- }
- public QueryRank(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime)
- {
- if(FailState == TQUERY_CONNECT_FAILED || FailState == TQUERY_QUERY_FAILED)
- {
- log_amx("%s", Error)
- return
- }
- else
- {
- g_PlayerDatas[Data[0]][Rank] = SQL_ReadResult(Query, P_DATA)
- g_PlayerDatas[Data[0]][Rank] ++
- }
- SQL_ThreadQuery(Query, "QueryCount", "SELECT COUNT(*) FROM `elo_ranking`", Data, 1)
- }
- public QueryCount(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime)
- {
- if(FailState == TQUERY_CONNECT_FAILED || FailState == TQUERY_QUERY_FAILED)
- {
- log_amx("%s", Error)
- return
- }
- else
- {
- new id = Data[0]
- new Float:kpd = g_PlayerDatas[id][Deaths]==0?1.0:float(g_PlayerDatas[id][Kills]/g_PlayerDatas[id][Deaths])
- ColorChat(id, NORMAL, "^4[%s] ^1ELO pontjaid: ^4%i ^1| Rangod: ^4%s ^1| Rankod: ^4%i ^1| KPD: ^4%.2f", Prefix, g_PlayerDatas[id][Rating], get_user_rang(g_PlayerDatas[id][Rating], 0, 0), g_PlayerDatas[id][Rank], kpd)
- }
- }
- public SQL_Top10(id)
- {
- new Data[1]; Data[0] = id
- SQL_ThreadQuery(g_SqlTuple, "QueryTop10", "SELECT `name`, `rating` FROM `elo_ranking` ORDER BY `rating` DESC LIMIT 10", Data, 1)
- }
- public QueryTop10(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime)
- {
- if(FailState == TQUERY_CONNECT_FAILED || FailState == TQUERY_QUERY_FAILED)
- {
- log_amx("%s", Error)
- return
- }
- else
- {
- new i
- while(SQL_MoreResults(Query))
- {
- SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "name"), g_Top10[i][Name], charsmax(g_Top10[][Name]))
- g_Top10[i][Kills] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "kills"))
- g_Top10[i][Deaths] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "deaths"))
- g_Top10[i][Rating] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "rating"))
- i++
- }
- ShowTopMOTD(Data[0])
- }
- }
- public ShowTopMOTD(id)
- {
- static Menu[1024]
- new Len
- Len += formatex(Menu[Len], charsmax(Menu) - Len, "<center><table border=^"1^">")
- Len += formatex(Menu[Len], charsmax(Menu) - Len, "<body bgcolor=#000000><table style=^"color: #00FFFF^">")
- Len += formatex(Menu[Len], charsmax(Menu) - Len, "<td>Név</td><td>Rang</td><td>Ölések</td><td>Halálok</td><td>Pontszám</td>")
- for(new i; i< 10; i++)
- Len += formatex(Menu[Len], charsmax(Menu) - Len, "<tr><td>%s</td><td>%s</td><td>%i</td><td>%i</td><td>%i</td></tr>", g_Top10[i][Name], get_user_rang(g_Top10[i][Rating], 0, 0), g_Top10[i][Kills], g_Top10[i][Deaths], g_Top10[i][Rating])
- Len += formatex(Menu[Len], charsmax(Menu) - Len, "</table></center>")
- show_motd(id, Menu, "ELO Rankrendszer | TOP10")
- }
- public SessionStats(id) ColorChat(id, NORMAL, "^4[%s]^3(Részeredmények) ^1ELO pontjaid: ^4%i ^1| Rangod: ^4%s ^1| Ölések: ^4%i ^1| Halálok: ^4%i", Prefix, g_PlayerDatas[id][SessionRating], get_user_rang(g_PlayerDatas[id][SessionRating], 0, 0), g_PlayerDatas[id][SessionKills], g_PlayerDatas[id][SessionDeaths])
- public Notification(id)
- {
- if(g_PlayerDatas[id][Notify])
- {
- ColorChat(id, NORMAL, "^4[%s] ^3Kikapcsoltad ^1az értesítéseket! Bekapcsolásukhoz újra írd be a parancsot.", Prefix)
- g_PlayerDatas[id][Notify] = false
- }
- else
- {
- ColorChat(id, NORMAL, "^4[%s] ^3Bekapcsoltad ^1az értesítéseket! Kikapcsolásukhoz újra írd be a parancsot.", Prefix)
- g_PlayerDatas[id][Notify] = true
- }
- }
- public Advertise()
- {
- switch(random_num(0, 3))
- {
- case 0: ColorChat(0, NORMAL, "^4[%s] ^1Rankod megnézéséhez írd be: ^4/elo", Prefix)
- case 1: ColorChat(0, NORMAL, "^4[%s] ^1Szeretnéd tudni, kik a legjobbak? Írd be: ^4/top10", Prefix)
- case 2: ColorChat(0, NORMAL, "^4[%s] ^1Tudd meg, hogyan teljesítesz a mapon! Írd be: ^4/session", Prefix)
- case 3: ColorChat(0, NORMAL, "^4[%s] ^1Ki szeretnéd kapcsolni az értesítéseket? Írd be: ^4/notify", Prefix)
- }
- }
- public HandlerSay(id) return uzenetformazas(id, false)
- public HandlerSayTeam(id) return uzenetformazas(id, true)
- uzenetformazas(id, bool:csapat)
- {
- #define MAX_BIT 180
- static uzenet[MAX_BIT], stringkonvertalas[charsmax(uzenet) * 2 + 1];
- read_args(uzenet, charsmax(uzenet));
- remove_quotes(uzenet);
- if(uzenet[0] == EOS || uzenet[0] == '/' || equal(uzenet, " "))
- return PLUGIN_HANDLED_MAIN;
- static fullos, tagek[MAX_BIT], team_lekeres, sTeam[16];
- team_lekeres = get_user_team(id, sTeam, charsmax(sTeam));
- switch(team_lekeres)
- {
- case 1: fullos = formatex(tagek, charsmax(tagek), "%s%s", GetBit(bitelo, id) ? "^1" : "^1*Halott* ", csapat ? "^1[T] " : "");
- case 2: fullos = formatex(tagek, charsmax(tagek), "%s%s", GetBit(bitelo, id) ? "^1" : "^1*Halott* ", csapat ? "^1[CT] " : "");
- default:fullos = formatex(tagek, charsmax(tagek), "^1*Spec* ");
- }
- if(get_user_flags(id)&ADMIN_IMMUNITY)
- fullos += formatex(tagek[fullos], charsmax(tagek)-fullos, "^4[Tulaj]")
- else if(get_user_flags(id)&ADMIN_LEVEL_G)
- fullos += formatex(tagek[fullos], charsmax(tagek)-fullos, "^4[FĹ‘admin]")
- else if((get_user_flags(id)&ADMIN_BAN) && (get_user_flags(id)&ADMIN_LEVEL_F))
- fullos += formatex(tagek[fullos], charsmax(tagek)-fullos, "^4[Admin+VIP]")
- else if(get_user_flags(id)&ADMIN_BAN)
- fullos += formatex(tagek[fullos], charsmax(tagek)-fullos, "^4[Admin]")
- else if(get_user_flags(id)&ADMIN_LEVEL_F)
- fullos += formatex(tagek[fullos], charsmax(tagek)-fullos, "^4[VIP]")
- fullos += formatex(tagek[fullos], charsmax(tagek)-fullos, "^4[%s]", get_user_rang(g_PlayerDatas[id][Rating], 0, 0))
- if(is_user_admin(id)) fullos += formatex(tagek[fullos], charsmax(tagek) - fullos, "^3%%s1^1 : ^4%%s2");
- else formatex(tagek[fullos], charsmax(tagek) - fullos, "^3%%s1^1 : %%s2");
- stringkonvertalas = uzenet;
- replace_all( stringkonvertalas, charsmax( stringkonvertalas ), "", " " );
- replace_all( stringkonvertalas, charsmax( stringkonvertalas ), "", " " );
- static bitlimit; bitlimit = MAX_BIT;
- while(fullos + strlen(stringkonvertalas) > MAX_BIT) stringkonvertalas[bitlimit -= 10] = 0;
- static players[32], pcount; get_players(players, pcount, "c");
- switch(csapat)
- {
- case true:
- {
- for(new i; i < pcount; i++)
- {
- if(GetBit(bitadmin, players[i]) || (GetBit(bitelo, id) == GetBit(bitelo, players[i]) && team_lekeres == get_user_team(players[i])))
- PrintChat(players[i], id, tagek, stringkonvertalas);
- }
- }
- case false:
- {
- for(new i; i < pcount; i++)
- PrintChat(players[i], id, tagek, stringkonvertalas);
- }
- }
- static sAuthId[25], sName[32];
- get_user_name(id, sName, charsmax(sName));
- get_user_authid(id, sAuthId, charsmax(sAuthId));
- log_message("^"%s<%d><%s><%s>^" %s ^"%s^"", sName, get_user_userid(id), sAuthId, sTeam, csapat ? "say_team" : "say" , stringkonvertalas);
- return PLUGIN_HANDLED;
- }
- PrintChat(iReceiver, iSender, const tagek[], const uzenet[])
- {
- message_begin(MSG_ONE, 76, .player=iReceiver);
- write_byte(iSender);
- write_string(tagek);
- write_string("");
- write_string(uzenet);
- message_end();
- }
- public plugin_end() SQL_FreeHandle(g_SqlTuple)
- stock get_user_rang(Usr_Rating, diff, minus)
- {
- for(new i; i<sizeof(g_Ranks); i++)
- {
- if(i == charsmax(g_Ranks))
- {
- if(minus == 1) return g_Ranks[i-diff][Cht_Prefix]
- else return g_Ranks[i+diff][Cht_Prefix]
- }
- if(g_Ranks[i][Min_ELO] < Usr_Rating && g_Ranks[i][Max_ELO] > Usr_Rating)
- {
- if(minus == 1) return g_Ranks[i-diff][Cht_Prefix]
- else return g_Ranks[i+diff][Cht_Prefix]
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment