#include <sourcemod>
#include <sdktools>
#include <vip_core>
#define VERSION "1.0.0"
public Plugin:myinfo =
{
name = "[VIP] Paint",
author = "Unknown",
description = "paint",
version = VERSION,
url = ""
}
new const 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} };
new Float:LastLaser[MAXPLAYERS+1][3];
new bool:LaserE[MAXPLAYERS+1];
new g_sprite;
public OnPluginStart()
{
RegConsoleCmd("+paint", CMD_laser_p);
RegConsoleCmd("-paint", CMD_laser_m);
if(VIP_IsVIPLoaded())
{
VIP_OnVIPLoaded();
}
}
static const String:g_sFeature[] = "paint";
public VIP_OnVIPLoaded()
{
VIP_RegisterFeature(g_sFeature, BOOL);
}
public OnMapStart() {
g_sprite = PrecacheModel("materials/sprites/laserbeam.vmt");
CreateTimer(0.1, Timer_Pay, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}
public OnClientPutInServer(client)
{
LaserE[client] = false;
LastLaser[client][0] = 0.0;
LastLaser[client][1] = 0.0;
LastLaser[client][2] = 0.0;
}
public Action:Timer_Pay(Handle:timer)
{
static Float:pos[3], iColor, i; // Переменные создаем static (в уроках написано что это)
for(i = 1; i <= MaxClients; ++i)
{
if(LaserE[i] && IsClientInGame(i)) // к переменной плагина доступ быстрее чем к внешней ф-и, сначала проще отсеять игроков без доступа, а потом уже проверять их валидность
{
TraceEye(i, pos);
if(GetVectorDistance(pos, LastLaser[i]) > 6.0)
{
LaserP(LastLaser[i], pos, g_DefaultColors_c[GetRandomInt(0,6)]); // Рандом делаем здесь, чтобы у каждого игрока был случайный цвет, а не один для всех
LastLaser[i][0] = pos[0];
LastLaser[i][1] = pos[1];
LastLaser[i][2] = pos[2];
}
}
}
}
public Action:CMD_laser_p(iClient, args) {
if(VIP_IsClientVIP(iClient) && VIP_IsClientFeatureUse(iClient, g_sFeature))
{
TraceEye(iClient, LastLaser[iClient]); LaserE[iClient] = true;
}
return Plugin_Handled;
}
public Action:CMD_laser_m(client, args) {
LastLaser[client][0] = 0.0;
LastLaser[client][1] = 0.0;
LastLaser[client][2] = 0.0;
LaserE[client] = false;
return Plugin_Handled;
}
stock LaserP(Float:start[3], Float:end[3], color[4]) {
TE_SetupBeamPoints(start, end, g_sprite, 0, 0, 0, 25.0, 2.0, 2.0, 10, 0.0, color, 0);
TE_SendToAll();
}
TraceEye(client, Float:pos[3]) {
decl 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);
return;
}
public bool:TraceEntityFilterPlayer(entity, contentsMask) {
return (entity > GetMaxClients() || !entity);
}
public OnPluginEnd()
{
if(CanTestFeatures() && GetFeatureStatus(FeatureType_Native, "VIP_UnregisterFeature") == FeatureStatus_Available)
{
VIP_UnregisterFeature(g_sFeature);
}
}