#include #include #include #include "CConfig.inc" #include "CBoss.inc" ArrayList g_hBossHits; public Plugin:myinfo = { name = "...", author = "Neon", description = "", version = "1.0", url = "https://steamcommunity.com/id/n3ontm" }; //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public OnPluginStart() { g_hBossHits = new ArrayList(128); } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void OnBossDamaged(any Boss, int activator) { if (!IsValidClient(activator)) return; CBoss _Boss = view_as(Boss); int iIdentificationEntity; if (_Boss.IsBreakable) { CBossBreakable __Boss = view_as(_Boss); iIdentificationEntity = __Boss.iBreakableEnt; delete __Boss; } else if (_Boss.IsCounter) { CBossCounter __Boss = view_as(_Boss); iIdentificationEntity = __Boss.iCounterEnt; delete __Boss; } else if (_Boss.IsHPBar) { CBossHPBar __Boss = view_as(_Boss); iIdentificationEntity = __Boss.iBackupEnt; delete __Boss; } int BossHit[2]; BossHit[0] = iIdentificationEntity; BossHit[1] = activator; g_hBossHits.PushArray(BossHit, sizeof(BossHit)) delete _Boss; } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- public void OnBossKilled(any Boss, int reason) { char sBossName[64]; CBoss _Boss = view_as(Boss); CConfig Config = _Boss.dConfig; Config.GetName(sBossName, sizeof(sBossName)) delete Config; int iIdentificationEntity; if (_Boss.IsBreakable) { CBossBreakable __Boss = view_as(_Boss); iIdentificationEntity = __Boss.iBreakableEnt; delete __Boss; } else if (_Boss.IsCounter) { CBossCounter __Boss = view_as(_Boss); iIdentificationEntity = __Boss.iCounterEnt; delete __Boss; } else if (_Boss.IsHPBar) { CBossHPBar __Boss = view_as(_Boss); iIdentificationEntity = __Boss.iBackupEnt; delete __Boss; } delete _Boss; int iSortedList[MAXPLAYERS+1][2]; int iSortedCount; int iBossHits[MAXPLAYERS+1]; for(int i = 0; i < g_hBossHits.Length; i++) { int BossHit[2]; g_hBossHits.GetArray(i, BossHit, sizeof(BossHit)); if(BossHit[0] == iIdentificationEntity) { iBossHits[BossHit[1]]++; } } for(int i = 0; i < g_hBossHits.Length; i++) { int BossHit[2]; g_hBossHits.GetArray(i, BossHit, sizeof(BossHit)); if(BossHit[0] == iIdentificationEntity) g_hBossHits.Erase(i) } if (reason != 2) return; for (int client = 1; client <= MaxClients; client++) { if (!IsClientInGame(client) || !iBossHits[client]) continue; iSortedList[iSortedCount][0] = client; iSortedList[iSortedCount][1] = iBossHits[client]; iSortedCount++; } SortCustom2D(iSortedList, iSortedCount, SortBossDamageList); if (iSortedCount) { char sBuffer[512]; Format(sBuffer, sizeof(sBuffer), "BOSS DAMAGE (%s):", sBossName); 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 SortBossDamageList(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: //---------------------------------------------------------------------------------------------------- public void OnClientDisconnect(int client) { for(int i = 0; i < g_hBossHits.Length; i++) { int BossHit[2]; g_hBossHits.GetArray(i, BossHit, sizeof(BossHit)); if(BossHit[1] == client) g_hBossHits.Erase(i); } } //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- stock int IsValidClient(int client, bool nobots = true) { if (client <= 0 || client > MaxClients || !IsClientConnected(client) || (nobots && IsFakeClient(client))) return false; return IsClientInGame(client); }