float LastLaser[MAXPLAYERS+1][3],
g_lasersize[MAXPLAYERS + 1] = { 2.0, ... },
g_lasertime[MAXPLAYERS+1];
bool LaserE[MAXPLAYERS+1],random[MAXPLAYERS+1],
dostup[MAXPLAYERS+1];
int g_sprite,
g_colorchosen[MAXPLAYERS + 1][4];
char g_sFeature[][] = {"paint", "paint_menu"};
int g_DefaultColors_c[7][4] = { {255,255,255,255}, {255,0,0,255}, {0,255,0,255}, {0,0,255,255}, {255,255,0,255}, {0,255,255,255}, {255,0,255,255} };
public int OnPluginStart()
{
RegConsoleCmd("+paint", paint);
RegConsoleCmd("-paint", paint_s);
if (VIP_IsVIPLoaded())
{
VIP_OnVIPLoaded();
}
HookEvent("player_death", Event_OnPlayerDeath, EventHookMode_Post);
}
public Action Event_OnPlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
int client = GetClientOfUserId(event.GetInt("userid"));
if (client && IsClientInGame(client))
{
LaserE[client] = false;
}
return Plugin_Continue;
}
public int VIP_OnVIPLoaded()
{
VIP_RegisterFeature(g_sFeature[0], BOOL, _, OnClientEnable);
VIP_RegisterFeature(g_sFeature[1], _, SELECTABLE, OnSelectItem, _, OnDrawItem);
}
public Action OnClientEnable(int client, const char[] szFeatureName, VIP_ToggleState EOldStatus, VIP_ToggleState &ENewStatus) {
if(ENewStatus == ENABLED)
{
paint_d(client, 0);
}
else
{
paint_ss(client, 0);
}
return Plugin_Continue;
}
public int OnDrawItem(int client,const char[] sFeatureName,int iStyle)
{
switch(VIP_GetClientFeatureStatus(client, g_sFeature[0]))
{
case ENABLED: return ITEMDRAW_DEFAULT;
case DISABLED: return ITEMDRAW_DISABLED;
case NO_ACCESS: return ITEMDRAW_RAWLINE;
}
return iStyle;
}
public bool OnSelectItem(int client, char[] sFeatureName)
{
MainMenuPaint(client);
return false;
}
public int OnMapStart()
{
g_sprite = PrecacheModel("materials/sprites/laserbeam.vmt");
CreateTimer(0.1, Timer_Pay, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}
public int OnClientPutInServer(int client)
{
random[client] = false;
LaserE[client] = false;
LastLaser[client][0] = 0.0;
LastLaser[client][1] = 0.0;
LastLaser[client][2] = 0.0;
g_lasersize[client] = 2.0;
g_lasertime[client] = 10.0;
g_colorchosen[client] = {255, 255, 255, 255};
}
public Action Timer_Pay(Handle timer)
{
static float pos[3];
static int i;
for (i = 1; i++ <= MaxClients;)
{
if (dostup && LaserE && IsClientInGame(i))
{
if(random) g_colorchosen = g_DefaultColors_c[GetRandomInt(0,6)];
TraceEye(i, pos);
if (GetVectorDistance(pos, LastLaser) > 6.0)
{
TE_SetupBeamPoints(LastLaser, pos, g_sprite, 0, 0, 0, g_lasertime, g_lasersize, g_lasersize, 10, 0.0, g_colorchosen, 0); TE_SendToAll();
LastLaser[0] = pos[0];
LastLaser[1] = pos[1];
LastLaser[2] = pos[2];
}
}
}
}
public Action paint_d(int client, int args)
{
dostup[client] = true;
}
public Action paint_ss(int client, int args)
{
dostup[client] = false;
}
public Action paint(int client, int args)
{
if (VIP_IsClientVIP(client) && VIP_IsClientFeatureUse(client, g_sFeature[0]) && IsPlayerAlive(client))
{
TraceEye(client, LastLaser[client]);
LaserE[client] = true;
}
}
public Action paint_s(int client,int args)
{
LastLaser[client][0] = 0.0;
LastLaser[client][1] = 0.0;
LastLaser[client][2] = 0.0;
LaserE[client] = false;
return Plugin_Handled;
}
int TraceEye(int client, float pos[3])
{
float vAngles[3];
float vOrigin[3];
GetClientEyePosition(client, vOrigin);
GetClientEyeAngles(client, vAngles);
TR_TraceRayFilter(vOrigin, vAngles, MASK_SHOT, RayType_Infinite, TraceEntityFilterPlayer);
if (TR_DidHit(INVALID_HANDLE))
{
TR_GetEndPosition(pos, INVALID_HANDLE);
}
}
public bool TraceEntityFilterPlayer(int entity, int contentsMask)
{
return (entity > GetMaxClients() || !entity);
}
public int MainMenuPaint(int client)
{
Menu menu = new Menu(MainMenuHandler);
menu.SetTitle("Меню рисовалки");
menu.ExitBackButton = true;
menu.AddItem(nullstr, "Размер линий");
menu.AddItem(nullstr, "Время линии");
menu.AddItem(nullstr, "Цвет лазера");
menu.Display(client, MENU_TIME_FOREVER);
}
public int TimeMenu(int client)
{
Menu menu = new Menu(TimeMenuHandler);
menu.SetTitle("Время линий");
menu.ExitBackButton = true;
menu.AddItem(nullstr, "5 секунда");
menu.AddItem(nullstr, "10 секунд");
menu.AddItem(nullstr, "20 секунд");
menu.AddItem(nullstr, "40 секунд");
menu.AddItem(nullstr, "Минута");
menu.Display(client, MENU_TIME_FOREVER);
}
public int SizeMenu(int client)
{
Menu menu = new Menu(SizeMenuHandler);
menu.SetTitle("Размер линий");
menu.ExitBackButton = true;
menu.AddItem(nullstr, "1");
menu.AddItem(nullstr, "2");
menu.AddItem(nullstr, "3");
menu.AddItem(nullstr, "4");
menu.Display(client, MENU_TIME_FOREVER);
}
public int ColorMenu(int client)
{
Menu menu = new Menu(ColorMenuHandler);
menu.SetTitle("Цвет лазера");
menu.ExitBackButton = true;
menu.AddItem(nullstr, "Белый");
menu.AddItem(nullstr, "Красный");
menu.AddItem(nullstr, "Зелёный");
menu.AddItem(nullstr, "Синий");
menu.AddItem(nullstr, "Жёлтый");
menu.AddItem(nullstr, "Бирюзовый");
menu.AddItem(nullstr, "Розовый");
menu.AddItem(nullstr, "Рандомный");
menu.Display(client, MENU_TIME_FOREVER);
}
public int MainMenuHandler(Menu menu, MenuAction action, int client, int a)
{
switch(action)
{
case MenuAction_Select:
{
switch (a)
{
case 0:
{
SizeMenu(client);
}
case 1:
{
TimeMenu(client);
}
case 2:
{
ColorMenu(client);
}
}
}
case MenuAction_Cancel:
{
if (a == MenuCancel_ExitBack)
VIP_SendClientVIPMenu(client);
}
}
}
public int ColorMenuHandler(Menu menu, MenuAction action, int client, int a)
{
switch(action)
{
case MenuAction_Select:
{
switch (a)
{
case 0:
{
random[client] = false;
g_colorchosen[client] = {255, 255, 255, 255};
}
case 1:
{
random[client] = false;
g_colorchosen[client] = {255, 0, 0, 255};
}
case 2:
{
random[client] = false;
g_colorchosen[client] = {0, 255, 0, 255};
}
case 3:
{
random[client] = false;
g_colorchosen[client] = {0, 0, 255, 255};
}
case 4:
{
random[client] = false;
g_colorchosen[client] = {255, 255, 0, 255};
}
case 5:
{
random[client] = false;
g_colorchosen[client] = {0, 255, 255, 255};
}
case 6:
{
random[client] = false;
g_colorchosen[client] = {255, 0, 255, 255};
}
case 7:
{
random[client] = true;
}
}
ColorMenu(client);
}
case MenuAction_Cancel:
{
if (a == MenuCancel_ExitBack)
MainMenuPaint(client);
}
}
}
public int SizeMenuHandler(Menu menu, MenuAction action, int client, int a)
{
switch(action)
{
case MenuAction_Select:
{
g_lasersize[client] = float((a + 1) * 2);
SizeMenu(client);
}
case MenuAction_Cancel:
{
if (a == MenuCancel_ExitBack)
MainMenuPaint(client);
}
}
}
public int TimeMenuHandler(Menu menu, MenuAction action, int client, int a)
{
switch(action)
{
case MenuAction_Select:
{
switch (a)
{
case 0:{ g_lasertime[client] = 5.0;}
case 1:{ g_lasertime[client] = 10.0;}
case 2:{ g_lasertime[client] = 20.0;}
case 3:{ g_lasertime[client] = 40.0;}
case 4:{ g_lasertime[client] = 60.0;}
}
TimeMenu(client);
}
case MenuAction_Cancel:
{
if (a == MenuCancel_ExitBack)
MainMenuPaint(client);
}
}
}
public int OnPluginEnd()
{
if (CanTestFeatures() && GetFeatureStatus(FeatureType_Native, "VIP_UnregisterFeature") == FeatureStatus_Available)
{
VIP_UnregisterFeature(g_sFeature[0]);
VIP_UnregisterFeature(g_sFeature[1]);
}
}