sm-plugins/BossHP_Ranking/scripting/BossHP_Ranking.sp
2018-10-13 18:16:29 +02:00

258 lines
6.6 KiB
SourcePawn

#include <sourcemod>
#include <BossHP>
#include <basic>
#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 entity, int activator)
{
if (!IsValidClient(activator))
return;
CBoss _Boss = view_as<CBoss>(Boss);
int iIdentificationEntity;
if (_Boss.IsBreakable)
{
CBossBreakable __Boss = view_as<CBossBreakable>(_Boss);
iIdentificationEntity = __Boss.iBreakableEnt;
delete __Boss;
}
else if (_Boss.IsCounter)
{
CBossCounter __Boss = view_as<CBossCounter>(_Boss);
iIdentificationEntity = __Boss.iCounterEnt;
delete __Boss;
}
else if (_Boss.IsHPBar)
{
CBossHPBar __Boss = view_as<CBossHPBar>(_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<CBoss>(Boss);
CConfig Config = _Boss.dConfig;
Config.GetName(sBossName, sizeof(sBossName))
delete Config;
int iIdentificationEntity;
if (_Boss.IsBreakable)
{
CBossBreakable __Boss = view_as<CBossBreakable>(_Boss);
iIdentificationEntity = __Boss.iBreakableEnt;
delete __Boss;
}
else if (_Boss.IsCounter)
{
CBossCounter __Boss = view_as<CBossCounter>(_Boss);
iIdentificationEntity = __Boss.iCounterEnt;
delete __Boss;
}
else if (_Boss.IsHPBar)
{
CBossHPBar __Boss = view_as<CBossHPBar>(_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.4, 0.65});
PbSetFloat(hMessage, "fade_in_time", 0.1);
PbSetFloat(hMessage, "fade_out_time", 0.1);
PbSetFloat(hMessage, "hold_time", 5.0);
PbSetFloat(hMessage, "fx_time", 0.0);
PbSetString(hMessage, "text", sBuffer);
EndMessage();
}
else
{
BfWriteByte(hMessage, 50);
BfWriteFloat(hMessage, 0.4);
BfWriteFloat(hMessage, 0.65);
BfWriteByte(hMessage, 0);
BfWriteByte(hMessage, 128);
BfWriteByte(hMessage, 255);
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, 5.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);
}