PHP Code:
#include <sourcemod>
#include <sdktools>
#pragma semicolon 1
#define SOUND_BLIP "buttons/blip1.wav"
#define DEFAULT_TIMER_FLAGS TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE
new g_BeamSprite= -1;
new g_HaloSprite= -1;
new redColor[4] = {255, 75, 75, 255};
new greenColor[4] = {75, 255, 75, 255};
new blueColor[4] = {75, 75, 255, 255};
new greyColor[4] = {128, 128, 128, 255};
new g_BeaconSerial[MAXPLAYERS+1] = { 0, ... };
new g_Serial_Gen = 0;
new Handle:g_Cvar_BeaconRadius = INVALID_HANDLE;
public Plugin:myinfo =
{
name = "Beacon",
author = "AlliedModders LLC",
description = "Toggle self beacon",
version = "1.0",
url = "http://www.sourcemod.net/"
}
public OnPluginStart()
{
g_Cvar_BeaconRadius = CreateConVar("sm_beacon_rad", "375", "Sets the radius for beacon's light rings.", 0, true, 50.0, true, 1500.0);
RegConsoleCmd("sm_bc", Command_Beacon, "Toggles beacon");
HookEvents();
AutoExecConfig(true,"sm_bc");
}
public OnMapStart()
{
PrecacheSound(SOUND_BLIP, true);
new sdkversion = GuessSDKVersion();
if (sdkversion == SOURCE_SDK_LEFT4DEAD || sdkversion == SOURCE_SDK_LEFT4DEAD2)
{
g_BeamSprite = PrecacheModel("materials/sprites/laserbeam.vmt");
g_HaloSprite = PrecacheModel("materials/sprites/glow01.vmt");
}
else
{
g_BeamSprite = PrecacheModel("materials/sprites/laser.vmt");
g_HaloSprite = PrecacheModel("materials/sprites/halo01.vmt");
}
}
HookEvents( )
{
decl String:folder[64];
GetGameFolderName(folder, sizeof(folder));
if (strcmp(folder, "tf") == 0)
{
HookEvent("teamplay_win_panel", Event_RoundEnd, EventHookMode_PostNoCopy);
HookEvent("teamplay_restart_round", Event_RoundEnd, EventHookMode_PostNoCopy);
HookEvent("arena_win_panel", Event_RoundEnd, EventHookMode_PostNoCopy);
}
else if (strcmp(folder, "nucleardawn") == 0)
{
HookEvent("round_win", Event_RoundEnd, EventHookMode_PostNoCopy);
}
else
{
HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
}
}
public OnMapEnd()
{
KillAllBeacons( );
}
public Action:Event_RoundEnd(Handle:event,const String:name[],bool:dontBroadcast)
{
KillAllBeacons( );
}
CreateBeacon(client)
{
g_BeaconSerial[client] = ++g_Serial_Gen;
CreateTimer(1.0, Timer_Beacon, client | (g_Serial_Gen << 7), DEFAULT_TIMER_FLAGS);
}
KillBeacon(client)
{
g_BeaconSerial[client] = 0;
if (IsClientInGame(client))
{
SetEntityRenderColor(client, 255, 255, 255, 255);
}
}
KillAllBeacons()
{
for (new i = 1; i <= MaxClients; i++)
{
KillBeacon(i);
}
}
PerformBeacon(client)
{
if (g_BeaconSerial[client] == 0)
{
CreateBeacon(client);
LogAction(client, client, "\"%L\" set a beacon on himself", client);
}
else
{
KillBeacon(client);
LogAction(client, client, "\"%L\" removed a beacon on himself", client);
}
}
public Action:Timer_Beacon(Handle:timer, any:value)
{
new client = value & 0x7f;
new serial = value >> 7;
if (!IsClientInGame(client)
|| !IsPlayerAlive(client)
|| g_BeaconSerial[client] != serial)
{
KillBeacon(client);
return Plugin_Stop;
}
new team = GetClientTeam(client);
new Float:vec[3];
GetClientAbsOrigin(client, vec);
vec[2] += 10;
TE_SetupBeamRingPoint(vec, 10.0, GetConVarFloat(g_Cvar_BeaconRadius), g_BeamSprite, g_HaloSprite, 0, 15, 0.5, 5.0, 0.0, greyColor, 10, 0);
TE_SendToAll();
if (team == 2)
{
TE_SetupBeamRingPoint(vec, 10.0, GetConVarFloat(g_Cvar_BeaconRadius), g_BeamSprite, g_HaloSprite, 0, 10, 0.6, 10.0, 0.5, redColor, 10, 0);
}
else if (team == 3)
{
TE_SetupBeamRingPoint(vec, 10.0, GetConVarFloat(g_Cvar_BeaconRadius), g_BeamSprite, g_HaloSprite, 0, 10, 0.6, 10.0, 0.5, blueColor, 10, 0);
}
else
{
TE_SetupBeamRingPoint(vec, 10.0, GetConVarFloat(g_Cvar_BeaconRadius), g_BeamSprite, g_HaloSprite, 0, 10, 0.6, 10.0, 0.5, greenColor, 10, 0);
}
TE_SendToAll();
GetClientEyePosition(client, vec);
EmitAmbientSound(SOUND_BLIP, vec, client, SNDLEVEL_RAIDSIREN);
return Plugin_Continue;
}
public Action:Command_Beacon(client, args)
{
if(client>0&&IsPlayerAlive(client))
PerformBeacon(client);
return Plugin_Handled;
}