Surprise Ascot!
Join Date: May 2010
Location: Malaysia
|
03-31-2015
, 17:35
Re: [ZP43Fix5a] Addon: Stats, ExpMod & Ranking System.
|
#6
|
Quote:
Originally Posted by wicho
to 5.0 but not tested..
PHP Code:
#include <amxmodx> #include <engine> #include <hamsandwich> #include <nvault_util> #include <geoip> #include <zp50_core> #include <zp50_class_nemesis> #include <zp50_class_survivor> #include <zp50_ammopacks>
new const szRanks[][] = { "Private (0)", // 0 "Private 1st Class (1)", // 1 "Corporal (2)", // 2 "Sergeant (3)", // 3 "Staff Sergeant (4)", // 4 "Sergeant 1st Class (5)", // 5 "Master Sergeant (6)", // 6 "Sergeant Major (7)", // 7 "2nd Lieutenant (8)", // 8 "1st Lieutenant (9)", // 9 "Captain (10)", // 10 "Major (11)", // 11 "Lieutenant Colonel (12)", // 12 "Colonel (13)", // 13 "Brigadier General (14)", // 14 "Major General (15)", // 15 "Lieutenant General (16)", // 16 "General (17)", // 17 "General of the Army (18)", // 18 "Otai (19)" //19 max level only cheater may achieve this rank }
new const iEXP[] = { 0, // 0 50, // 1 100, // 2 200, // 3 400, // 4 800, // 5 1600, // 6 3200, // 7 6400, // 8 12800, // 9 25600, // 10 51200, // 11 102400, // 12 204800, // 13 409600, // 14 819200, // 15 1638400, // 16 3276800, // 17 6553600, // 18 9999999 //19 max level only cheater may achieve this rank }
enum _:Player_Data { Data_Steamid[35], Data_Name[32], Data_Exp, Data_Kills, Data_Deaths, Data_HeadShot, Data_Knife, Data_Nade, Data_NemKills, Data_SurKills, Data_PlayTime, Data_Level, Data_Country[46], Data_Rank, MAX_PLAYER_DATA }
enum _:Forward_Data { Forward_Login, Forward_Levelup, Forward_Result, MAX_FORWARD_DATA }
#define flag_get(%1,%2) (%1 & (1 << (%2 & 31))) #define flag_set(%1,%2) %1 |= (1 << (%2 & 31)) #define flag_unset(%1,%2) %1 &= ~(1 << (%2 & 31))
new g_IsConnected
new iVaultHandle, gData[33][MAX_PLAYER_DATA], bool:bIsLoaded[33], iHudStats, Float:fLastHud[33], szMotd[1536], gForward[MAX_FORWARD_DATA], Float:fLastCmd, iTotalEntries const iExpKill = 3 const iExpHeadShot = 3 const iExpKnife = 5 const iExpGrenade = 8 const iExpNemKill = 20 const iExpSurKill = 15 const Float:HUD_STATS_X = -1.0 const Float:HUD_STATS_Y = 0.8 new const szVaultName[] = "zpexpmod" #define PLUGIN_VERSION "0.0.1" #define CVAR_EXP_VERSION "zp_simple_stats"
//Uncomment this to update motd.txt on map loaded to show global top-10 players. //#define UPDATE_MOTD
//Uncomment this to enable nvault prune. #define PRUNE_DATABASE
#if defined UPDATE_MOTD new const szFileMotd[] = "motd.txt" #endif
#if defined PRUNE_DATABASE const iExpiredDays = 15 #endif
public plugin_natives() { register_native("xp_get_user_exp","_get_user_exp",1) register_native("xp_set_user_exp","_set_user_exp",1) register_native("xp_get_user_playtime","_get_user_playtime",1) register_native("xp_set_user_playtime","_set_user_playtime",1) register_native("xp_get_user_level","_get_user_level",1) register_native("xp_set_user_level","_set_user_level",1) register_native("xp_get_user_deaths","_get_user_deaths",1) register_native("xp_set_user_deaths","_set_user_deaths",1) register_native("xp_get_user_frags","_get_user_frags",1) register_native("xp_set_user_frags","_set_user_frags",1) register_native("xp_get_user_headshot","_get_user_headshot",1) register_native("xp_set_user_headshot","_set_user_headshot",1) register_native("xp_get_user_knife","_get_user_knife",1) register_native("xp_set_user_knife","_set_user_knife",1) register_native("xp_get_user_nade","_get_user_nade",1) register_native("xp_set_user_nade","_set_user_nade",1) register_native("xp_get_user_nemesis","_get_user_nemesis",1) register_native("xp_set_user_nemesis","_set_user_nemesis",1) register_native("xp_get_user_survivor","_get_user_survivor",1) register_native("xp_set_user_survivor","_set_user_survivor",1) register_native("xp_reset_user_data","_reset_user_data",1) register_native("xp_get_user_rank","_get_user_rank",1) }
public plugin_init() { register_plugin("ZP Simple Stats", PLUGIN_VERSION, "wbyokomo") register_event("DeathMsg", "OnDeathMsg", "a") //use deathmsg easy to trace weapon and hitplace iHudStats = CreateHudSyncObj() RegisterHam(Ham_Player_PreThink, "player", "OnPlayerPreThink") //no need for csbot register_clcmd("say /stats" , "CmdStats") register_clcmd("say /rank", "CmdShowRank") register_clcmd("say /top15", "CmdTopExpGlobal") register_clcmd("say /top10", "CmdTopExpGlobal") register_clcmd("say /globaltop", "CmdTopExpGlobal") register_clcmd("say /onlinetop", "CmdTopExpOnline") register_clcmd("say_team /stats" , "CmdStats") register_clcmd("say_team /rank", "CmdShowRank") register_clcmd("say_team /top15", "CmdTopExpGlobal") register_clcmd("say_team /top10", "CmdTopExpGlobal") register_clcmd("say_team /globaltop", "CmdTopExpGlobal") register_clcmd("say_team /onlinetop", "CmdTopExpOnline") gForward[Forward_Login] = CreateMultiForward("xp_user_login", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL) //xp_user_login(player, level, exp) gForward[Forward_Levelup] = CreateMultiForward("xp_user_levelup", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL) //xp_user_levelup(player, level, exp) register_cvar(CVAR_EXP_VERSION, PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY) set_cvar_string(CVAR_EXP_VERSION, PLUGIN_VERSION) }
public plugin_cfg() { iVaultHandle = nvault_open(szVaultName) if(iVaultHandle == INVALID_HANDLE) { set_fail_state("Error opening nVault file [%s]", szVaultName) } else { server_print("Database [%s] successfully loaded...", szVaultName) #if defined PRUNE_DATABASE nvault_prune(iVaultHandle, 0, get_systime() - (86400 * iExpiredDays)) #endif FormatGlobalTopTen() #if defined UPDATE_MOTD if(file_exists(szFileMotd)) { if(delete_file(szFileMotd)) { if(write_file(szFileMotd, szMotd, -1)) server_print("File [%s] has been updated...", szFileMotd); } } #endif } set_task(0.6, "TurnOfDefHud") }
public TurnOfDefHud() { if(cvar_exists("zp_hud_display")) set_cvar_num("zp_hud_display", 0); else set_fail_state("This plugin compatible only with ZP4.3Fix5a. Download 'zp_plugin_43_patched.zip' at http://forums.alliedmods.net/showthread.php?t=72505"); }
public plugin_end() { nvault_close(iVaultHandle) }
public client_putinserver(id) { get_user_authid(id, gData[id][Data_Steamid], 34) LoadPlayerData(id) get_user_name(id, gData[id][Data_Name], 31) new szIp[32]; get_user_ip(id, szIp, 31, 1); geoip_country_ex(szIp, gData[id][Data_Country], 45) if(equali(gData[id][Data_Country],"")) copy(gData[id][Data_Country], 45, "Unknown"); gData[id][Data_Rank] = -1 flag_set(g_IsConnected, id) }
public client_disconnect(id) { if(bIsLoaded[id]) { gData[id][Data_PlayTime] += get_user_time(id) SavePlayerData(id) } else { log_to_file("exp_log.log", "Player: %s | Steamid: %s -- failed to save data.", gData[id][Data_Name], gData[id][Data_Steamid]) } flag_unset(g_IsConnected, id) }
public client_infochanged(id) { if(flag_get(g_IsConnected, id) get_user_info(id, "name", gData[id][Data_Name], 31)); }
public CmdStats(id) { if(!flag_get(g_IsConnected, id)) return PLUGIN_HANDLED; if(!bIsLoaded[id]) { client_print(id, print_chat, "Sorry! failed to load your stats. Please rejoin the server :)") return PLUGIN_HANDLED; } new menu = menu_create("\yPlayer Stats:", "PlayerStatsMenuHandler") new szUserId[32], id2 for(id2=1;id2<=MaxClients;id2++) { if(!flag_get(g_IsConnected, id2)) continue; formatex(szUserId, charsmax(szUserId), "%d", get_user_userid(id2)) menu_additem(menu, gData[id2][Data_Name], szUserId, 0) } menu_display(id, menu, 0) return PLUGIN_HANDLED; }
public PlayerStatsMenuHandler(id, menu, item) { if(!flag_get(g_IsConnected, id)) { menu_destroy(menu) return PLUGIN_HANDLED; } if(item == MENU_EXIT) { menu_destroy(menu) return PLUGIN_HANDLED; } new szData[6], szName[64] new _access, item_callback menu_item_getinfo(menu, item, _access, szData,charsmax(szData), szName,charsmax(szName), item_callback) new userid = str_to_num(szData) new player = find_player("k", userid) if(player && flag_get(g_IsConnected, player)) { GetPlayerStats(player, id) } menu_destroy(menu) return PLUGIN_HANDLED; }
public CmdShowRank(id) { if(!flag_get(g_IsConnected, id)) return PLUGIN_HANDLED; if(!bIsLoaded[id]) { client_print(id, print_chat, "Sorry! failed to load your stats. Please rejoin the server :)") return PLUGIN_HANDLED; } static Float:ctime; ctime = get_gametime(); if(fLastCmd > ctime) { client_print(id, print_chat, "System is busy please wait for %.1f second(s).", fLastCmd-ctime) return PLUGIN_HANDLED; } fLastCmd = ctime+2.0 new iRank = SortPlayerRank(id) if(iRank == -1) client_print(id, print_chat, "Your rank is not been saved yet, please rejoin the server."); else client_print_color(0, print_team_default, "^4%s^1 rank is^4 %d^1/^4%d^1 -- Kills:^4 %d^1 Deaths:^4 %d^1 Level:^4 %d^1 EXP:^4 %d^1/^4%d", gData[id][Data_Name], iRank, iTotalEntries, gData[id][Data_Kills], gData[id][Data_Deaths], gData[id][Data_Level], gData[id][Data_Exp], iEXP[gData[id][Data_Level]+1]) return PLUGIN_HANDLED; }
public CmdTopExpGlobal(id) { if(!flag_get(g_IsConnected, id)) return PLUGIN_HANDLED; if(!bIsLoaded[id]) { client_print(id, print_chat, "Sorry! failed to load your stats. Please rejoin the server :)") return PLUGIN_HANDLED; } static Float:ctime; ctime = get_gametime(); if(fLastCmd > ctime) { client_print(id, print_chat, "System is busy please wait for %.1f second(s).", fLastCmd-ctime) return PLUGIN_HANDLED; } fLastCmd = ctime+2.0 show_motd(id, szMotd, "TOP-10 Players (GLOBAL)") return PLUGIN_HANDLED; }
public CmdTopExpOnline(id) { if(!flag_get(g_IsConnected, id)) return PLUGIN_HANDLED; if(!bIsLoaded[id]) { client_print(id, print_chat, "Sorry! failed to load your stats. Please rejoin the server :)") return PLUGIN_HANDLED; } static Float:ctime; ctime = get_gametime(); if(fLastCmd > ctime) { client_print(id, print_chat, "System is busy please wait for %.1f second(s).", fLastCmd-ctime) return PLUGIN_HANDLED; } fLastCmd = ctime+2.0 static Sort[33][2] new players[32], num, count, index get_players(players, num) for(new i = 0; i < num; i++) { index = players[i] Sort[count][0] = index Sort[count][1] = gData[index][Data_Exp] count++ } SortCustom2D(Sort, count, "CompareEXP") new y = clamp(count, 0, 10) new kindex, szMotd2[1536], len szMotd2[0] = 0 add(szMotd2, charsmax(szMotd2), "<html><style>\ body{background:#040404;font-family:Verdana, Arial, Sans-Serif;font-size:7pt;}\ .t{color:#808080;text-align:left; }\ #h{background: #0066CC url('http://onlyarg.com/foro/images/Amiral/thead.png') repeat-x;color:#E0E0E0;font-weight:bold;}\ #p{color:#D41313;}\ #n{color:#fff;}\ </style><body>\ <table cellspacing=0 width=100% class=t>") add(szMotd2, charsmax(szMotd2), "<tr><td id=h width=7%>#</td>\ <td id=h>Name</td>\ <td id=h>EXP</td>\ <td id=h>Kills</td>\ <td id=h>Deaths</td>\ <td id=h>Online</td></tr>") len = strlen(szMotd2) for(new x = 0; x < y; x++) { kindex = Sort[x][0] new iSec, szTimeFormat[32] iSec = get_user_time(kindex)+gData[kindex][Data_PlayTime] GetTimeFormat(iSec, szTimeFormat, 31) replace_all(gData[kindex][Data_Name], 31, "<", "<") replace_all(gData[kindex][Data_Name], 31, ">", ">") len += formatex(szMotd2[len], charsmax(szMotd2)-len, "<tr><td id=p>%d</td>\ <td id=n>%s</td>\ <td>%d</td>\ <td>%d</td>\ <td>%d</td>\ <td>%s</td>", (x+1), gData[kindex][Data_Name], gData[kindex][Data_Exp], gData[kindex][Data_Kills], gData[kindex][Data_Deaths], szTimeFormat) } add(szMotd2, charsmax(szMotd2), "</table></body></html>") show_motd(id, szMotd2, "TOP-10 Players (ONLINE)") return PLUGIN_HANDLED; }
public CompareEXP(elem1[], elem2[]) { if(elem1[1] > elem2[1]) return -1; else if(elem1[1] < elem2[1]) return 1; return 0; }
public OnDeathMsg() { new atk, vic, hs, szWpn[4] atk = read_data(1) vic = read_data(2) hs = read_data(3) read_data(4, szWpn, 3) if(flag_get(g_IsConnected, vic)) { gData[vic][Data_Deaths]++ } if((atk != vic) && flag_get(g_IsConnected, atk)) { gData[atk][Data_Kills]++ gData[atk][Data_Exp] += iExpKill if(hs) { gData[atk][Data_HeadShot]++ gData[atk][Data_Exp] += iExpHeadShot } if(zp_class_nemesis_get(vic)) { gData[atk][Data_NemKills]++ gData[atk][Data_Exp] += iExpNemKill } else if(zp_class_survivor_get(vic)) { gData[atk][Data_SurKills]++ gData[atk][Data_Exp] += iExpSurKill } if(szWpn[0]=='k' && szWpn[1]=='n') { gData[atk][Data_Knife]++ gData[atk][Data_Exp] += iExpKnife CheckPlayerLevel(atk) return; } if(szWpn[0]=='g' && szWpn[1]=='r') { gData[atk][Data_Nade]++ gData[atk][Data_Exp] += iExpGrenade CheckPlayerLevel(atk) return; } CheckPlayerLevel(atk) } }
public zp_fw_core_infect_post(vic, atk) { if(flag_get(g_IsConnected, vic)) { gData[vic][Data_Deaths]++ } if((atk != vic) && flag_get(g_IsConnected, atk)) { gData[atk][Data_Kills]++ gData[atk][Data_Exp] += iExpKill CheckPlayerLevel(atk) } }
public OnPlayerPreThink(id) { static Float:ctime; ctime = get_gametime(); if(fLastHud[id] > ctime) return; fLastHud[id] = ctime+1.0 if(!is_user_alive(id)) { static iSpec; iSpec = entity_get_int(id, EV_INT_iuser2); if(!is_user_alive(iSpec)) return; set_hudmessage(128, 128, 128, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.6, 0.5, -1) ShowSyncHudMsg(id, iHudStats, "SPECTATING: %s | COUNTRY: %s^nHP: %.0f | ARMOR: %.0f | PACKS: %d^nEXP: %d/%d | LEVEL: %s", gData[iSpec][Data_Name], gData[iSpec][Data_Country], entity_get_float(iSpec, EV_FL_health), entity_get_float(iSpec, EV_FL_armorvalue), zp_ammopacks_get(iSpec), gData[iSpec][Data_Exp], iEXP[gData[iSpec][Data_Level]+1], szRanks[gData[iSpec][Data_Level]]) return; } set_hudmessage(4, 128, 4, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.6, 0.5, -1) ShowSyncHudMsg(id, iHudStats, "HP: %.0f | ARMOR: %.0f | PACKS: %d^nEXP: %d/%d | LEVEL: %s^nCOUNTRY: %s", entity_get_float(id, EV_FL_health), entity_get_float(id, EV_FL_armorvalue), zp_ammopacks_get(id), gData[id][Data_Exp], iEXP[gData[id][Data_Level]+1], szRanks[gData[id][Data_Level]], gData[id][Data_Country]) }
public _get_user_exp(id) { return gData[id][Data_Exp]; }
public _set_user_exp(id, amount) { gData[id][Data_Exp] = amount }
public _get_user_playtime(id) { return gData[id][Data_PlayTime]; }
public _set_user_playtime(id, amount) { gData[id][Data_PlayTime] = amount }
public _get_user_level(id) { return gData[id][Data_Level]; }
public _set_user_level(id, amount) { gData[id][Data_Level] = amount }
public _get_user_deaths(id) { return gData[id][Data_Deaths]; }
public _set_user_deaths(id, amount) { gData[id][Data_Deaths] = amount }
public _get_user_frags(id) { return gData[id][Data_Kills]; }
public _set_user_frags(id, amount) { gData[id][Data_Kills] = amount }
public _get_user_headshot(id) { return gData[id][Data_HeadShot]; }
public _set_user_headshot(id, amount) { gData[id][Data_HeadShot] = amount }
public _get_user_knife(id) { return gData[id][Data_Knife]; }
public _set_user_knife(id, amount) { gData[id][Data_Knife] = amount }
public _get_user_nade(id) { return gData[id][Data_Nade]; }
public _set_user_nade(id, amount) { gData[id][Data_Nade] = amount }
public _get_user_nemesis(id) { return gData[id][Data_NemKills]; }
public _set_user_nemesis(id, amount) { gData[id][Data_NemKills] = amount }
public _get_user_survivor(id) { return gData[id][Data_SurKills]; }
public _set_user_survivor(id, amount) { gData[id][Data_SurKills] = amount }
public _reset_user_data(id) { gData[id][Data_Exp] = 0 gData[id][Data_Kills] = 0 gData[id][Data_Deaths] = 0 gData[id][Data_HeadShot] = 0 gData[id][Data_Knife] = 0 gData[id][Data_Nade] = 0 gData[id][Data_NemKills] = 0 gData[id][Data_SurKills] = 0 gData[id][Data_PlayTime] = 0 gData[id][Data_Level] = 0 }
public _get_user_rank(id) { return SortPlayerRank(id); }
GetTimeFormat(seconds, szTime[], len) { new days, hours, minutes days = seconds / 86400; hours = ( seconds / 3600 ) % 24; minutes = ( seconds / 60 ) % 60; seconds = seconds % 60; if(days) { formatex(szTime, len, "%dD %dH %dM %dS", days, hours, minutes, seconds) return; } if(hours) { formatex(szTime, len, "%dH %dM %dS", hours, minutes, seconds) return; } if(minutes) { formatex(szTime, len, "%dM %dS", minutes, seconds) return; } if(seconds) { formatex(szTime, len, "%dS", seconds) } }
GetPlayerStats(id, caller) { new szMotd2[1536], len szMotd2[0] = 0 add(szMotd2, charsmax(szMotd2), "<html><style>\ body{background:#040404;font-family:Verdana, Arial, Sans-Serif;font-size:7pt;}\ .t{color:#808080;text-align:left; }\ #h{background: #336600 url('http://onlyarg.com/foro/images/Amiral/thead.png') repeat-x;color:#E0E0E0;font-weight:bold;}\ #p{color:#00CCCC;}\ #n{color:#fff;}\ </style><body>\ <table cellspacing=0 width=100% class=t>") add(szMotd2, charsmax(szMotd2), "<tr><td id=h width=7%>DATA</td>\ <td id=h>VALUE</td></tr>") len = strlen(szMotd2)
new iSec, szTimeFormat[32], iRank, iPacks iSec = get_user_time(id)+gData[id][Data_PlayTime] GetTimeFormat(iSec, szTimeFormat, 31) iRank = SortPlayerRank(id) iPacks = zp_get_user_ammo_packs(id) replace_all(gData[id][Data_Name], 31, "<", "<") replace_all(gData[id][Data_Name], 31, ">", ">") len += formatex(szMotd2[len], charsmax(szMotd2)-len, "<tr><td id=p>Name</td>\<td>%s</td>", gData[id][Data_Name]) len += formatex(szMotd2[len], charsmax(szMotd2)-len, "<tr><td id=p>SteamID</td>\<td>%s</td>", gData[id][Data_Steamid]) len += formatex(szMotd2[len], charsmax(szMotd2)-len, "<tr><td id=p>Country</td>\<td>%s</td>", gData[id][Data_Country]) len += formatex(szMotd2[len], charsmax(szMotd2)-len, "<tr><td id=p>Rank</td>\<td>%d of %d</td>", iRank, iTotalEntries) len += formatex(szMotd2[len], charsmax(szMotd2)-len, "<tr><td id=p>Packs</td>\<td>%d</td>", iPacks) len += formatex(szMotd2[len], charsmax(szMotd2)-len, "<tr><td id=p>EXP</td>\<td>%d</td>", gData[id][Data_Exp]) len += formatex(szMotd2[len], charsmax(szMotd2)-len, "<tr><td id=p>Level</td>\<td>%s</td>", szRanks[gData[id][Data_Level]]) len += formatex(szMotd2[len], charsmax(szMotd2)-len, "<tr><td id=p>Kills</td>\<td>%d</td>", gData[id][Data_Kills]) len += formatex(szMotd2[len], charsmax(szMotd2)-len, "<tr><td id=p>Deaths</td>\<td>%d</td>", gData[id][Data_Deaths]) len += formatex(szMotd2[len], charsmax(szMotd2)-len, "<tr><td id=p>Headshot</td>\<td>%d</td>", gData[id][Data_HeadShot]) len += formatex(szMotd2[len], charsmax(szMotd2)-len, "<tr><td id=p>Knife</td>\<td>%d</td>", gData[id][Data_Knife]) len += formatex(szMotd2[len], charsmax(szMotd2)-len, "<tr><td id=p>Grenade</td>\<td>%d</td>", gData[id][Data_Nade]) len += formatex(szMotd2[len], charsmax(szMotd2)-len, "<tr><td id=p>Nemesis</td>\<td>%d</td>", gData[id][Data_NemKills]) len += formatex(szMotd2[len], charsmax(szMotd2)-len, "<tr><td id=p>Survivor</td>\<td>%d</td>", gData[id][Data_SurKills]) len += formatex(szMotd2[len], charsmax(szMotd2)-len, "<tr><td id=p>Online</td>\<td>%s</td>", szTimeFormat) add(szMotd2, charsmax(szMotd2), "</table></body></html>") show_motd(caller, szMotd2, "PLAYER STATS") }
CheckPlayerLevel(id) { while((gData[id][Data_Exp] >= iEXP[gData[id][Data_Level]+1])) { gData[id][Data_Level]++ client_print_color(0, id, "^4%s^1 has been promoted to the rank of^4 %s^1 with^4 %d^1 EXP.", gData[id][Data_Name], szRanks[gData[id][Data_Level]], gData[id][Data_Exp]) ExecuteForward(gForward[Forward_Levelup], gForward[Forward_Result], id, gData[id][Data_Level], gData[id][Data_Exp]) } }
LoadPlayerData(id) { new szKey[50], szData[128] formatex(szKey, 49, "%s#EXP", gData[id][Data_Steamid]) if(nvault_get(iVaultHandle, szKey, szData, 127)) { new szExp[8], szKills[8], szDeaths[8], szHeadShot[8], szKnife[8], szNade[8], szNemKill[8], szSurKill[8], szPlayTime[8], szLevel[8] parse(szData, szExp, 7, szKills, 7, szDeaths, 7, szHeadShot, 7, szKnife, 7, szNade, 7, szNemKill, 7, szSurKill, 7, szPlayTime, 7, szLevel, 7) gData[id][Data_Exp] = str_to_num(szExp) gData[id][Data_Kills] = str_to_num(szKills) gData[id][Data_Deaths] = str_to_num(szDeaths) gData[id][Data_HeadShot] = str_to_num(szHeadShot) gData[id][Data_Knife] = str_to_num(szKnife) gData[id][Data_Nade] = str_to_num(szNade) gData[id][Data_NemKills] = str_to_num(szNemKill) gData[id][Data_SurKills] = str_to_num(szSurKill) gData[id][Data_PlayTime] = str_to_num(szPlayTime) gData[id][Data_Level] = str_to_num(szLevel) } bIsLoaded[id] = true ExecuteForward(gForward[Forward_Login], gForward[Forward_Result], id, gData[id][Data_Level], gData[id][Data_Exp]) }
SavePlayerData(id) { new szKey[50], szData[128] formatex(szKey, 49, "%s#EXP", gData[id][Data_Steamid]) replace_all(gData[id][Data_Name], 31, " ", "#") formatex(szData, 127, "%d %d %d %d %d %d %d %d %d %d %s", gData[id][Data_Exp], gData[id][Data_Kills], gData[id][Data_Deaths], gData[id][Data_HeadShot], gData[id][Data_Knife], gData[id][Data_Nade], gData[id][Data_NemKills], gData[id][Data_SurKills], gData[id][Data_PlayTime], gData[id][Data_Level], gData[id][Data_Name]) nvault_set(iVaultHandle, szKey, szData) bIsLoaded[id] = false }
FormatGlobalTopTen() { enum _:VaultData { VD_Key[64], VD_Value } const MAX_ENTRIES = 10 new vault = nvault_util_open(szVaultName) new Array:entries = ArrayCreate(VaultData) new sizeEntries new numEntries = nvault_util_count(vault) new data[VaultData], value[128], data2[VaultData] for(new i = 0, pos, timestamp; i < numEntries; i++) { pos = nvault_util_read(vault, pos, data[VD_Key], charsmax(data[VD_Key]), value, charsmax(value), timestamp) data[VD_Value] = str_to_num(value) if(sizeEntries == 0) { ArrayPushArray(entries, data) sizeEntries++; } else { for(timestamp = 0; timestamp <= sizeEntries; timestamp++) { if(timestamp == sizeEntries) { if(sizeEntries < MAX_ENTRIES) { ArrayPushArray(entries, data) sizeEntries++; } break; } ArrayGetArray(entries, timestamp, data2) if(data[VD_Value] >= data2[VD_Value]) { ArrayInsertArrayBefore(entries, timestamp, data) if(sizeEntries < MAX_ENTRIES) { sizeEntries++; } else { ArrayDeleteItem(entries, sizeEntries) } break; } } } } nvault_util_close(vault)
new len szMotd[0] = 0 add(szMotd, charsmax(szMotd), "<html><style>\ body{background:#040404;font-family:Verdana, Arial, Sans-Serif;font-size:7pt;}\ .t{color:#808080;text-align:left; }\ #h{background: #0066CC url('http://onlyarg.com/foro/images/Amiral/thead.png') repeat-x;color:#E0E0E0;font-weight:bold;}\ #p{color:#D41313;}\ #n{color:#fff;}\ </style><body>\ <table cellspacing=0 width=100% class=t>") add(szMotd, charsmax(szMotd), "<tr><td id=h width=7%>#</td>\ <td id=h>Name</td>\ <td id=h>EXP</td>\ <td id=h>Kills</td>\ <td id=h>Deaths</td>\ <td id=h>Online</td></tr>") len = strlen(szMotd) for(new i = 0; i < sizeEntries; i++) { ArrayGetArray(entries, i, data) data[VD_Key][20] = 0 new szDataNew[128] nvault_get(iVaultHandle, data[VD_Key], szDataNew, charsmax(szDataNew)) new szExp[8], szKills[8], szDeaths[8], szHeadShot[8], szKnife[8], szNade[8], szNemKill[8], szSurKill[8], szPlayTime[8], szLevel[8], szName3[32] parse(szDataNew, szExp, 7, szKills, 7, szDeaths, 7, szHeadShot, 7, szKnife, 7, szNade, 7, szNemKill, 7, szSurKill, 7, szPlayTime, 7, szLevel, 7, szName3, 31) new iSec, szOnline[32] replace_all(szName3, 31, "#", " ") iSec = str_to_num(szPlayTime) GetTimeFormat(iSec, szOnline, 31) replace_all(szName3, charsmax(szName3), "<", "<") replace_all(szName3, charsmax(szName3), ">", ">") len += formatex(szMotd[len], charsmax(szMotd)-len, "<tr><td id=p>%d</td>\ <td id=n>%s</td>\ <td>%s</td>\ <td>%s</td>\ <td>%s</td>\ <td>%s</td>", (i+1), szName3, szExp, szKills, szDeaths, szOnline) } add(szMotd, charsmax(szMotd), "</table></body></html>") ArrayDestroy(entries) }
SortPlayerRank(id) { new szKey[50] formatex(szKey, 49, "%s#EXP", gData[id][Data_Steamid]) enum _:VaultData { VD_Key[64], VD_Value } new vault = nvault_util_open(szVaultName) new Array:entries = ArrayCreate(VaultData) new sizeEntries new numEntries = nvault_util_count(vault) new data[VaultData], value[128], data2[VaultData] for(new i = 0, pos, timestamp; i < numEntries; i++) { pos = nvault_util_read(vault, pos, data[VD_Key], charsmax(data[VD_Key]), value, charsmax(value), timestamp) data[VD_Value] = str_to_num(value) if(sizeEntries == 0) { ArrayPushArray(entries, data) sizeEntries++; } else { for(timestamp = 0; timestamp <= sizeEntries; timestamp++) { if(timestamp == sizeEntries) { if(sizeEntries < numEntries) { ArrayPushArray(entries, data) sizeEntries++; } break; } ArrayGetArray(entries, timestamp, data2) if(data[VD_Value] >= data2[VD_Value]) { ArrayInsertArrayBefore(entries, timestamp, data) if(sizeEntries < numEntries) { sizeEntries++; } else { ArrayDeleteItem(entries, sizeEntries) } break; } } } } nvault_util_close(vault) iTotalEntries = sizeEntries for(new i = 0; i < sizeEntries; i++) { ArrayGetArray(entries, i, data) data[VD_Key][20] = 0 if(equal(data[VD_Key],szKey)) { gData[id][Data_Rank] = i+1 break; } } ArrayDestroy(entries) return gData[id][Data_Rank]; }
off: what is the difference between Ham_Player_PreThink or FM_PlayerPreThink? or it is the same?
|
PHP Code:
RegisterHam(Ham_Player_PreThink, "player", "OnPlayerPreThink") //no need for csbot
I test this plugin on Condition Zero game. Using ham we need to manually register forward for CSbot. So this forward is no need for bot. Only real player need it.
PHP Code:
public OnDeathMsg() { new atk, vic, hs, szWpn[4] atk = read_data(1) vic = read_data(2) hs = read_data(3) read_data(4, szWpn, 3) if(flag_get(g_IsConnected, vic)) { gData[vic][Data_Deaths]++ } if((atk != vic) && flag_get(g_IsConnected, atk))
That is why i don't want to use cache connected.
This:
PHP Code:
if((atk != vic) && flag_get(g_IsConnected, atk))
will throw an error if attacker > 32 because you don't check (1<=id<=MaxClients). So let make it simple.. just use amxx natives.. easy right?
You need to try your converted plugin in ZP50 first, i can say there will be an error.
__________________
Team-MMG CS1.6 Servers:
✅ MultiMod -- 103.179.44.152:27016
✅ Zombie Plague -- 103.179.44.152:27015
✅ Zombie Escape -- 103.179.44.152:27017
✅ Klassik Kombat -- 103.179.44.152:27018
✅ Boss-Battle -- 103.179.44.152:27019
|
|