// =============================================================
// >> INCLUDES
// =============================================================
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>
#include <morecolors>
// =============================================================
// >> PLUGIN INFORMATION
// =============================================================
public Plugin:myinfo =
{
name = "[ BuyZone Protector ]",
author = "Regent",
description = "protects certain time players, which inside of their buy zone",
version = "2.1",
url = ""
};
// =============================================================
// >> DEFINES
// =============================================================
#define EFFECT_MODEL "materials/sprites/lgtning.vmt"
// =============================================================
// >> CONSOLE VARIABLES
// =============================================================
new Handle: g_hConVar_sCTLineColor;
new Handle: g_hConVar_sTLineColor;
new Handle: g_hConVar_flProtectionTime;
new Handle: g_hConVar_bDrawProtectionZone;
new Handle: g_hConVar_bRestrictShootFromZone;
new Handle: g_hConVar_bChangeColor;
new Handle: g_hConVar_sChangeColorCT;
new Handle: g_hConVar_sChangeColorT;
new Handle: g_hConVar_bNotice;
// =============================================================
// >> SHADOW CONSOLE VARIABLES
// =============================================================
new Float: g_flProtectionTime;
new bool: g_bDrawProtectionZone;
new bool: g_bRestrictShootFromZone;
new bool: g_bChangeColor;
new bool: g_bNotice;
new g_iCTLineColor[4];
new g_iTLineColor[4];
new g_iCTColor[4];
new g_iTColor[4];
// =============================================================
// >> GLOBAL VARIABLES
// =============================================================
new Handle: g_hProtectionTimer = INVALID_HANDLE;
new Float: g_flTBuyZoneMins[2][3];
new Float: g_flTBuyZoneMaxs[2][3];
new Float: g_flCTBuyZoneMins[2][3];
new Float: g_flCTBuyZoneMaxs[2][3];
new g_iModelEntity;
// =============================================================
// >> PLUGIN SOURCE CODE
// =============================================================
public OnPluginStart()
{
LoadTranslations("buyzone_protector.phrases.txt");
g_hConVar_bDrawProtectionZone = CreateConVar("sm_bzp_drawzone", "1", "ENG: draw (1) or not (0) zone of protection\nRUS: рисовать (1) или нет (0) зону защиты", FCVAR_PLUGIN);
g_hConVar_flProtectionTime = CreateConVar("sm_bzp_prottime", "20.0", "ENG: how long in seconds will lasts protection of buyzone\nRUS: как долго в секундах будет длится защита зон покупок", FCVAR_PLUGIN);
g_hConVar_sCTLineColor = CreateConVar("sm_bzp_ctlinecolor", "0 0 255 255", "ENG: color of lines ct zone\nRUS: цвет зоны КТ", FCVAR_PLUGIN);
g_hConVar_sTLineColor = CreateConVar("sm_bzp_tlinecolor", "255 0 0 255", "ENG: color of lines t zone\nRUS: цвет зоны Т", FCVAR_PLUGIN);
g_hConVar_bRestrictShootFromZone = CreateConVar("sm_bzp_restrictshoot", "1", "ENG: allow (0) or not (1) shooting from their zone or not\nRUS: разрешить (0) или нет (1) стрелять из своих зон или нет", FCVAR_PLUGIN);
g_hConVar_bChangeColor = CreateConVar("sm_bzp_changecolor", "1", "ENG: change (0) or not (1) player color in their zone\nRUS: изменять (0) или нет (1) цвет игроков в своих зонах", FCVAR_PLUGIN);
g_hConVar_sChangeColorCT = CreateConVar("sm_bzp_changecolorct", "0 0 255 125", "ENG: color of CT in their zone while protect lasts\nRUS: цвет КТ в своей зоне, пока защита активна", FCVAR_PLUGIN);
g_hConVar_sChangeColorT = CreateConVar("sm_bzp_changecolort", "255 0 0 125", "ENG: color of T in their zone while protect lasts\nRUS: цвет Т в своей зоне, пока защита активна", FCVAR_PLUGIN);
g_hConVar_bNotice = CreateConVar("sm_bzp_notice", "1", "ENG: allow (0) or not (1) sending messages about entering/leaving zones\nRUS: разрешить (0) или нет (1) плагину сообщать игрокам о входе/покидании зоны", FCVAR_PLUGIN);
HookConVarChange(g_hConVar_bDrawProtectionZone, Hook_ConVarChanged);
HookConVarChange(g_hConVar_flProtectionTime, Hook_ConVarChanged);
HookConVarChange(g_hConVar_sCTLineColor, Hook_ConVarChanged);
HookConVarChange(g_hConVar_sTLineColor, Hook_ConVarChanged);
HookConVarChange(g_hConVar_bRestrictShootFromZone, Hook_ConVarChanged);
HookConVarChange(g_hConVar_bChangeColor, Hook_ConVarChanged);
HookConVarChange(g_hConVar_sChangeColorCT, Hook_ConVarChanged);
HookConVarChange(g_hConVar_sChangeColorT, Hook_ConVarChanged);
HookConVarChange(g_hConVar_bNotice, Hook_ConVarChanged);
HookEvent("round_start", Ev_RoundStart);
AutoExecConfig(true, "buyzone_protector");
CreateConVar("sm_bzp_version", "2.0 by Regent", "version of plugin", FCVAR_PLUGIN|FCVAR_NOTIFY|FCVAR_DONTRECORD);
}
public Hook_ConVarChanged(Handle:hConVar, const String:sOldValue[], const String:sNewValue[])
{
if ( hConVar == g_hConVar_bDrawProtectionZone )
{
g_bDrawProtectionZone = GetConVarBool(g_hConVar_bDrawProtectionZone);
}
else if ( hConVar == g_hConVar_flProtectionTime )
{
g_flProtectionTime = GetConVarFloat(g_hConVar_flProtectionTime);
}
else if ( hConVar == g_hConVar_sCTLineColor )
{
StringToIntArray(sNewValue, g_iCTLineColor);
}
else if ( hConVar == g_hConVar_sTLineColor )
{
StringToIntArray(sNewValue, g_iTLineColor);
}
else if ( hConVar == g_hConVar_bRestrictShootFromZone )
{
g_bRestrictShootFromZone = GetConVarBool(g_hConVar_bRestrictShootFromZone);
}
else if ( hConVar == g_hConVar_bChangeColor )
{
g_bChangeColor = GetConVarBool(g_hConVar_bChangeColor);
}
else if ( hConVar == g_hConVar_bNotice )
{
g_bNotice = GetConVarBool(g_hConVar_bNotice);
}
else if ( hConVar == g_hConVar_sChangeColorCT )
{
StringToIntArray(sNewValue, g_iCTColor);
}
else if ( hConVar == g_hConVar_sChangeColorT )
{
StringToIntArray(sNewValue, g_iTColor);
}
}
public OnPluginEnd()
{
if ( g_hProtectionTimer != INVALID_HANDLE )
{
KillTimer(g_hProtectionTimer);
g_hProtectionTimer = INVALID_HANDLE;
}
}
public OnMapStart()
{
g_hProtectionTimer = INVALID_HANDLE;
new iEntity = -1;
while ((iEntity = FindEntityByClassname(iEntity, "func_buyzone")) != -1)
{
decl Float:flOrigin[3], Float:flVecMins[3], Float:flVecMaxs[3];
new iTeam = GetEntProp(iEntity, Prop_Send, "m_iTeamNum");
GetEntPropVector(iEntity, Prop_Send, "m_vecMins", flVecMins);
GetEntPropVector(iEntity, Prop_Send, "m_vecMaxs", flVecMaxs);
GetEntPropVector(iEntity, Prop_Send, "m_vecOrigin", flOrigin);
if ( iTeam == 2 )
{
g_flTBuyZoneMins[0][0] = flOrigin[0] + flVecMins[0];
g_flTBuyZoneMins[0][1] = flOrigin[1] + flVecMins[1];
g_flTBuyZoneMins[0][2] = flOrigin[2] + flVecMins[2];
g_flTBuyZoneMaxs[0][0] = flOrigin[0] + flVecMaxs[0];
g_flTBuyZoneMaxs[0][1] = flOrigin[1] + flVecMaxs[1];
g_flTBuyZoneMaxs[0][2] = flOrigin[2] + flVecMaxs[2];
g_flTBuyZoneMins[1][0] = flOrigin[0] + flVecMins[0];
g_flTBuyZoneMins[1][1] = flOrigin[1] + flVecMaxs[1];
g_flTBuyZoneMins[1][2] = flOrigin[2] + flVecMins[2];
g_flTBuyZoneMaxs[1][0] = flOrigin[0] + flVecMaxs[0];
g_flTBuyZoneMaxs[1][1] = flOrigin[1] + flVecMins[1];
g_flTBuyZoneMaxs[1][2] = flOrigin[2] + flVecMaxs[2];
SDKHook(iEntity, SDKHook_StartTouch, OnTZoneStartTouch);
SDKHook(iEntity, SDKHook_EndTouch, OnTZoneEndTouch);
}
else if ( iTeam == 3 )
{
g_flCTBuyZoneMins[0][0] = flOrigin[0] + flVecMins[0];
g_flCTBuyZoneMins[0][1] = flOrigin[1] + flVecMins[1];
g_flCTBuyZoneMins[0][2] = flOrigin[2] + flVecMins[2];
g_flCTBuyZoneMaxs[0][0] = flOrigin[0] + flVecMaxs[0];
g_flCTBuyZoneMaxs[0][1] = flOrigin[1] + flVecMaxs[1];
g_flCTBuyZoneMaxs[0][2] = flOrigin[2] + flVecMaxs[2];
g_flCTBuyZoneMins[1][0] = flOrigin[0] + flVecMins[0];
g_flCTBuyZoneMins[1][1] = flOrigin[1] + flVecMaxs[1];
g_flCTBuyZoneMins[1][2] = flOrigin[2] + flVecMins[2];
g_flCTBuyZoneMaxs[1][0] = flOrigin[0] + flVecMaxs[0];
g_flCTBuyZoneMaxs[1][1] = flOrigin[1] + flVecMins[1];
g_flCTBuyZoneMaxs[1][2] = flOrigin[2] + flVecMaxs[2];
SDKHook(iEntity, SDKHook_StartTouch, OnCTZoneStartTouch);
SDKHook(iEntity, SDKHook_EndTouch, OnCTZoneEndTouch);
}
}
g_iModelEntity = PrecacheModel(EFFECT_MODEL);
}
public OnConfigsExecuted()
{
g_bDrawProtectionZone = GetConVarBool (g_hConVar_bDrawProtectionZone);
g_bRestrictShootFromZone = GetConVarBool (g_hConVar_bRestrictShootFromZone);
g_bChangeColor = GetConVarBool (g_hConVar_bChangeColor);
g_bNotice = GetConVarBool (g_hConVar_bNotice);
g_flProtectionTime = GetConVarFloat(g_hConVar_flProtectionTime);
decl String:sBuffer[20];
GetConVarString(g_hConVar_sCTLineColor, sBuffer, sizeof(sBuffer) - 1);
StringToIntArray(sBuffer, g_iCTLineColor);
GetConVarString(g_hConVar_sTLineColor, sBuffer, sizeof(sBuffer) - 1);
StringToIntArray(sBuffer, g_iTLineColor);
GetConVarString(g_hConVar_sChangeColorCT, sBuffer, sizeof(sBuffer) - 1);
StringToIntArray(sBuffer, g_iCTColor);
GetConVarString(g_hConVar_sChangeColorT, sBuffer, sizeof(sBuffer) - 1);
StringToIntArray(sBuffer, g_iTColor);
for ( new i = 1; i <= MaxClients; i++ )
{
if ( IsClientInGame(i) )
{
OnClientPutInServer(i);
}
}
}
StringToIntArray(const String:sInput[], Array[])
{
decl String:sBuffer[4][5]
ExplodeString(sInput, " ", sBuffer, sizeof(sBuffer), sizeof(sBuffer[]) - 1);
Array[0] = StringToInt(sBuffer[0]);
Array[1] = StringToInt(sBuffer[1]);
Array[2] = StringToInt(sBuffer[2]);
Array[3] = StringToInt(sBuffer[3]);
}
public OnClientPutInServer(iClient)
{
SDKHook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}
public OnClientDisconnect_Post(iClient)
{
SDKUnhook(iClient, SDKHook_OnTakeDamage, OnTakeDamage);
}
public Action:OnTakeDamage(iClient, &iAttacker, &iInflictor, &Float:flDamage, &iDamageType)
{
if ( g_hProtectionTimer != INVALID_HANDLE )
{
if ( GetEntProp(iClient, Prop_Send, "m_bInBuyZone") == 1 )
{
if ( GetClientTeam(iClient) == 2 )
{
if ( IsClientInside(iClient, g_flTBuyZoneMins[0], g_flTBuyZoneMaxs[0]) )
{
flDamage = 0.0;
return Plugin_Changed;
}
}
else if ( GetClientTeam(iClient) == 3 )
{
if ( IsClientInside(iClient, g_flCTBuyZoneMins[0], g_flCTBuyZoneMaxs[0]) )
{
flDamage = 0.0;
return Plugin_Changed;
}
}
}
}
return Plugin_Continue;
}
public Ev_RoundStart(Handle:hEvent, const String:sEvName[], bool:bSilent)
{
if ( g_bDrawProtectionZone )
{
DrawZoneByCoords(g_flCTBuyZoneMins, g_flCTBuyZoneMaxs, g_iCTLineColor);
DrawZoneByCoords(g_flTBuyZoneMins, g_flTBuyZoneMaxs, g_iTLineColor);
}
if ( g_hProtectionTimer != INVALID_HANDLE )
{
KillTimer(g_hProtectionTimer);
}
g_hProtectionTimer = CreateTimer(g_flProtectionTime, Timer_RemoveProtection, _, TIMER_FLAG_NO_MAPCHANGE);
}
public Action:Timer_RemoveProtection(Handle:hTimer, any:data)
{
for ( new i = 1; i <= MaxClients; i++ )
{
if ( IsClientInGame(i) )
{
if ( GetClientTeam(i) == 2 )
{
if ( IsClientInside(i, g_flTBuyZoneMins[0], g_flTBuyZoneMaxs[0]) )
{
if ( g_bNotice )
{
CPrintToChat(i, "%t", "ended");
}
if ( g_bChangeColor )
{
SetEntityRenderColor(i, 255, 255, 255, 255);
SetEntityRenderMode(i, RENDER_NORMAL);
}
}
}
else if ( GetClientTeam(i) == 3 )
{
if ( IsClientInside(i, g_flCTBuyZoneMins[0], g_flCTBuyZoneMaxs[0]) )
{
if ( g_bNotice )
{
CPrintToChat(i, "%t", "ended");
}
if ( g_bChangeColor )
{
SetEntityRenderColor(i, 255, 255, 255, 255);
SetEntityRenderMode(i, RENDER_NORMAL);
}
}
}
}
}
g_hProtectionTimer = INVALID_HANDLE;
return Plugin_Stop;
}
DrawZoneByCoords(const Float:flMins[2][3], const Float:flMaxs[2][3], const iColor[4])
{
decl Float:flBuffer1[3], Float:flBuffer2[3];
flBuffer1[0] = flMaxs[0][0];
flBuffer1[1] = flMaxs[0][1];
flBuffer1[2] = flMaxs[0][2];
flBuffer2[0] = flMaxs[1][0];
flBuffer2[1] = flMaxs[1][1];
flBuffer2[2] = flMaxs[0][2];
TE_SetupBeamPoints(flBuffer1, flBuffer2, g_iModelEntity, 0, 0, 0, g_flProtectionTime, 20.0, 20.0, 0, 0.0, iColor, 0);
TE_SendToAll();
flBuffer1[0] = flMaxs[0][0];
flBuffer1[1] = flMaxs[0][1];
flBuffer1[2] = flMaxs[0][2];
flBuffer2[0] = flMins[1][0];
flBuffer2[1] = flMins[1][1];
flBuffer2[2] = flMaxs[0][2];
TE_SetupBeamPoints(flBuffer1, flBuffer2, g_iModelEntity, 0, 0, 0, g_flProtectionTime, 20.0, 20.0, 0, 0.0, iColor, 0);
TE_SendToAll();
flBuffer1[0] = flMins[0][0];
flBuffer1[1] = flMins[0][1];
flBuffer1[2] = flMaxs[0][2];
flBuffer2[0] = flMaxs[1][0];
flBuffer2[1] = flMaxs[1][1];
flBuffer2[2] = flMaxs[0][2];
TE_SetupBeamPoints(flBuffer1, flBuffer2, g_iModelEntity, 0, 0, 0, g_flProtectionTime, 20.0, 20.0, 0, 0.0, iColor, 0);
TE_SendToAll();
flBuffer1[0] = flMins[0][0];
flBuffer1[1] = flMins[0][1];
flBuffer1[2] = flMaxs[0][2];
flBuffer2[0] = flMins[1][0];
flBuffer2[1] = flMins[1][1];
flBuffer2[2] = flMaxs[0][2];
TE_SetupBeamPoints(flBuffer1, flBuffer2, g_iModelEntity, 0, 0, 0, g_flProtectionTime, 20.0, 20.0, 0, 0.0, iColor, 0);
TE_SendToAll();
}
bool:IsClientInside(const &iClient, const Float:flMins[3], const Float:flMaxs[3])
{
decl Float:flOrigin[3];
GetClientAbsOrigin(iClient, flOrigin);
if (flOrigin[0] >= flMins[0] && flOrigin[0] <= flMaxs[0] &&
flOrigin[1] >= flMins[1] && flOrigin[1] <= flMaxs[1] &&
flOrigin[2] >= flMins[2] && flOrigin[2] <= flMaxs[2])
{
return true;
}
else
{
return false;
}
}
public Action:OnPlayerRunCmd(iClient, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon, &subtype, &cmdnum, &tickcount, &seed, mouse[2])
{
if ( g_bRestrictShootFromZone && g_hProtectionTimer != INVALID_HANDLE )
{
if ( GetEntProp(iClient, Prop_Send, "m_bInBuyZone") == 1 )
{
if ( buttons & IN_ATTACK )
{
if ( GetClientTeam(iClient) == 2 )
{
if ( IsClientInside(iClient, g_flTBuyZoneMins[0], g_flTBuyZoneMaxs[0]) )
{
buttons &= ~IN_ATTACK;
PrintCenterText(iClient, "%t", "shoot blocked");
}
}
else if ( GetClientTeam(iClient) == 3 )
{
if ( IsClientInside(iClient, g_flCTBuyZoneMins[0], g_flCTBuyZoneMaxs[0]) )
{
buttons &= ~IN_ATTACK;
PrintCenterText(iClient, "%t", "shoot blocked");
}
}
}
}
}
}
public OnTZoneStartTouch(iEntity, iToucher)
{
if ( 0 < iToucher <= MaxClients && g_hProtectionTimer != INVALID_HANDLE )
{
if ( GetClientTeam(iToucher) == 2 )
{
if ( g_bNotice )
{
CPrintToChat(iToucher, "%t", "entered");
}
if ( g_bChangeColor )
{
SetEntityRenderMode(iToucher, RENDER_TRANSCOLOR);
SetEntityRenderColor(iToucher, g_iTColor[0], g_iTColor[1], g_iTColor[2], g_iTColor[3]);
}
}
}
}
public OnCTZoneStartTouch(iEntity, iToucher)
{
if ( 0 < iToucher <= MaxClients && g_hProtectionTimer != INVALID_HANDLE )
{
if ( GetClientTeam(iToucher) == 3 )
{
if ( g_bNotice )
{
CPrintToChat(iToucher, "%t", "entered");
}
if ( g_bChangeColor )
{
SetEntityRenderMode(iToucher, RENDER_TRANSCOLOR);
SetEntityRenderColor(iToucher, g_iCTColor[0], g_iCTColor[1], g_iCTColor[2], g_iCTColor[3]);
}
}
}
}
public OnTZoneEndTouch(iEntity, iToucher)
{
if ( 0 < iToucher <= MaxClients && g_hProtectionTimer != INVALID_HANDLE )
{
if ( !IsClientInGame(iToucher) )
{
return;
}
if ( GetClientTeam(iToucher) == 2 )
{
if ( g_bNotice )
{
CPrintToChat(iToucher, "%t", "leaved");
}
if ( g_bChangeColor )
{
SetEntityRenderColor(iToucher, 255, 255, 255, 255);
SetEntityRenderMode(iToucher, RENDER_NORMAL);
}
}
}
}
public OnCTZoneEndTouch(iEntity, iToucher)
{
if ( 0 < iToucher <= MaxClients && g_hProtectionTimer != INVALID_HANDLE )
{
if ( !IsClientInGame(iToucher) )
{
return;
}
if ( GetClientTeam(iToucher) == 3 )
{
if ( g_bNotice )
{
CPrintToChat(iToucher, "%t", "leaved");
}
if ( g_bChangeColor )
{
SetEntityRenderColor(iToucher, 255, 255, 255, 255);
SetEntityRenderMode(iToucher, RENDER_NORMAL);
}
}
}
}