#include #include #include #include "CConfig.inc" #include "CBoss.inc" ArrayList g_hStats[MAXPLAYERS+1]; //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public Plugin myinfo = { name = "BossHP - Ranking", author = "Neon & zaCade", description = "", version = "1.0.0", }; //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void OnClientPutInServer(int client) { g_hStats[client] = new ArrayList(64); } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void OnClientDisconnect(int client) { delete g_hStats[client]; } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void OnBossDamaged(any Boss, int client) { if (!IsValidClient(client)) return; for (int index = 0; index < g_hStats[client].Length; index++) { any BossDamage[2]; g_hStats[client].GetArray(index, BossDamage, sizeof(BossDamage)); if (BossDamage[0] == Boss) { BossDamage[1] += 1; g_hStats[client].SetArray(index, BossDamage, sizeof(BossDamage)); return; } } any BossDamage[2]; BossDamage[0] = Boss; BossDamage[1] = 1; g_hStats[client].PushArray(BossDamage, sizeof(BossDamage)); } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void OnBossKilled(any Boss, int reason) { if (reason != 2) { for (int client = 1; client <= MaxClients; client++) { if (!IsClientInGame(client)) continue; for (int index = 0; index < g_hStats[client].Length; index++) { any BossDamage[2]; g_hStats[client].GetArray(index, BossDamage, sizeof(BossDamage)); if (BossDamage[0] == Boss) { g_hStats[client].Erase(index); break; } } } } else { int iSortedList[MAXPLAYERS+1][2]; int iSortedCount; for (int client = 1; client <= MaxClients; client++) { if (!IsClientInGame(client)) continue; for (int index = 0; index < g_hStats[client].Length; index++) { any BossDamage[2]; g_hStats[client].GetArray(index, BossDamage, sizeof(BossDamage)); if (BossDamage[0] == Boss) { iSortedList[iSortedCount][0] = client; iSortedList[iSortedCount][1] = BossDamage[1]; iSortedCount++; g_hStats[client].Erase(index); break; } } } SortCustom2D(iSortedList, iSortedCount, SortBossHitsList); if (iSortedCount) { char sBuffer[512]; Format(sBuffer, sizeof(sBuffer), "BOSS DAMAGE:"); Format(sBuffer, sizeof(sBuffer), "%s\n*************************", sBuffer); if (iSortedList[0][0]) Format(sBuffer, sizeof(sBuffer), "%s\n1. %N - %d hits", sBuffer, iSortedList[0][0], iSortedList[0][1]); if (iSortedList[1][0]) Format(sBuffer, sizeof(sBuffer), "%s\n2. %N - %d hits", sBuffer, iSortedList[1][0], iSortedList[1][1]); if (iSortedList[2][0]) Format(sBuffer, sizeof(sBuffer), "%s\n3. %N - %d hits", sBuffer, iSortedList[2][0], iSortedList[2][1]); Format(sBuffer, sizeof(sBuffer), "%s\n*************************", sBuffer); Handle hMessage = StartMessageAll("HudMsg"); if (hMessage) { if (GetUserMessageType() == UM_Protobuf) { PbSetInt(hMessage, "channel", 50); PbSetInt(hMessage, "effect", 0); PbSetColor(hMessage, "clr1", {255, 255, 255, 255}); PbSetColor(hMessage, "clr2", {255, 255, 255, 255}); PbSetVector2D(hMessage, "pos", Float:{0.02, 0.45}); PbSetFloat(hMessage, "fade_in_time", 0.1); PbSetFloat(hMessage, "fade_out_time", 0.1); PbSetFloat(hMessage, "hold_time", 7.0); PbSetFloat(hMessage, "fx_time", 0.0); PbSetString(hMessage, "text", sBuffer); EndMessage(); } else { BfWriteByte(hMessage, 50); BfWriteFloat(hMessage, 0.02); BfWriteFloat(hMessage, 0.25); BfWriteByte(hMessage, 255); BfWriteByte(hMessage, 255); BfWriteByte(hMessage, 0); BfWriteByte(hMessage, 255); BfWriteByte(hMessage, 255); BfWriteByte(hMessage, 255); BfWriteByte(hMessage, 255); BfWriteByte(hMessage, 255); BfWriteByte(hMessage, 0); BfWriteFloat(hMessage, 0.1); BfWriteFloat(hMessage, 0.1); BfWriteFloat(hMessage, 7.0); BfWriteFloat(hMessage, 0.0); BfWriteString(hMessage, sBuffer); EndMessage(); } } if(GetEngineVersion() == Engine_CSGO) { int iSplits char sSplits[16][512]; if((iSplits = ExplodeString(sBuffer, "\n", sSplits, sizeof(sSplits), sizeof(sSplits[]))) != 0) { for (int iSplit; iSplit < iSplits; iSplit++) { PrintToChatAll(sSplits[iSplit]); } } } else PrintToChatAll(sBuffer); } } } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public int SortBossHitsList(int[] elem1, int[] elem2, const int[][] array, Handle hndl) { if (elem1[1] > elem2[1]) return -1; if (elem1[1] < elem2[1]) return 1; return 0; } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- stock int IsValidClient(int client, bool nobots = true) { if (client <= 0 || client > MaxClients || !IsClientConnected(client) || (nobots && IsFakeClient(client))) return false; return IsClientInGame(client); }