sm-plugins/StageDisplay/scripting/StageDisplay.sp
2019-06-04 17:39:39 +02:00

260 lines
7.0 KiB
SourcePawn

#pragma semicolon 1
#pragma newdecls required
#include <sourcemod>
#include <sdktools>
#include <cstrike>
KeyValues g_Config;
char g_sStageName[32];
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Plugin myinfo =
{
name = "Stage Display",
author = "Neon",
description = "",
version = "1.0",
url = "https://steamcommunity.com/id/n3ontm"
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnPluginStart()
{
HookEvent("round_start", OnRoundStart, EventHookMode_PostNoCopy);
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public APLRes AskPluginLoad2(Handle hMyself, bool bLate, char[] sError, int errorSize)
{
CreateNative("SD_GetStage", Native_GetStage);
RegPluginLibrary("StageDisplay");
return APLRes_Success;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnMapStart()
{
g_sStageName = "unknown";
if(g_Config)
delete g_Config;
char sMapName[PLATFORM_MAX_PATH];
GetCurrentMap(sMapName, sizeof(sMapName));
char sConfigFile[PLATFORM_MAX_PATH];
BuildPath(Path_SM, sConfigFile, sizeof(sConfigFile), "configs/stagedisplay/%s.cfg", sMapName);
if(!FileExists(sConfigFile))
{
LogMessage("Could not find mapconfig: \"%s\"", sConfigFile);
return;
}
LogMessage("Found mapconfig: \"%s\"", sConfigFile);
g_Config = new KeyValues("stagedisplay");
if(!g_Config.ImportFromFile(sConfigFile))
{
delete g_Config;
SetFailState("ImportFromFile() failed!");
return;
}
g_Config.Rewind();
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnRoundStart(Event hEvent, const char[] sEvent, bool bDontBroadcast)
{
CreateTimer(3.0, CheckStageTimer, INVALID_HANDLE, TIMER_FLAG_NO_MAPCHANGE);
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Action CheckStageTimer(Handle timer)
{
CheckStage();
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void CheckStage()
{
if(!g_Config)
return;
g_Config.Rewind();
char sMethod[64];
g_Config.GetString("method", sMethod, sizeof(sMethod));
if(!sMethod[0])
{
LogError("Could not find \"method\"");
return;
}
char sStageName[64];
char sDiffName[64];
if(StrEqual(sMethod, "counter"))
{
char sCounter[64];
if(!g_Config.GetString("counter", sCounter, sizeof(sCounter)))
{
LogError("Could not find \"counter\"");
return;
}
int iCounterEnt = INVALID_ENT_REFERENCE;
iCounterEnt = FindEntityByTargetname(iCounterEnt, sCounter, "*");
if(iCounterEnt == INVALID_ENT_REFERENCE)
{
LogError("Could not find entity: \"%s\"", sCounter);
return;
}
static int iOffset = -1;
if (iOffset == -1)
iOffset = FindDataMapInfo(iCounterEnt, "m_OutValue");
int iValue = RoundToNearest(GetEntDataFloat(iCounterEnt, iOffset));
char sValue[8];
IntToString(iValue, sValue, sizeof(sValue));
g_Config.GetString(sValue, sStageName, sizeof(sStageName));
if(!sStageName[0])
{
LogError("Could not find stage \"%s\"", sValue);
return;
}
}
else if(StrEqual(sMethod, "score"))
{
int iValue = CS_GetTeamScore(CS_TEAM_CT);
char sValue[8];
IntToString(iValue, sValue, sizeof(sValue));
g_Config.GetString(sValue, sStageName, sizeof(sStageName));
if(!sStageName[0])
{
LogError("Could not find stage \"%s\"", sValue);
return;
}
}
else
{
LogError("Unknown method \"%s\"", sMethod);
return;
}
g_Config.Rewind();
bool bHasDiffCounter = false;
if(g_Config.JumpToKey("diffcounter", false))
{
bHasDiffCounter = true;
char sDiffCounter[64];
if(!g_Config.GetString("counter", sDiffCounter, sizeof(sDiffCounter)))
{
LogError("Could not find \"diffcounter\"");
return;
}
int iDiffCounterEnt = INVALID_ENT_REFERENCE;
iDiffCounterEnt = FindEntityByTargetname(iDiffCounterEnt, sDiffCounter, "*");
if(iDiffCounterEnt == INVALID_ENT_REFERENCE)
{
LogError("Could not find entity: \"%s\"", sDiffCounter);
return;
}
static int iOffset = -1;
if (iOffset == -1)
iOffset = FindDataMapInfo(iDiffCounterEnt, "m_OutValue");
int iValue = RoundToNearest(GetEntDataFloat(iDiffCounterEnt, iOffset));
char sValue[8];
IntToString(iValue, sValue, sizeof(sValue));
g_Config.GetString(sValue, sDiffName, sizeof(sDiffName));
if(!sStageName[0])
{
LogError("Could not find difficulty \"%s\"", sValue);
return;
}
}
if(bHasDiffCounter)
Format(g_sStageName, sizeof(g_sStageName), "%s - %s", sStageName, sDiffName);
else
Format(g_sStageName, sizeof(g_sStageName), "%s", sStageName);
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public int Native_GetStage(Handle hPlugin, int numParams)
{
int length = GetNativeCell(2);
char[] sStage = new char[length + 1];
Format(sStage, length + 1, "%s", g_sStageName);
if (strcmp(sStage, "unknown", true) == 0)
return 0;
return !(SetNativeString(1, sStage, length + 1));
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
int FindEntityByTargetname(int entity, const char[] sTargetname, const char[] sClassname="*")
{
if(sTargetname[0] == '#') // HammerID
{
int HammerID = StringToInt(sTargetname[1]);
while((entity = FindEntityByClassname(entity, sClassname)) != INVALID_ENT_REFERENCE)
{
if(GetEntProp(entity, Prop_Data, "m_iHammerID") == HammerID)
return entity;
}
}
else // Targetname
{
int Wildcard = FindCharInString(sTargetname, '*');
char sTargetnameBuf[64];
while((entity = FindEntityByClassname(entity, sClassname)) != INVALID_ENT_REFERENCE)
{
if(GetEntPropString(entity, Prop_Data, "m_iName", sTargetnameBuf, sizeof(sTargetnameBuf)) <= 0)
continue;
if(strncmp(sTargetnameBuf, sTargetname, Wildcard) == 0)
return entity;
}
}
return INVALID_ENT_REFERENCE;
}