211 lines
4.8 KiB
SourcePawn
211 lines
4.8 KiB
SourcePawn
#include <multicolors>
|
|
#include <sourcemod>
|
|
#include <sdktools>
|
|
#include <pscd>
|
|
#pragma newdecls required
|
|
|
|
float roundStartedTime = -1.0;
|
|
int g_iTextChannel;
|
|
bool g_bDisabled;
|
|
ConVar g_cvEnabled;
|
|
|
|
public Plugin myinfo =
|
|
{
|
|
name = "UNLOZE Console Messages",
|
|
description = "Make console messages printed by maps more fancy",
|
|
author = "zaCade, decompiled by Neon and slightly modified by jenz",
|
|
version = "1.2",
|
|
url = ""
|
|
};
|
|
|
|
public void OnPluginStart()
|
|
{
|
|
g_cvEnabled = CreateConVar("sm_centertext", "1", "Enable the 'game_text' message", 0, true, 0.0, true, 1.0);
|
|
HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
|
|
}
|
|
|
|
public void OnMapStart()
|
|
{
|
|
bool bChannelTaken[6];
|
|
bool bChannelFound;
|
|
int entity = -1;
|
|
while ((entity = FindEntityByClassname(entity, "game_text")) != -1)
|
|
{
|
|
int channel = GetEntProp(entity, Prop_Data, "m_textParms.channel", 4, 0);
|
|
LogMessage("Checking channel: %d", channel);
|
|
if (channel < 6)
|
|
{
|
|
if (!bChannelTaken[channel])
|
|
{
|
|
LogMessage("Channel in use: %d", channel);
|
|
bChannelTaken[channel] = true;
|
|
}
|
|
}
|
|
}
|
|
int channel;
|
|
while (channel < 6)
|
|
{
|
|
if (!bChannelTaken[channel])
|
|
{
|
|
LogMessage("Using channel: %d", channel);
|
|
g_iTextChannel = channel;
|
|
bChannelFound = true;
|
|
if (!bChannelFound)
|
|
{
|
|
LogMessage("No channel found!");
|
|
g_bDisabled = true;
|
|
}
|
|
return;
|
|
}
|
|
channel++;
|
|
}
|
|
if (!bChannelFound)
|
|
{
|
|
LogMessage("No channel found!");
|
|
g_bDisabled = true;
|
|
}
|
|
return;
|
|
}
|
|
|
|
public float GetRoundTimeAtTimerEnd(int number)
|
|
{
|
|
float g = GetCurrentRoundTime() - number;
|
|
return g;
|
|
}
|
|
|
|
public float GetCurrentRoundTime()
|
|
{
|
|
Handle hFreezeTime = FindConVar("mp_freezetime"); // Freezetime Handle
|
|
int freezeTime = GetConVarInt(hFreezeTime); // Freezetime in seconds
|
|
return GameRules_GetProp("m_iRoundTime") - ((GetEngineTime() - roundStartedTime) - freezeTime);
|
|
}
|
|
|
|
public void Event_RoundStart(Handle event, const char[] name, bool dontBroadcast)
|
|
{
|
|
roundStartedTime = GetEngineTime();
|
|
}
|
|
|
|
public bool CheckString(const char[] string)
|
|
{
|
|
char Blacklist[][] = {
|
|
"recharge", "recast", "cooldown", "cool"
|
|
};
|
|
for (int i = 0; i < sizeof(Blacklist); i++)
|
|
{
|
|
if (StrContains(string, Blacklist[i], false) != -1)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
public Action PointServerCommandForward(const char[] sCommand)
|
|
{
|
|
if (!strncmp("say", sCommand, 3, false))
|
|
{
|
|
char sMessage[512];
|
|
char sSecondsAppend[32];
|
|
bool found_numeric = false;
|
|
int i;
|
|
while (strlen(sCommand) + -4 > i)
|
|
{
|
|
sMessage[i] = sCommand[i + 4];
|
|
i++;
|
|
}
|
|
if (StrContains(sMessage, "sec", false) != -1 && !CheckString(sMessage))
|
|
{
|
|
int indexTracker = -1
|
|
int endIndexTracker = -1
|
|
for (int j = 0; j < strlen(sMessage); ++j)
|
|
{
|
|
if (IsCharNumeric(sMessage[j]))
|
|
{
|
|
found_numeric = true;
|
|
if (indexTracker == -1)
|
|
{
|
|
indexTracker = j;
|
|
}
|
|
}
|
|
else if (found_numeric)
|
|
{
|
|
endIndexTracker = j;
|
|
break;
|
|
}
|
|
}
|
|
if (found_numeric)
|
|
{
|
|
if (endIndexTracker == -1)
|
|
{
|
|
endIndexTracker = strlen(sMessage);
|
|
}
|
|
char SecondsLocal[512];
|
|
for (int ij = indexTracker; ij < endIndexTracker; ij++)
|
|
{
|
|
StrCat(SecondsLocal, sizeof(SecondsLocal), sMessage[ij]);
|
|
}
|
|
int number = StringToInt(SecondsLocal);
|
|
//PrintToChatAll("number: %i", number);
|
|
if (GetRoundTimeAtTimerEnd(number) > 0.0)
|
|
{
|
|
float client_time = GetRoundTimeAtTimerEnd(number);
|
|
char sTime[32];
|
|
FormatPlayerTime(client_time, sTime, sizeof(sTime));
|
|
Format(sSecondsAppend, sizeof(sSecondsAppend), " {green}@ %s", sTime);
|
|
}
|
|
}
|
|
}
|
|
if (found_numeric)
|
|
{
|
|
CPrintToChatAll("{CRIMSON}[NARRATOR] {WHITESMOKE}%s%s", sMessage, sSecondsAppend);
|
|
}
|
|
else
|
|
{
|
|
CPrintToChatAll("{CRIMSON}[NARRATOR] {WHITESMOKE}%s", sMessage);
|
|
}
|
|
if (!g_bDisabled)
|
|
{
|
|
if (g_cvEnabled.BoolValue)
|
|
{
|
|
Handle hMessage = StartMessageAll("HudMsg", 0);
|
|
if (hMessage)
|
|
{
|
|
BfWriteByte(hMessage, g_iTextChannel);
|
|
BfWriteFloat(hMessage, -1.0);
|
|
BfWriteFloat(hMessage, 0.15);
|
|
BfWriteByte(hMessage, 200);
|
|
BfWriteByte(hMessage, 200);
|
|
BfWriteByte(hMessage, 200);
|
|
BfWriteByte(hMessage, 255);
|
|
BfWriteByte(hMessage, 200);
|
|
BfWriteByte(hMessage, 200);
|
|
BfWriteByte(hMessage, 200);
|
|
BfWriteByte(hMessage, 255);
|
|
BfWriteByte(hMessage, 0);
|
|
BfWriteFloat(hMessage, 0.5);
|
|
BfWriteFloat(hMessage, 0.0);
|
|
BfWriteFloat(hMessage, 5.0);
|
|
BfWriteFloat(hMessage, 0.0);
|
|
BfWriteString(hMessage, sMessage);
|
|
EndMessage();
|
|
}
|
|
}
|
|
}
|
|
return Plugin_Handled;
|
|
}
|
|
return Plugin_Continue;
|
|
}
|
|
|
|
stock void FormatPlayerTime(float fTime, char[] sResult, int iMaxlength)
|
|
{
|
|
int iMinutes = RoundToFloor(fTime / 60);
|
|
fTime -= iMinutes * 60;
|
|
int iSeconds = RoundToFloor(fTime);
|
|
|
|
if(iMinutes)
|
|
Format(sResult, iMaxlength, "%d:%02d", iMinutes, iSeconds);
|
|
else
|
|
Format(sResult, iMaxlength, "%d", iSeconds);
|
|
}
|