Raised This Month: $ Target: $400
 0% 

Lysis: An experimental .smx decompiler


Post New Thread Reply   
 
Thread Tools Display Modes
Peace-Maker
SourceMod Plugin Approver
Join Date: Aug 2008
Location: Germany
Old 12-19-2012 , 09:14   Re: Lysis: An experimental .smx decompiler
Reply With Quote #131

The "genarray_z" opcode is emitted for stuff like
PHP Code:
new 5;
a+100;
new array[
a]; 
So whenever you're declaring an array which size is unknown on compiletime.

These guys try hard to find bugs in lysis

Edit: Looks like the previous attempt has been from the same guys at world-source.ru. What's your problem?

Spoiler


Code:
public PlVers:__version =
{
    version = 5,
    filevers = "1.4.2",
    date = "12/19/2012",
    time = "10:01:32"
};
new Float:NULL_VECTOR[3];
new String:NULL_STRING[1];
public Extension:__ext_core =
{
    name = "Core",
    file = "core",
    autoload = 0,
    required = 0,
};
new MaxClients;
new TEST_VERSION = 1;
new String:PLUGIN_NAME[3] = "VIP Plugin";
new String:PLUGIN_VERS[2] = "v2.0";
new g_Num;
new String:FOR_IP_PORT[1];
public Extension:__ext_sdktools =
{
    name = "SDKTools",
    file = "sdktools.ext",
    autoload = 1,
    required = 1,
};
public Extension:__ext_cstrike =
{
    name = "cstrike",
    file = "games/game.cstrike.ext",
    autoload = 0,
    required = 1,
};
public Plugin:myinfo =
{
    name = "VIP Plugin",
    description = "",
    author = "wS (World-Source.Ru)",
    version = "v2.0",
    url = "http://world-source.ru/"
};
new String:g_ErrorLogFile[5] = "cfg/vip/errors.log";
new bool:g_VipHave[66][32];
new bool:g_VipFeatureOn[66][32];
new g_VipValue[66][59];
new Handle:g_CookieTrie[22];
new Handle:g_Event_VIP_Removed;
new Handle:g_Event_VIP_Added;
new Handle:g_Event_VIP_TimeChanged;
new Handle:g_Event_VIP_Joined;
new Handle:g_SQL;
new bool:g_MYSQL;
new String:g_SteamId[66][7];
new Handle:g_VipDelTimerTrie;
new g_VipGroups_Count;
new Handle:g_VipGroupTrie;
new Handle:g_VipGroupTrie_hp;
new Handle:g_VipGroupTrie_speed;
new Handle:g_VipGroupTrie_color;
new Handle:g_VipGroupTrie_skin_t;
new Handle:g_VipGroupTrie_skin_ct;
new Handle:g_VipGroupTrie_rehp;
new Handle:g_VipGroupTrie_chat;
new Handle:g_VipGroupTrie_gravity;
new Handle:g_VipGroupTrie_cash;
new Handle:g_VipGroupTrie_armor;
new Handle:g_VipGroupTrie_noblind;
new Handle:g_VipGroupTrie_defuse;
new Handle:g_VipGroupTrie_trail;
new Handle:g_VipGroupTrie_team;
new Handle:g_VipGroupTrie_overlay;
new Handle:g_VipGroupTrie_he;
new Handle:g_VipGroupTrie_sg;
new Handle:g_VipGroupTrie_fb;
new Handle:g_VipGroupTrie_laser;
new Handle:g_VipGroupTrie_c4;
new Handle:g_VipGroupTrie_fraghp;
new Handle:g_VipGroupTrie_water;
new Handle:g_VipGroupTrie_immun;
new Handle:g_VipGroupTrie_admin;
new Handle:g_VipGroupTrie_respawn;
new Handle:g_VipGroupTrie_tele;
new Handle:g_VipGroupTrie_dropgren;
new Handle:g_VipGroupTrie_barrel;
new Handle:g_VipGroupTrie_beam;
new Handle:g_VipGroupTrie_ammo;
new Handle:g_VipGroupTrie_hostage;
new Handle:g_VipGroupTrie_gren_effect;
new bool:g_VipAccess[66];
new g_VipTime[66];
new Handle:g_VipMenu[66];
new String:g_MyVipGroup[66][17];
new Float:g_MyGameTimeWhenSelectOption[66];
new Handle:g_ChatCommandsTrie;
new Handle:g_Array_Overlays;
new g_OverlaysCount;
new Handle:g_RehpTimer[66];
new bool:g_MyVipGroupExists[66];
new Handle:g_Trie_AdminFlagName;
new g_MyOverlayItem[66];
new g_MyTrailIndex[66];
new g_FlashDuration_Offs = -1;
new g_FlashAlpha_Offs = -1;
new g_LaserIndex;
new g_Dissolver;
new bool:g_MapType_de;
new g_Hurt_Attacker;
new g_Hurt_Victim;
new g_MyLastVipMenuItem[66];
new Handle:g_Trails_Menu;
new g_MyTrailNum[66];
new Handle:g_RedVipSkinsMenu;
new Handle:g_BluVipSkinsMenu;
new g_MyRedSkinNum[66];
new g_MyBluSkinNum[66];
new g_HeColor[4] =
{
    255, 0, 0, 255
};
new g_SgColor[4] =
{
    0, 255, 0, 255
};
new g_FbColor[4] =
{
    255, ...
};
new Handle:g_TeamPanel;
new Handle:g_VipSkinColorsMenu;
new g_MySkinColorItem[66];
new g_MySkinColor[66][4];
new Handle:vip_cvar_hide_options;
new Handle:vip_cvar_flood_protect_sec;
new Handle:vip_cvar_test_menu;
new Handle:vip_cvar_join_open_menu;
new Handle:vip_cvar_functions_status;
new Handle:vip_cvar_trail_lifetime;
new Handle:vip_cvar_trail_startwidth;
new Handle:vip_cvar_trail_endwidth;
new Handle:vip_cvar_trail_height;
new Handle:vip_cvar_laser_width;
new Handle:vip_cvar_laser_life;
new Handle:vip_cvar_laser_clear;
new Handle:vip_cvar_laser_team;
new Handle:vip_cvar_he_rgba;
new Handle:vip_cvar_sg_rgba;
new Handle:vip_cvar_fb_rgba;
public __ext_core_SetNTVOptional()
{
    MarkNativeAsOptional("GetFeatureStatus");
    MarkNativeAsOptional("RequireFeature");
    MarkNativeAsOptional("AddCommandListener");
    MarkNativeAsOptional("RemoveCommandListener");
    VerifyCoreVersion();
    return 0;
}

bool:operator!=(Float:,Float:)(Float:oper1, Float:oper2)
{
    return FloatCompare(oper1, oper2) != 0;
}

bool:operator>(Float:,Float:)(Float:oper1, Float:oper2)
{
    return FloatCompare(oper1, oper2) > 0;
}

bool:operator<(Float:,Float:)(Float:oper1, Float:oper2)
{
    return FloatCompare(oper1, oper2) < 0;
}

bool:StrEqual(String:str1[], String:str2[], bool:caseSensitive)
{
    return strcmp(str1, str2, caseSensitive) == 0;
}

CharToLower(chr)
{
    if (IsCharUpper(chr)) {
        return chr | 32;
    }
    return chr;
}

ExplodeString(String:text[], String:split[], String:buffers[][], maxStrings, maxStringLength, bool:copyRemainder)
{
    new reloc_idx = 0;
    new idx = 0;
    new total = 0;
    new var1;
    if (maxStrings < 1 || !split[0]) {
        return 0;
    }
    new var2 = SplitString(text[reloc_idx], split, buffers[total], maxStringLength);
    idx = var2;
    while (var2 != -1) {
        reloc_idx = idx + reloc_idx;
        total++;
        if (maxStrings == total) {
            if (copyRemainder) {
                strcopy(buffers[total + -1], maxStringLength, text[reloc_idx - idx]);
            }
            return total;
        }
    }
    total++;
    strcopy(buffers[total], maxStringLength, text[reloc_idx]);
    return total;
}

Handle:CreateDataTimer(Float:interval, Timer:func, &Handle:datapack, flags)
{
    datapack = CreateDataPack();
    flags |= 512;
    return CreateTimer(interval, func, datapack, flags);
}

Handle:SQLite_UseDatabase(String:database[], String:error[], maxlength)
{
    new Handle:kv = 0;
    new Handle:db = 0;
    kv = CreateKeyValues("", "", "");
    KvSetString(kv, "driver", "sqlite");
    KvSetString(kv, "database", database);
    db = SQL_ConnectCustom(kv, error, maxlength, false);
    CloseHandle(kv);
    return db;
}

Handle:StartMessageAll(String:msgname[], flags)
{
    new total = 0;
    new clients[MaxClients];
    new i = 1;
    while (i <= MaxClients) {
        if (IsClientConnected(i)) {
            total++;
            clients[total] = i;
            i++;
        }
        i++;
    }
    return StartMessage(msgname, clients, total, flags);
}

Handle:StartMessageOne(String:msgname[], client, flags)
{
    decl players[1];
    players[0] = client;
    return StartMessage(msgname, players, 1, flags);
}

PrintToChatAll(String:format[])
{
    decl String:buffer[192];
    new i = 1;
    while (i <= MaxClients) {
        if (IsClientInGame(i)) {
            SetGlobalTransTarget(i);
            VFormat(buffer, 192, format, 2);
            PrintToChat(i, "%s", buffer);
            i++;
        }
        i++;
    }
    return 0;
}

GetEntSendPropOffs(ent, String:prop[], bool:actual)
{
    decl String:cls[64];
    if (!GetEntityNetClass(ent, cls, 64)) {
        return -1;
    }
    if (actual) {
        return FindSendPropInfo(cls, prop, 0, 0, 0);
    }
    return FindSendPropOffs(cls, prop);
}

bool:GetEntityClassname(entity, String:clsname[], maxlength)
{
    return !!GetEntPropString(entity, PropType:1, "m_iClassname", clsname, maxlength, 0);
}

SetEntityMoveType(entity, MoveType:mt)
{
    static bool:gotconfig;
    static String:datamap[8];
    if (!gotconfig) {
        new Handle:gc = LoadGameConfigFile("core.games");
        new bool:exists = GameConfGetKeyValue(gc, "m_MoveType", "", 32);
        CloseHandle(gc);
        if (!exists) {
            strcopy("", 32, "m_MoveType");
        }
        gotconfig = true;
    }
    SetEntProp(entity, PropType:1, "", mt, 4, 0);
    return 0;
}

SetEntityRenderMode(entity, RenderMode:mode)
{
    static bool:gotconfig;
    static String:prop[8];
    if (!gotconfig) {
        new Handle:gc = LoadGameConfigFile("core.games");
        new bool:exists = GameConfGetKeyValue(gc, "m_nRenderMode", "", 32);
        CloseHandle(gc);
        if (!exists) {
            strcopy("", 32, "m_nRenderMode");
        }
        gotconfig = true;
    }
    SetEntProp(entity, PropType:0, "", mode, 1, 0);
    return 0;
}

SetEntityRenderColor(entity, r, g, b, a)
{
    static bool:gotconfig;
    static String:prop[8];
    if (!gotconfig) {
        new Handle:gc = LoadGameConfigFile("core.games");
        new bool:exists = GameConfGetKeyValue(gc, "m_clrRender", "", 32);
        CloseHandle(gc);
        if (!exists) {
            strcopy("", 32, "m_clrRender");
        }
        gotconfig = true;
    }
    new offset = GetEntSendPropOffs(entity, "", false);
    if (0 >= offset) {
        ThrowError("SetEntityRenderColor not supported by this mod");
    }
    SetEntData(entity, offset, r, 1, true);
    SetEntData(entity, offset + 1, g, 1, true);
    SetEntData(entity, offset + 2, b, 1, true);
    SetEntData(entity, offset + 3, a, 1, true);
    return 0;
}

Float:GetEntityGravity(entity)
{
    static bool:gotconfig;
    static String:datamap[8];
    if (!gotconfig) {
        new Handle:gc = LoadGameConfigFile("core.games");
        new bool:exists = GameConfGetKeyValue(gc, "m_flGravity", "", 32);
        CloseHandle(gc);
        if (!exists) {
            strcopy("", 32, "m_flGravity");
        }
        gotconfig = true;
    }
    return GetEntPropFloat(entity, PropType:1, "", 0);
}

SetEntityGravity(entity, Float:amount)
{
    static bool:gotconfig;
    static String:datamap[8];
    if (!gotconfig) {
        new Handle:gc = LoadGameConfigFile("core.games");
        new bool:exists = GameConfGetKeyValue(gc, "m_flGravity", "", 32);
        CloseHandle(gc);
        if (!exists) {
            strcopy("", 32, "m_flGravity");
        }
        gotconfig = true;
    }
    SetEntPropFloat(entity, PropType:1, "", amount, 0);
    return 0;
}

String:wS_GetMyNick()
{
    static String:wS[1] = "wS";
    return String:684;
}

wS_Protect_IpPort()
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
    }
    if (TEST_VERSION == 1) {
        return 0;
    }
    static Handle:cvar_hostip;
    static Handle:cvar_hostport;
    static bool:cvar_hook;
    if (!cvar_hostip) {
        cvar_hostip = FindConVar("hostip");
        cvar_hostport = FindConVar("hostport");
    }
    new var1;
    if (cvar_hostip && cvar_hostport) {
        SetFailState("hostip || hostport == INVALID_HANDLE");
        return 0;
    }
    new hostip = GetConVarInt(cvar_hostip);
    new ip1 = hostip >> 24 & 255;
    new ip2 = hostip >> 16 & 255;
    new ip3 = hostip >> 8 & 255;
    new ip4 = hostip & 255;
    decl String:current_ip_port[76];
    Format(current_ip_port, 75, "%d_%d_%d_%d_%d", ip1, ip2, ip3, ip4, GetConVarInt(cvar_hostport));
    if (!StrEqual(current_ip_port, FOR_IP_PORT, false)) {
        SetFailState("\nPlugin is not for this server!\nYour server: \"%s\". Owner: \"%s\".\nhttp://world-source.ru/index/buy/0-97", current_ip_port, FOR_IP_PORT);
        return 0;
    }
    if (!cvar_hook) {
        cvar_hook = true;
        HookConVarChange(cvar_hostip, cvar_hostip_ip_port_changed);
        HookConVarChange(cvar_hostport, cvar_hostip_ip_port_changed);
    }
    return 0;
}

public cvar_hostip_ip_port_changed(Handle:cVar, String:OldValue[], String:NewValue[])
{
    wS_Protect_IpPort();
    return 0;
}

wS_Protect_Kick(wait_sec)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
    }
    new i = 1;
    while (i <= MaxClients) {
        new var1;
        if (IsValidEntity(i) && IsClientInGame(i)) {
            KickClient(i, "[ World-Source.Ru ] ЖДИТЕ %d сек! (%s %s - ТЕСТОВАЯ ВЕРСИЯ!)", wait_sec, PLUGIN_NAME, PLUGIN_VERS);
            i++;
        }
        i++;
    }
    return 0;
}

bool:wS_Protect_GameAllowed()
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
    }
    if (TEST_VERSION != 1) {
        return true;
    }
    static need_wait_sec = 30;
    static old_time;
    new cur_time = GetTime({0,0});
    if (!old_time) {
        old_time = cur_time;
    }
    new sec = cur_time - old_time;
    if (sec < need_wait_sec) {
        wS_Protect_Kick(need_wait_sec - sec);
        return false;
    }
    if (need_wait_sec + 240 <= sec) {
        old_time = cur_time;
        wS_Protect_Kick(need_wait_sec);
        return false;
    }
    return true;
}

AddFileToDownloadsTable(String:filename[])
{
    static table = -1;
    if (table == -1) {
        table = FindStringTable("downloadables");
    }
    new bool:save = LockStringTables(false);
    AddToStringTable(table, filename, "", -1);
    LockStringTables(save);
    return 0;
}

TE_SendToAll(Float:delay)
{
    new total = 0;
    new clients[MaxClients];
    new i = 1;
    while (i <= MaxClients) {
        if (IsClientInGame(i)) {
            total++;
            clients[total] = i;
            i++;
        }
        i++;
    }
    return TE_Send(clients, total, delay);
}

TE_SetupExplosion(Float:pos[3], Model, Float:Scale, Framerate, Flags, Radius, Magnitude, Float:normal[3], MaterialType)
{
    TE_Start("Explosion");
    TE_WriteVector("m_vecOrigin[0]", pos);
    TE_WriteVector("m_vecNormal", normal);
    TE_WriteNum("m_nModelIndex", Model);
    TE_WriteFloat("m_fScale", Scale);
    TE_WriteNum("m_nFrameRate", Framerate);
    TE_WriteNum("m_nFlags", Flags);
    TE_WriteNum("m_nRadius", Radius);
    TE_WriteNum("m_nMagnitude", Magnitude);
    TE_WriteNum("m_chMaterialType", MaterialType);
    return 0;
}

TE_SetupBeamRingPoint(Float:center[3], Float:Start_Radius, Float:End_Radius, ModelIndex, HaloIndex, StartFrame, FrameRate, Float:Life, Float:Width, Float:Amplitude, Color[4], Speed, Flags)
{
    TE_Start("BeamRingPoint");
    TE_WriteVector("m_vecCenter", center);
    TE_WriteFloat("m_flStartRadius", Start_Radius);
    TE_WriteFloat("m_flEndRadius", End_Radius);
    TE_WriteNum("m_nModelIndex", ModelIndex);
    TE_WriteNum("m_nHaloIndex", HaloIndex);
    TE_WriteNum("m_nStartFrame", StartFrame);
    TE_WriteNum("m_nFrameRate", FrameRate);
    TE_WriteFloat("m_fLife", Life);
    TE_WriteFloat("m_fWidth", Width);
    TE_WriteFloat("m_fEndWidth", Width);
    TE_WriteFloat("m_fAmplitude", Amplitude);
    TE_WriteNum("r", Color[0]);
    TE_WriteNum("g", Color[1]);
    TE_WriteNum("b", Color[2]);
    TE_WriteNum("a", Color[3]);
    TE_WriteNum("m_nSpeed", Speed);
    TE_WriteNum("m_nFlags", Flags);
    TE_WriteNum("m_nFadeLength", 0);
    return 0;
}

TE_SetupBeamPoints(Float:start[3], Float:end[3], ModelIndex, HaloIndex, StartFrame, FrameRate, Float:Life, Float:Width, Float:EndWidth, FadeLength, Float:Amplitude, Color[4], Speed)
{
    TE_Start("BeamPoints");
    TE_WriteVector("m_vecStartPoint", start);
    TE_WriteVector("m_vecEndPoint", end);
    TE_WriteNum("m_nModelIndex", ModelIndex);
    TE_WriteNum("m_nHaloIndex", HaloIndex);
    TE_WriteNum("m_nStartFrame", StartFrame);
    TE_WriteNum("m_nFrameRate", FrameRate);
    TE_WriteFloat("m_fLife", Life);
    TE_WriteFloat("m_fWidth", Width);
    TE_WriteFloat("m_fEndWidth", EndWidth);
    TE_WriteFloat("m_fAmplitude", Amplitude);
    TE_WriteNum("r", Color[0]);
    TE_WriteNum("g", Color[1]);
    TE_WriteNum("b", Color[2]);
    TE_WriteNum("a", Color[3]);
    TE_WriteNum("m_nSpeed", Speed);
    TE_WriteNum("m_nFadeLength", FadeLength);
    return 0;
}

wS_PrecacheModelsFromMenu(Handle:menu, bad_item)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (menu) {
        new items = GetMenuItemCount(menu);
        if (items < 1) {
            return 0;
        }
        decl String:model[128];
        new i = 0;
        while (i < items) {
            new var1;
            if (i > bad_item && GetMenuItem(menu, i, model, 125, 0, "", 0)) {
                PrecacheModel(model, true);
                i++;
            }
            i++;
        }
        return 0;
    }
    return 0;
}

wS_Precache()
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    PrecacheModel("models/player/t_phoenix.mdl", true);
    PrecacheModel("models/player/ct_sas.mdl", true);
    PrecacheModel("sprites/laser.vmt", true);
    PrecacheSound("ambient/office/button1.wav", true);
    PrecacheSound("weapons/hegrenade/explode5.wav", true);
    PrecacheModel("models/props/cs_office/vending_machine.mdl", true);
    g_LaserIndex = PrecacheModel("materials/sprites/laser.vmt", true);
    wS_PrecacheModelsFromMenu(g_Trails_Menu, 0);
    wS_PrecacheModelsFromMenu(g_RedVipSkinsMenu, 0);
    wS_PrecacheModelsFromMenu(g_BluVipSkinsMenu, 0);
    PrecacheModel("models/props_c17/oildrum001_explosive.mdl", true);
    PrecacheModel("models/props_c17/oildrumchunk01a.mdl", true);
    PrecacheModel("models/props_c17/oildrumchunk01b.mdl", true);
    PrecacheModel("models/props_c17/oildrumchunk01c.mdl", true);
    PrecacheModel("models/props_c17/oildrumchunk01d.mdl", true);
    PrecacheModel("models/props_c17/oildrumchunk01e.mdl", true);
    if (0 < g_OverlaysCount) {
        decl String:model[128];
        new i = 1;
        while (i <= g_OverlaysCount) {
            if (GetArrayString(g_Array_Overlays, i, model, 125) > 5) {
                PrecacheModel(model, true);
                i++;
            }
            i++;
        }
    }
    return 0;
}

wS_CreateServerVars()
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    vip_cvar_hide_options = CreateConVar("vip_cvar_hide_options", "0", "1 = показывать только те опции, к которым есть доступ; 0 = показывать все", 256, true, 0.0, true, 1.0);
    vip_cvar_flood_protect_sec = CreateConVar("vip_cvar_flood_protect_sec", "0.2", "Задержка между повторным выбором опции", 256, true, 0.1, true, 1.0);
    vip_cvar_test_menu = CreateConVar("vip_cvar_test_menu", "1", "1 = игрок без VIP доступа видит список функций в меню (тест-меню); 0 = нет", 256, true, 0.0, true, 1.0);
    vip_cvar_join_open_menu = CreateConVar("vip_cvar_join_open_menu", "1", "1 = открывать vip меню зашедшим игрокам; 0 = нет", 256, true, 0.0, true, 1.0);
    vip_cvar_functions_status = CreateConVar("vip_cvar_functions_status", "1", "Статус VIP функций по умолчанию: 1 = вкл: 0 = откл", 256, true, 0.0, true, 1.0);
    vip_cvar_trail_lifetime = CreateConVar("vip_cvar_trail_lifetime", "1.5", "Как быстро исчезает хвост", 256, true, 1.0, true, 5.0);
    vip_cvar_trail_startwidth = CreateConVar("vip_cvar_trail_startwidth", "25.0", "Начальная ширина хвоста", 256, true, 1.0, true, 25.0);
    vip_cvar_trail_endwidth = CreateConVar("vip_cvar_trail_endwidth", "1.0", "Конечная ширина хвоста", 256, true, 1.0, true, 25.0);
    vip_cvar_trail_height = CreateConVar("vip_cvar_trail_height", "3", "Позволяет поднять (положительное число) или опустить хвост (отрицательное)", 256, true, -50.0, true, 150.0);
    vip_cvar_laser_width = CreateConVar("vip_cvar_laser_width", "2.0", "Ширина лазера от 1.0 до 25.0", 256, true, 1.0, true, 25.0);
    vip_cvar_laser_life = CreateConVar("vip_cvar_laser_life", "60.0", "Через сколько секунд удалить лазер, после создания; 0 = не удалять", 256, true, 0.0, true, 540.0);
    vip_cvar_laser_clear = CreateConVar("vip_cvar_laser_clear", "1", "1 = удалять лазер, если он убил игрока; 0 = нет", 256, true, 0.0, true, 1.0);
    vip_cvar_laser_team = CreateConVar("vip_cvar_laser_team", "1", "1 = лазер убивает только врагов; 0 = всех", 256, true, 0.0, true, 1.0);
    vip_cvar_he_rgba = CreateConVar("vip_cvar_he_rgba", "255 0 0 255", "Цвет лучей при взрыве боевой гранаты", 256, false, 0.0, false, 0.0);
    vip_cvar_sg_rgba = CreateConVar("vip_cvar_sg_rgba", "0 255 0 255", "Цвет лучей (дымовая граната)", 256, false, 0.0, false, 0.0);
    vip_cvar_fb_rgba = CreateConVar("vip_cvar_fb_rgba", "255 255 255 255", "Цвет лучей (флешка)", 256, false, 0.0, false, 0.0);
    AutoExecConfig(true, "vip", "vip");
    return 0;
}

wS_ReloadVipGroups()
{
    if (0 < g_Num) {
        new var18 = MaxClients;
        if (1 > var18 & 0 < var18) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    static bool:trie_created;
    static old_change_time = -1;
    if (!trie_created) {
        trie_created = true;
        g_VipGroupTrie = CreateTrie();
        g_VipGroupTrie_hp = CreateTrie();
        g_VipGroupTrie_speed = CreateTrie();
        g_VipGroupTrie_color = CreateTrie();
        g_VipGroupTrie_skin_t = CreateTrie();
        g_VipGroupTrie_skin_ct = CreateTrie();
        g_VipGroupTrie_rehp = CreateTrie();
        g_VipGroupTrie_chat = CreateTrie();
        g_VipGroupTrie_gravity = CreateTrie();
        g_VipGroupTrie_cash = CreateTrie();
        g_VipGroupTrie_armor = CreateTrie();
        g_VipGroupTrie_noblind = CreateTrie();
        g_VipGroupTrie_defuse = CreateTrie();
        g_VipGroupTrie_trail = CreateTrie();
        g_VipGroupTrie_team = CreateTrie();
        g_VipGroupTrie_overlay = CreateTrie();
        g_VipGroupTrie_he = CreateTrie();
        g_VipGroupTrie_sg = CreateTrie();
        g_VipGroupTrie_fb = CreateTrie();
        g_VipGroupTrie_laser = CreateTrie();
        g_VipGroupTrie_c4 = CreateTrie();
        g_VipGroupTrie_fraghp = CreateTrie();
        g_VipGroupTrie_water = CreateTrie();
        g_VipGroupTrie_immun = CreateTrie();
        g_VipGroupTrie_admin = CreateTrie();
        g_VipGroupTrie_respawn = CreateTrie();
        g_VipGroupTrie_tele = CreateTrie();
        g_VipGroupTrie_dropgren = CreateTrie();
        g_VipGroupTrie_barrel = CreateTrie();
        g_VipGroupTrie_beam = CreateTrie();
        g_VipGroupTrie_ammo = CreateTrie();
        g_VipGroupTrie_hostage = CreateTrie();
        g_VipGroupTrie_gren_effect = CreateTrie();
    }
    new new_change_time = GetFileTime("cfg/vip/vip_groups.txt", FileTimeMode:2);
    new var1;
    if (new_change_time == -1 || old_change_time != new_change_time) {
        if (new_change_time == -1) {
            LogToFileEx(g_ErrorLogFile, "cfg/vip/vip_groups.txt not found");
        }
        return 0;
    }
    old_change_time = new_change_time;
    g_VipGroups_Count = 0;
    ClearTrie(g_VipGroupTrie);
    ClearTrie(g_VipGroupTrie_hp);
    ClearTrie(g_VipGroupTrie_speed);
    ClearTrie(g_VipGroupTrie_color);
    ClearTrie(g_VipGroupTrie_skin_t);
    ClearTrie(g_VipGroupTrie_skin_ct);
    ClearTrie(g_VipGroupTrie_rehp);
    ClearTrie(g_VipGroupTrie_chat);
    ClearTrie(g_VipGroupTrie_gravity);
    ClearTrie(g_VipGroupTrie_cash);
    ClearTrie(g_VipGroupTrie_armor);
    ClearTrie(g_VipGroupTrie_noblind);
    ClearTrie(g_VipGroupTrie_defuse);
    ClearTrie(g_VipGroupTrie_trail);
    ClearTrie(g_VipGroupTrie_team);
    ClearTrie(g_VipGroupTrie_overlay);
    ClearTrie(g_VipGroupTrie_he);
    ClearTrie(g_VipGroupTrie_sg);
    ClearTrie(g_VipGroupTrie_fb);
    ClearTrie(g_VipGroupTrie_laser);
    ClearTrie(g_VipGroupTrie_c4);
    ClearTrie(g_VipGroupTrie_fraghp);
    ClearTrie(g_VipGroupTrie_water);
    ClearTrie(g_VipGroupTrie_immun);
    ClearTrie(g_VipGroupTrie_admin);
    ClearTrie(g_VipGroupTrie_respawn);
    ClearTrie(g_VipGroupTrie_tele);
    ClearTrie(g_VipGroupTrie_dropgren);
    ClearTrie(g_VipGroupTrie_barrel);
    ClearTrie(g_VipGroupTrie_beam);
    ClearTrie(g_VipGroupTrie_ammo);
    ClearTrie(g_VipGroupTrie_hostage);
    ClearTrie(g_VipGroupTrie_gren_effect);
    new Handle:kv = CreateKeyValues("vip_groups", "", "");
    new var2;
    if (!FileToKeyValues(kv, "cfg/vip/vip_groups.txt") || !KvGotoFirstSubKey(kv, true)) {
        CloseHandle(kv);
        LogToFileEx(g_ErrorLogFile, "cfg/vip/vip_groups.txt KeyValues Error (UTF-8 без BOM!)");
        return 0;
    }
    decl String:group_name[68];
    decl String:str_value[76];
    decl String:str_group_num[8];
    decl String:str_flags[48];
    new int_value = 0;
    new Float:float_value = 0.0;
    new AdminFlag:flag = 0;
    new chr = 0;
    do {
        new var3;
        if (!KvGetSectionName(kv, group_name, 65) || wS_VipGroupExist(group_name)) {
        } else {
            new var19 = KvGetNum(kv, "hp", 0);
            int_value = var19;
            new var4;
            if (var19 < 0 || int_value > 500) {
                int_value = 0;
            }
            SetTrieValue(g_VipGroupTrie_hp, group_name, int_value, true);
            new var20 = KvGetFloat(kv, "speed", 0.0);
            float_value = var20;
            new var5;
            if (var20 < 0 || float_value > 5.0) {
                float_value = 0.0;
            }
            SetTrieValue(g_VipGroupTrie_speed, group_name, float_value, true);
            new var21 = KvGetNum(kv, "rehp", 0);
            int_value = var21;
            new var6;
            if (var21 < 0 || int_value > 99) {
                int_value = 0;
            }
            SetTrieValue(g_VipGroupTrie_rehp, group_name, int_value, true);
            new var22 = KvGetFloat(kv, "gravity", 0.0);
            float_value = var22;
            new var7;
            if (var22 < 0 || float_value > 3.0) {
                float_value = 0.0;
            }
            SetTrieValue(g_VipGroupTrie_gravity, group_name, float_value, true);
            new var23 = KvGetNum(kv, "cash", 0);
            int_value = var23;
            new var8;
            if (var23 < 0 || int_value > 16000) {
                int_value = 0;
            }
            SetTrieValue(g_VipGroupTrie_cash, group_name, int_value, true);
            new var24 = KvGetNum(kv, "armor", 0);
            int_value = var24;
            new var9;
            if (var24 < 0 || int_value > 250) {
                int_value = 0;
            }
            SetTrieValue(g_VipGroupTrie_armor, group_name, int_value, true);
            SetTrieValue(g_VipGroupTrie_color, group_name, KvGetNum(kv, "color", 0) == 1, true);
            SetTrieValue(g_VipGroupTrie_skin_t, group_name, KvGetNum(kv, "skin_t", 0) == 1, true);
            SetTrieValue(g_VipGroupTrie_skin_ct, group_name, KvGetNum(kv, "skin_ct", 0) == 1, true);
            SetTrieValue(g_VipGroupTrie_chat, group_name, KvGetNum(kv, "chat", 0) == 1, true);
            SetTrieValue(g_VipGroupTrie_noblind, group_name, KvGetNum(kv, "noblind", 0) == 1, true);
            SetTrieValue(g_VipGroupTrie_defuse, group_name, KvGetNum(kv, "defuse", 0) == 1, true);
            SetTrieValue(g_VipGroupTrie_trail, group_name, KvGetNum(kv, "trail", 0) == 1, true);
            SetTrieValue(g_VipGroupTrie_team, group_name, KvGetNum(kv, "team", 0) == 1, true);
            SetTrieValue(g_VipGroupTrie_overlay, group_name, KvGetNum(kv, "overlay", 0) == 1, true);
            SetTrieValue(g_VipGroupTrie_c4, group_name, KvGetNum(kv, "c4", 0) == 1, true);
            SetTrieValue(g_VipGroupTrie_water, group_name, KvGetNum(kv, "water", 0) == 1, true);
            SetTrieValue(g_VipGroupTrie_dropgren, group_name, KvGetNum(kv, "dropgren", 0) == 1, true);
            SetTrieValue(g_VipGroupTrie_barrel, group_name, KvGetNum(kv, "barrel", 0) == 1, true);
            SetTrieValue(g_VipGroupTrie_beam, group_name, KvGetNum(kv, "beam", 0) == 1, true);
            SetTrieValue(g_VipGroupTrie_ammo, group_name, KvGetNum(kv, "ammo", 0) == 1, true);
            SetTrieValue(g_VipGroupTrie_hostage, group_name, KvGetNum(kv, "hostage", 0) == 1, true);
            SetTrieValue(g_VipGroupTrie_gren_effect, group_name, KvGetNum(kv, "gren_effect", 0) == 1, true);
            new var25 = KvGetNum(kv, "he", 0);
            int_value = var25;
            new var10;
            if (var25 < 0 || int_value > 999) {
                int_value = 0;
            }
            SetTrieValue(g_VipGroupTrie_he, group_name, int_value, true);
            new var26 = KvGetNum(kv, "sg", 0);
            int_value = var26;
            new var11;
            if (var26 < 0 || int_value > 999) {
                int_value = 0;
            }
            SetTrieValue(g_VipGroupTrie_sg, group_name, int_value, true);
            new var27 = KvGetNum(kv, "fb", 0);
            int_value = var27;
            new var12;
            if (var27 < 0 || int_value > 999) {
                int_value = 0;
            }
            SetTrieValue(g_VipGroupTrie_fb, group_name, int_value, true);
            new var28 = KvGetNum(kv, "laser", 0);
            int_value = var28;
            new var13;
            if (var28 < 0 || int_value > 99) {
                int_value = 0;
            }
            SetTrieValue(g_VipGroupTrie_laser, group_name, int_value, true);
            new var29 = KvGetNum(kv, "fraghp", 0);
            int_value = var29;
            new var14;
            if (var29 < 0 || int_value > 99) {
                int_value = 0;
            }
            SetTrieValue(g_VipGroupTrie_fraghp, group_name, int_value, true);
            new var30 = KvGetNum(kv, "immun", 0);
            int_value = var30;
            new var15;
            if (var30 < 0 || int_value > 99) {
                int_value = 0;
            }
            SetTrieValue(g_VipGroupTrie_immun, group_name, int_value, true);
            str_flags[0] = MissingTAG:0;
            str_value[0] = MissingTAG:0;
            KvGetString(kv, "admin", str_value, 45, "");
            new var31 = strlen(str_value);
            int_value = var31;
            if (0 < var31) {
                new i = 0;
                while (i < int_value) {
                    chr = CharToLower(str_value[i]);
                    if (FindFlagByChar(chr, flag)) {
                        if (str_flags[0]) {
                            Format(str_flags, 45, "%s%c", str_flags, chr);
                            i++;
                        }
                        Format(str_flags, 45, "%c", chr);
                        i++;
                    }
                    i++;
                }
            }
            SetTrieString(g_VipGroupTrie_admin, group_name, str_flags, true);
            new var32 = KvGetNum(kv, "respawn", 0);
            int_value = var32;
            new var16;
            if (var32 < 0 || int_value > 999) {
                int_value = 0;
            }
            SetTrieValue(g_VipGroupTrie_respawn, group_name, int_value, true);
            new var33 = KvGetNum(kv, "tele", 0);
            int_value = var33;
            new var17;
            if (var33 < 0 || int_value > 999) {
                int_value = 0;
            }
            SetTrieValue(g_VipGroupTrie_tele, group_name, int_value, true);
            g_VipGroups_Count += 1;
            IntToString(g_VipGroups_Count, str_group_num, 5);
            SetTrieString(g_VipGroupTrie, str_group_num, group_name, true);
        }
        if (KvGotoNextKey(kv, true)) {
        } else {
            CloseHandle(kv);
            return 0;
        }
    } while (!KvGetSectionName(kv, group_name, 65) || wS_VipGroupExist(group_name));
    CloseHandle(kv);
    return 0;
}

public Action:vip_groups_list(client, args)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (args > 1) {
        return Action:3;
    }
    if (g_VipGroups_Count < 1) {
        PrintToConsole(client, "You must create at least 1 VIP group..");
        return Action:3;
    }
    decl String:str_group_num[8];
    decl String:group_name[68];
    new i = 1;
    while (i <= g_VipGroups_Count) {
        IntToString(i, str_group_num, 5);
        if (GetTrieString(g_VipGroupTrie, str_group_num, group_name, 65, 0)) {
            PrintToConsole(client, "%02d. %s", i, group_name);
            i++;
        }
        i++;
    }
    return Action:3;
}

bool:wS_VipGroupExist(String:group_name[])
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    static wS;
    return GetTrieValue(g_VipGroupTrie_hp, group_name, 49756);
}

public Action:vip_command(client, args)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (client > 0 && args < 1) {
        if (g_VipAccess[client]) {
            if (g_VipMenu[client]) {
                DisplayMenu(g_VipMenu[client], client, 0);
            } else {
                if (!g_MyVipGroupExists[client]) {
                    PrintToChat(client, "\x04%t", "vip_group_not_exists", g_MyVipGroup[client]);
                }
                PrintToChat(client, "g_VipMenu INVALID_HANDLE");
            }
            return Action:3;
        }
        if (GetConVarBool(vip_cvar_test_menu)) {
            if (g_VipMenu[client]) {
                DisplayMenu(g_VipMenu[client], client, 0);
            }
            wS_Create_g_VipMenu_ForVipClient(client, true, false, true);
        }
        PrintToChat(client, "%t", "vip_no_access");
    }
    return Action:3;
}

wS_GetClientGrenadeCount(client, grenade_slot)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (grenade_slot < 3 || grenade_slot > 5) {
        return 0;
    }
    static grenade_type[6];
    if (!grenade_type[grenade_slot]) {
        grenade_type[3] = 12;
        grenade_type[4] = 11;
        grenade_type[5] = 13;
    }
    new offset = grenade_type[grenade_slot] * 4 + FindDataMapOffs(client, "m_iAmmo", 0, 0);
    return GetEntData(client, offset, 4);
}

wS_GetCvarColor(Handle:cVar, color[4], default_color[4])
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new i = 0;
    while (i < 4) {
        color[i] = default_color[i];
        i++;
    }
    decl String:str_rgba[36];
    GetConVarString(cVar, str_rgba, 35);
    TrimString(str_rgba);
    if (0 < strlen(str_rgba)) {
        decl String:buffer[16][12];
        if (ExplodeString(str_rgba, " ", buffer, 4, 9, false) > 3) {
            decl value;
            i = 0;
            while (i < 4) {
                new var3 = StringToInt(buffer[i], 10);
                value = var3;
                new var1;
                if (var3 < 0 || value > 255) {
                    i = 0;
                    while (i < 4) {
                        color[i] = default_color[i];
                        i++;
                    }
                    return 0;
                }
                color[i] = value;
                i++;
            }
        }
    }
    return 0;
}

bool:wS_EditVipSkin(String:path[128])
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (path[0] == 'm') {
        ReplaceString(path, 125, "\", "/", true);
        new var1;
        if (StrContains(path, "models/", true) && FileExists(path, false)) {
            return true;
        }
    }
    path[0] = MissingTAG:0;
    return false;
}

wS_ClearHandle(&Handle:hdl)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (hdl) {
        CloseHandle(hdl);
        hdl = 0;
    }
    return 0;
}

wS_KillTimer(&Handle:timer)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (timer) {
        KillTimer(timer, false);
        timer = 0;
    }
    return 0;
}

bool:wS_VipMenuFloodDetected(client, bool:msg_and_sound)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new Float:GameTime_value = GetGameTime();
    if (GameTime_value - g_MyGameTimeWhenSelectOption[client] < GetConVarFloat(vip_cvar_flood_protect_sec)) {
        if (msg_and_sound) {
            PrintToChat(client, "\x04%t", "flood_protect_msg");
            ClientCommand(client, "playgamesound \"resource/warning.wav\"");
        }
        return true;
    }
    g_MyGameTimeWhenSelectOption[client] = GameTime_value;
    return false;
}

wS_ShowClientMsgInPanel(client, String:msg[], bool:playsound)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new Handle:panel = CreatePanel(Handle:0);
    DrawPanelText(panel, msg);
    SetPanelCurrentKey(panel, 10);
    DrawPanelItem(panel, "Выход", 0);
    SendPanelToClient(panel, client, Panel_CallBack, 0);
    CloseHandle(panel);
    if (playsound) {
        ClientCommand(client, "playgamesound resource/warning.wav");
    }
    return 0;
}

public Panel_CallBack(Handle:panel, MenuAction:action, client, option)
{
    return 0;
}

bool:wS_CorrectSteamSyntax(String:steamid[])
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (StrContains(steamid, "STEAM_", true)) {
        return false;
    }
    new max = strlen(steamid);
    new i = 6;
    while (i < max) {
        new var1;
        if (!IsCharNumeric(steamid[i]) && steamid[i] != ':') {
            return false;
        }
        i++;
    }
    return true;
}

bool:wS_GetSteamIdFromArgNum(client, String:steamid[28], ArgNum)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (GetCmdArg(ArgNum, steamid, 28) > 5 && wS_CorrectSteamSyntax(steamid)) {
        return true;
    }
    PrintToConsole(client, "Bad steamid.. '%s'", steamid);
    return false;
}

wS_GetClientBySteamId(String:steamid[])
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new i = 1;
    while (i <= MaxClients) {
        new var1;
        if (IsValidEntity(i) && IsClientInGame(i) && strcmp(g_SteamId[i], steamid, true)) {
            return i;
        }
        i++;
    }
    return 0;
}

bool:wS_OpenFileAndLoadFiles(String:path[])
{
    if (0 < g_Num) {
        new var3 = MaxClients;
        if (1 > var3 & 0 < var3) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new Handle:file = OpenFile(path, "r");
    if (file) {
        decl String:str_value[88];
        while (!IsEndOfFile(file) && ReadFileLine(file, str_value, 85)) {
            TrimString(str_value);
            new var2;
            if (str_value[0] == 'm' || str_value[0] == 's') {
                AddFileToDownloadsTable(str_value);
            }
        }
        CloseHandle(file);
        return true;
    }
    LogToFileEx(g_ErrorLogFile, "Could not open file \"%s\"", path);
    return false;
}

wS_DissolveEntityByName(index, String:name[])
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (g_Dissolver > 0 && IsValidEntity(g_Dissolver)) {
        DispatchKeyValue(g_Dissolver, "target", name);
        DispatchKeyValue(g_Dissolver, "magnitude", "1");
        DispatchKeyValue(g_Dissolver, "dissolvetype", "0");
        AcceptEntityInput(g_Dissolver, "Dissolve", -1, -1, 0);
    } else {
        if (0 < index) {
            AcceptEntityInput(index, "Kill", -1, -1, 0);
        }
    }
    return 0;
}

wS_SetColor(entity, r, g, b, a)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    SetEntityRenderMode(entity, RenderMode:1);
    SetEntityRenderColor(entity, r, g, b, a);
    return 0;
}

wS_TeamColorMsg(client_author, String:msg[], client)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new Handle:h = 0;
    if (0 < client) {
        h = StartMessageOne("SayText2", client, 0);
    } else {
        h = StartMessageAll("SayText2", 0);
    }
    if (h) {
        BfWriteByte(h, client_author);
        BfWriteByte(h, 1);
        BfWriteString(h, msg);
        EndMessage();
        return 0;
    }
    if (0 < client) {
        PrintToChat(client, msg);
    } else {
        PrintToChatAll(msg);
    }
    return 0;
}

AdminId:wS_GetAdminId(client, bool:create_admin)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new AdminId:id = GetUserAdmin(client);
    new var1;
    if (id == AdminId:-1 && create_admin) {
        id = CreateAdmin("");
        SetUserAdmin(client, id, true);
    }
    return id;
}

wS_TrySetImmunAndAdminFlags(client, bool:status)
{
    if (0 < g_Num) {
        new var3 = MaxClients;
        if (1 > var3 & 0 < var3) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new AdminId:id = -1;
    new var1;
    if (g_VipHave[client][28] && g_VipFeatureOn[client][28]) {
        new var4 = wS_GetAdminId(client, true);
        id = var4;
        if (var4 != -1) {
            new var2;
            if (status) {
                var2 = g_VipValue[client][11];
            } else {
                var2 = 0;
            }
            SetAdminImmunityLevel(id, var2);
        }
    }
    if (g_VipHave[client][31]) {
        if (id == AdminId:-1) {
            id = wS_GetAdminId(client, true);
        }
        if (id != AdminId:-1) {
            decl String:str_flags[48];
            strcopy(str_flags, 45, g_VipValue[client][14]);
            new flags_count = strlen(str_flags);
            if (0 < flags_count) {
                decl AdminFlag:flag;
                new i = 0;
                while (i < flags_count) {
                    if (FindFlagByChar(CharToLower(str_flags[i]), flag)) {
                        SetAdminFlag(id, flag, status);
                        i++;
                    }
                    i++;
                }
            }
        }
    }
    return 0;
}

wS_GetAimInfo(client, bool:get_index, bool:get_origin, Float:end_origin[3])
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    decl Float:origin[3];
    decl Float:angles[3];
    GetClientEyePosition(client, origin);
    GetClientEyeAngles(client, angles);
    TR_TraceRayFilter(origin, angles, 33570827, RayType:1, wS_GetAimInfo_TraceFilter, client);
    if (TR_DidHit(Handle:0)) {
        if (get_origin) {
            TR_GetEndPosition(end_origin, Handle:0);
        }
        if (get_index) {
            return TR_GetEntityIndex(Handle:0);
        }
    }
    return -1;
}

public bool:wS_GetAimInfo_TraceFilter(TraceEnt, mask, any:entity)
{
    return entity != TraceEnt;
}

public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    RegPluginLibrary("vip");
    CreateNative("VIP_IsVipPlayer", VIP_IsVipPlayer_CallBack);
    CreateNative("VIP_GetAccessSeconds", VIP_GetAccessSeconds_CallBack);
    CreateNative("VIP_HaveFeature", VIP_HaveFeature_CallBack);
    CreateNative("VIP_FeatureOn", VIP_FeatureOn_CallBack);
    return APLRes:0;
}

wS_Create_GlobalFunctions()
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    g_Event_VIP_Removed = CreateGlobalForward("Event_VIP_Removed", ExecType:0, 2, 7, 2, 7);
    g_Event_VIP_Added = CreateGlobalForward("Event_VIP_Added", ExecType:0, 2, 7, 7, 2, 2);
    g_Event_VIP_TimeChanged = CreateGlobalForward("Event_VIP_TimeChanged", ExecType:0, 2, 7, 2, 2);
    g_Event_VIP_Joined = CreateGlobalForward("Event_VIP_Joined", ExecType:0, 2, 7, 2);
    return 0;
}


/* ERROR! lysis.nodes.types.DReturn cannot be cast to lysis.nodes.types.DJumpCondition */
 function "ItsVipIndex" (number 57)
public VIP_IsVipPlayer_CallBack(Handle:plugin, args)
{
    return ItsVipIndex(GetNativeCell(1));
}

public VIP_GetAccessSeconds_CallBack(Handle:plugin, args)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new client = GetNativeCell(1);
    if (!ItsVipIndex(client)) {
        return -2;
    }
    if (0 < g_VipTime[client]) {
        return g_VipTime[client] - GetTime({0,0});
    }
    return -1;
}


/* ERROR! lysis.nodes.types.DReturn cannot be cast to lysis.nodes.types.DJumpCondition */
 function "VIP_HaveFeature_CallBack" (number 60)

/* ERROR! lysis.nodes.types.DReturn cannot be cast to lysis.nodes.types.DJumpCondition */
 function "VIP_FeatureOn_CallBack" (number 61)
bool:wS_Update_g_VipMenuTitle(client, bool:test_menu)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (g_VipMenu[client]) {
        decl String:title[76];
        if (test_menu) {
            Format(title, 75, "%T\n \n", 50432, client);
        } else {
            if (0 < g_VipTime[client]) {
                decl String:info[36];
                FormatTime(info, 35, "%d/%m/%Y - %H:%M", g_VipTime[client]);
                Format(title, 75, "%T\n \n", 50480, client, info);
            }
            Format(title, 75, "%T\n \n", 50508, client);
        }
        SetMenuTitle(g_VipMenu[client], title);
        return true;
    }
    return false;
}

wS_AddDisabledItem(Handle:menu, String:buffer[76], String:key[], client)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    Format(buffer, 75, "%T", key, client);
    AddMenuItem(menu, "", buffer, 1);
    return 0;
}

wS_Create_g_VipMenu_ForVipClient(client, bool:test_menu, bool:player_join, bool:open_menu)
{
    if (0 < g_Num) {
        new var21 = MaxClients;
        if (1 > var21 & 0 < var21) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (g_VipMenu[client]) {
        CloseHandle(g_VipMenu[client]);
    }
    g_VipMenu[client] = CreateMenu(g_VipMenu_CallBack, MenuAction:28);
    new Handle:menu = g_VipMenu[client];
    SetMenuExitButton(menu, true);
    decl String:text[76];
    wS_Update_g_VipMenuTitle(client, test_menu);
    decl bool:NeedAddDisabledItem;
    new var1;
    if (test_menu || !GetConVarBool(vip_cvar_hide_options)) {
        new var2;
        if (g_VipFeatureOn[client][20]) {
            var2 = str_ON;
        } else {
            var2 = str_OFF;
        }
        Format(text, 75, "%T %s", 50612, client, g_VipValue[client][3], var2);
        AddMenuItem(menu, "hp", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_hp_no_access", client);
        }
    }
    if (g_VipHave[client][18]) {
        new var3;
        if (g_VipFeatureOn[client][18]) {
            var3 = str_ON;
        } else {
            var3 = str_OFF;
        }
        Format(text, 75, "%T %s", 50660, client, g_VipValue[client][1], var3);
        AddMenuItem(menu, "speed", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_speed_no_access", client);
        }
    }
    if (g_VipHave[client][16]) {
        Format(text, 75, "%T", 50716, client);
        AddMenuItem(menu, "color", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_color_no_access", client);
        }
    }
    if (g_VipHave[client][0]) {
        Format(text, 75, "%T", 50772, client);
        AddMenuItem(menu, "skin_t", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_skin_t_no_access", client);
        }
    }
    if (g_VipHave[client][1]) {
        Format(text, 75, "%T", 50828, client);
        AddMenuItem(menu, "skin_ct", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_skin_ct_no_access", client);
        }
    }
    if (g_VipHave[client][22]) {
        new var4;
        if (g_VipFeatureOn[client][22]) {
            var4 = str_ON;
        } else {
            var4 = str_OFF;
        }
        Format(text, 75, "%T %s", 50892, client, g_VipValue[client][5], var4);
        AddMenuItem(menu, "rehp", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_rehp_no_access", client);
        }
    }
    if (g_VipHave[client][8]) {
        new var5;
        if (g_VipFeatureOn[client][8]) {
            var5[0] = str_ON;
        } else {
            var5[0] = str_OFF;
        }
        Format(text, 75, "%T %s", 50948, client, var5);
        AddMenuItem(menu, "chat", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_chat_no_access", client);
        }
    }
    if (g_VipHave[client][17]) {
        new var6;
        if (g_VipFeatureOn[client][17]) {
            var6 = str_ON;
        } else {
            var6 = str_OFF;
        }
        Format(text, 75, "%T %s", 51004, client, g_VipValue[client], var6);
        AddMenuItem(menu, "gravity", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_gravity_no_access", client);
        }
    }
    if (g_VipHave[client][19]) {
        new var7;
        if (g_VipFeatureOn[client][19]) {
            var7 = str_ON;
        } else {
            var7 = str_OFF;
        }
        Format(text, 75, "%T %s", 51068, client, g_VipValue[client][2], var7);
        AddMenuItem(menu, "cash", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_cash_no_access", client);
        }
    }
    if (g_VipHave[client][21]) {
        new var8;
        if (g_VipFeatureOn[client][21]) {
            var8 = str_ON;
        } else {
            var8 = str_OFF;
        }
        Format(text, 75, "%T %s", 51124, client, g_VipValue[client][4], var8);
        AddMenuItem(menu, "armor", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_armor_no_access", client);
        }
    }
    if (g_VipHave[client][9]) {
        new var9;
        if (g_VipFeatureOn[client][9]) {
            var9[0] = str_ON;
        } else {
            var9[0] = str_OFF;
        }
        Format(text, 75, "%T %s", 51184, client, var9);
        AddMenuItem(menu, "noblind", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_noblind_no_access", client);
        }
    }
    if (g_VipHave[client][10]) {
        new var10;
        if (g_VipFeatureOn[client][10]) {
            var10[0] = str_ON;
        } else {
            var10[0] = str_OFF;
        }
        Format(text, 75, "%T %s", 51248, client, var10);
        AddMenuItem(menu, "defuse", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_defuse_no_access", client);
        }
    }
    if (g_VipHave[client][11]) {
        Format(text, 75, "%T", 51304, client);
        AddMenuItem(menu, "trail", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_trail_no_access", client);
        }
    }
    if (g_VipHave[client][12]) {
        Format(text, 75, "%T", 51360, client);
        AddMenuItem(menu, "team", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_team_no_access", client);
        }
    }
    if (g_VipHave[client][15]) {
        Format(text, 75, "%T", 51412, client, g_MyOverlayItem[client], 43208);
        AddMenuItem(menu, "overlay", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_overlay_no_access", client);
        }
    }
    if (g_VipHave[client][23]) {
        Format(text, 75, "%T", 51472, client, g_VipValue[client][6]);
        AddMenuItem(menu, "he", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_he_no_access", client);
        }
    }
    if (g_VipHave[client][24]) {
        Format(text, 75, "%T", 51516, client, g_VipValue[client][7]);
        AddMenuItem(menu, "sg", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_sg_no_access", client);
        }
    }
    if (g_VipHave[client][25]) {
        Format(text, 75, "%T", 51560, client, g_VipValue[client][8]);
        AddMenuItem(menu, "fb", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_fb_no_access", client);
        }
    }
    if (g_VipHave[client][26]) {
        Format(text, 75, "%T", 51604, client, g_VipValue[client][9]);
        AddMenuItem(menu, "laser", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_laser_no_access", client);
        }
    }
    if (g_VipHave[client][13]) {
        new var11;
        if (g_VipFeatureOn[client][13]) {
            var11[0] = str_ON;
        } else {
            var11[0] = str_OFF;
        }
        Format(text, 75, "%T %s", 51664, client, var11);
        AddMenuItem(menu, "c4", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_c4_no_access", client);
        }
    }
    if (g_VipHave[client][27]) {
        new var12;
        if (g_VipFeatureOn[client][27]) {
            var12 = str_ON;
        } else {
            var12 = str_OFF;
        }
        Format(text, 75, "%T %s", 51712, client, g_VipValue[client][10], var12);
        AddMenuItem(menu, "fraghp", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_fraghp_no_access", client);
        }
    }
    if (g_VipHave[client][14]) {
        new var13;
        if (g_VipFeatureOn[client][14]) {
            var13[0] = str_ON;
        } else {
            var13[0] = str_OFF;
        }
        Format(text, 75, "%T %s", 51772, client, var13);
        AddMenuItem(menu, "water", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_water_no_access", client);
        }
    }
    if (g_VipHave[client][28]) {
        new var14;
        if (g_VipFeatureOn[client][28]) {
            var14 = str_ON;
        } else {
            var14 = str_OFF;
        }
        Format(text, 75, "%T %s", 51832, client, g_VipValue[client][11], var14);
        AddMenuItem(menu, "immun", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_immun_no_access", client);
        }
    }
    if (g_VipHave[client][31]) {
        Format(text, 75, "%T", 51888, client);
        AddMenuItem(menu, "admin", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_admin_no_access", client);
        }
    }
    if (g_VipHave[client][29]) {
        Format(text, 75, "%T", 51944, client, g_VipValue[client][12]);
        AddMenuItem(menu, "respawn", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_respawn_no_access", client);
        }
    }
    if (g_VipHave[client][30]) {
        Format(text, 75, "%T", 52004, client, g_VipValue[client][13]);
        AddMenuItem(menu, "tele", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_tele_no_access", client);
        }
    }
    if (g_VipHave[client][2]) {
        Format(text, 75, "%T", 52056, client);
        AddMenuItem(menu, "dropgren", text, 1);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_dropgren_no_access", client);
        }
    }
    if (g_VipHave[client][3]) {
        new var15;
        if (g_VipFeatureOn[client][3]) {
            var15[0] = str_ON;
        } else {
            var15[0] = str_OFF;
        }
        Format(text, 75, "%T %s", 52124, client, var15);
        AddMenuItem(menu, "barrel", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_barrel_no_access", client);
        }
    }
    if (g_VipHave[client][4]) {
        new var16;
        if (g_VipFeatureOn[client][4]) {
            var16[0] = str_ON;
        } else {
            var16[0] = str_OFF;
        }
        Format(text, 75, "%T %s", 52184, client, var16);
        AddMenuItem(menu, "beam", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_beam_no_access", client);
        }
    }
    if (g_VipHave[client][5]) {
        Format(text, 75, "%T", 52236, client);
        AddMenuItem(menu, "ammo", text, 1);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_ammo_no_access", client);
        }
    }
    if (g_VipHave[client][6]) {
        new var17;
        if (g_VipFeatureOn[client][6]) {
            var17[0] = str_ON;
        } else {
            var17[0] = str_OFF;
        }
        Format(text, 75, "%T %s", 52292, client, var17);
        AddMenuItem(menu, "hostage", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_hostage_no_access", client);
        }
    }
    if (g_VipHave[client][7]) {
        new var18;
        if (g_VipFeatureOn[client][7]) {
            var18[0] = str_ON;
        } else {
            var18[0] = str_OFF;
        }
        Format(text, 75, "%T %s", 52356, client, var18);
        AddMenuItem(menu, "gren_effect", text, 0);
    } else {
        if (NeedAddDisabledItem) {
            wS_AddDisabledItem(menu, text, "vip_menu_gren_effect_no_access", client);
        }
    }
    new var20;
    if (open_menu && (!player_join || GetConVarBool(vip_cvar_join_open_menu))) {
        DisplayMenu(menu, client, 0);
    }
    return 0;
}

public g_VipMenu_CallBack(Handle:menu, MenuAction:action, client, item)
{
    if (0 < g_Num) {
        new var30 = MaxClients;
        if (1 > var30 & 0 < var30) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (action == MenuAction:4 && !g_VipAccess[client] && wS_VipMenuFloodDetected(client, true)) {
        return 0;
    }
    decl String:info[16];
    decl String:text[76];
    decl String:str_ON[20];
    decl String:str_OFF[20];
    decl bool:enabled;
    GetMenuItem(menu, item, info, 15, 0, "", 0);
    Format(str_ON, 20, "%T", 52432, client);
    Format(str_OFF, 20, "%T", 52460, client);
    new bool:need_edit_item = 0;
    new bool:player_alive = IsPlayerAlive(client);
    new ITEM_TYPE = 0;
    if (strcmp(info, "hp", true)) {
        if (strcmp(info, "speed", true)) {
            if (strcmp(info, "color", true)) {
                new var5;
                if (strcmp(info, "skin_t", true) && strcmp(info, "skin_ct", true)) {
                    g_MyLastVipMenuItem[client] = GetMenuSelectionPosition();
                    wS_ShowVipSkinsPanel(client);
                    return 0;
                }
                if (strcmp(info, "rehp", true)) {
                    if (strcmp(info, "chat", true)) {
                        if (strcmp(info, "gravity", true)) {
                            if (strcmp(info, "cash", true)) {
                                if (strcmp(info, "armor", true)) {
                                    if (strcmp(info, "noblind", true)) {
                                        if (strcmp(info, "defuse", true)) {
                                            if (strcmp(info, "trail", true)) {
                                                if (strcmp(info, "overlay", true)) {
                                                    if (strcmp(info, "laser", true)) {
                                                        if (strcmp(info, "c4", true)) {
                                                            if (strcmp(info, "fraghp", true)) {
                                                                if (strcmp(info, "water", true)) {
                                                                    if (strcmp(info, "immun", true)) {
                                                                        if (strcmp(info, "admin", true)) {
                                                                            if (strcmp(info, "respawn", true)) {
                                                                                if (strcmp(info, "tele", true)) {
                                                                                    if (strcmp(info, "barrel", true)) {
                                                                                        if (strcmp(info, "beam", true)) {
                                                                                            if (strcmp(info, "hostage", true)) {
                                                                                                if (strcmp(info, "gren_effect", true)) {
                                                                                                    if (strcmp(info, "team", true)) {
                                                                                                        new var27;
                                                                                                        if (strcmp(info, "he", true) && strcmp(info, "sg", true) && strcmp(info, "fb", true)) {
                                                                                                            if (IsPlayerAlive(client)) {
                                                                                                                decl gren_slot;
                                                                                                                if (info[0] == 'h') {
                                                                                                                    gren_slot = 4;
                                                                                                                } else {
                                                                                                                    if (info[0] == 's') {
                                                                                                                        gren_slot = 5;
                                                                                                                    }
                                                                                                                    gren_slot = 3;
                                                                                                                }
                                                                                                                new gren_count = wS_GetClientGrenadeCount(client, gren_slot);
                                                                                                                new var29;
                                                                                                                if (gren_count < 1 || (gren_slot == 3 && gren_count < 2)) {
                                                                                                                    if (gren_slot == 3) {
                                                                                                                        new var35 = g_VipValue[client][8];
                                                                                                                        var35--;
                                                                                                                        gren_count = var35;
                                                                                                                        if (gren_count < 1) {
                                                                                                                            g_VipFeatureOn[client][25] = false;
                                                                                                                        }
                                                                                                                        Format(text, 75, "%T", 53312, client, g_VipValue[client][8]);
                                                                                                                        GivePlayerItem(client, "weapon_flashbang", 0);
                                                                                                                    } else {
                                                                                                                        if (gren_slot == 4) {
                                                                                                                            new var36 = g_VipValue[client][6];
                                                                                                                            var36--;
                                                                                                                            gren_count = var36;
                                                                                                                            if (gren_count < 1) {
                                                                                                                                g_VipFeatureOn[client][23] = false;
                                                                                                                            }
                                                                                                                            Format(text, 75, "%T", 53348, client, g_VipValue[client][6]);
                                                                                                                            GivePlayerItem(client, "weapon_hegrenade", 0);
                                                                                                                        }
                                                                                                                        new var37 = g_VipValue[client][7];
                                                                                                                        var37--;
                                                                                                                        gren_count = var37;
                                                                                                                        if (gren_count < 1) {
                                                                                                                            g_VipFeatureOn[client][24] = false;
                                                                                                                        }
                                                                                                                        Format(text, 75, "%T", 53384, client, g_VipValue[client][7]);
                                                                                                                        GivePlayerItem(client, "weapon_smokegrenade", 0);
                                                                                                                    }
                                                                                                                    if (gren_count < 1) {
                                                                                                                        ITEM_TYPE = 1;
                                                                                                                    }
                                                                                                                    need_edit_item = true;
                                                                                                                }
                                                                                                            }
                                                                                                        }
                                                                                                    }
                                                                                                    g_MyLastVipMenuItem[client] = GetMenuSelectionPosition();
                                                                                                    SendPanelToClient(g_TeamPanel, client, TeamPanel_CallBack, 0);
                                                                                                    return 0;
                                                                                                }
                                                                                                enabled = !g_VipFeatureOn[client][7];
                                                                                                g_VipFeatureOn[client][7] = enabled;
                                                                                                SetTrieValue(g_CookieTrie[21], g_SteamId[client], enabled, true);
                                                                                                new var26;
                                                                                                if (enabled) {
                                                                                                    var26[0] = str_ON;
                                                                                                } else {
                                                                                                    var26[0] = str_OFF;
                                                                                                }
                                                                                                Format(text, 75, "%T %s", 53264, client, var26);
                                                                                                need_edit_item = true;
                                                                                            }
                                                                                            enabled = !g_VipFeatureOn[client][6];
                                                                                            g_VipFeatureOn[client][6] = enabled;
                                                                                            SetTrieValue(g_CookieTrie[16], g_SteamId[client], enabled, true);
                                                                                            new var25;
                                                                                            if (enabled) {
                                                                                                var25[0] = str_ON;
                                                                                            } else {
                                                                                                var25[0] = str_OFF;
                                                                                            }
                                                                                            Format(text, 75, "%T %s", 53224, client, var25);
                                                                                            need_edit_item = true;
                                                                                        }
                                                                                        enabled = !g_VipFeatureOn[client][4];
                                                                                        g_VipFeatureOn[client][4] = enabled;
                                                                                        SetTrieValue(g_CookieTrie[15], g_SteamId[client], enabled, true);
                                                                                        new var24;
                                                                                        if (enabled) {
                                                                                            var24[0] = str_ON;
                                                                                        } else {
                                                                                            var24[0] = str_OFF;
                                                                                        }
                                                                                        Format(text, 75, "%T %s", 53192, client, var24);
                                                                                        need_edit_item = true;
                                                                                    }
                                                                                    enabled = !g_VipFeatureOn[client][3];
                                                                                    g_VipFeatureOn[client][3] = enabled;
                                                                                    SetTrieValue(g_CookieTrie[14], g_SteamId[client], enabled, true);
                                                                                    new var23;
                                                                                    if (enabled) {
                                                                                        var23[0] = str_ON;
                                                                                    } else {
                                                                                        var23[0] = str_OFF;
                                                                                    }
                                                                                    Format(text, 75, "%T %s", 53160, client, var23);
                                                                                    need_edit_item = true;
                                                                                }
                                                                                new var22;
                                                                                if (g_VipFeatureOn[client][30] && IsPlayerAlive(client)) {
                                                                                    new var34 = g_VipValue[client][13];
                                                                                    var34--;
                                                                                    if (var34 < 1) {
                                                                                        g_VipFeatureOn[client][30] = false;
                                                                                    }
                                                                                    decl Float:origin[3];
                                                                                    wS_GetAimInfo(client, false, true, origin);
                                                                                    origin[2] += 25.0;
                                                                                    TeleportEntity(client, origin, NULL_VECTOR, NULL_VECTOR);
                                                                                    Format(text, 75, "%T", 53128, client, g_VipValue[client][13]);
                                                                                    if (g_VipValue[client][13] < 1) {
                                                                                        ITEM_TYPE = 1;
                                                                                    }
                                                                                    need_edit_item = true;
                                                                                }
                                                                            }
                                                                            new var21;
                                                                            if (g_VipFeatureOn[client][29] && !IsPlayerAlive(client) && GetClientTeam(client) > 1) {
                                                                                new var33 = g_VipValue[client][12];
                                                                                var33--;
                                                                                if (var33 < 1) {
                                                                                    g_VipFeatureOn[client][29] = false;
                                                                                }
                                                                                CS_RespawnPlayer(client);
                                                                                Format(text, 75, "%T", 53096, client, g_VipValue[client][12]);
                                                                                if (g_VipValue[client][12] < 1) {
                                                                                    ITEM_TYPE = 1;
                                                                                }
                                                                                need_edit_item = true;
                                                                            }
                                                                        }
                                                                        g_MyLastVipMenuItem[client] = GetMenuSelectionPosition();
                                                                        wS_ShowAdminFlagsPanel(client);
                                                                        return 0;
                                                                    }
                                                                    enabled = !g_VipFeatureOn[client][28];
                                                                    g_VipFeatureOn[client][28] = enabled;
                                                                    SetTrieValue(g_CookieTrie[13], g_SteamId[client], enabled, true);
                                                                    new var19;
                                                                    if (enabled) {
                                                                        var19 = str_ON;
                                                                    } else {
                                                                        var19 = str_OFF;
                                                                    }
                                                                    Format(text, 75, "%T %s", 53060, client, g_VipValue[client][11], var19);
                                                                    need_edit_item = true;
                                                                    new AdminId:id = wS_GetAdminId(client, true);
                                                                    if (id != AdminId:-1) {
                                                                        new var20;
                                                                        if (enabled) {
                                                                            var20 = g_VipValue[client][11];
                                                                        } else {
                                                                            var20 = 0;
                                                                        }
                                                                        SetAdminImmunityLevel(id, var20);
                                                                    }
                                                                }
                                                                enabled = !g_VipFeatureOn[client][14];
                                                                g_VipFeatureOn[client][14] = enabled;
                                                                SetTrieValue(g_CookieTrie[12], g_SteamId[client], enabled, true);
                                                                new var18;
                                                                if (enabled) {
                                                                    var18[0] = str_ON;
                                                                } else {
                                                                    var18[0] = str_OFF;
                                                                }
                                                                Format(text, 75, "%T %s", 53028, client, var18);
                                                                need_edit_item = true;
                                                            }
                                                            enabled = !g_VipFeatureOn[client][27];
                                                            g_VipFeatureOn[client][27] = enabled;
                                                            SetTrieValue(g_CookieTrie[11], g_SteamId[client], enabled, true);
                                                            new var17;
                                                            if (enabled) {
                                                                var17 = str_ON;
                                                            } else {
                                                                var17 = str_OFF;
                                                            }
                                                            Format(text, 75, "%T %s", 52996, client, g_VipValue[client][10], var17);
                                                            need_edit_item = true;
                                                        }
                                                        enabled = !g_VipFeatureOn[client][13];
                                                        g_VipFeatureOn[client][13] = enabled;
                                                        SetTrieValue(g_CookieTrie[10], g_SteamId[client], enabled, true);
                                                        new var16;
                                                        if (enabled) {
                                                            var16[0] = str_ON;
                                                        } else {
                                                            var16[0] = str_OFF;
                                                        }
                                                        Format(text, 75, "%T %s", 52968, client, var16);
                                                        need_edit_item = true;
                                                    }
                                                    new var15;
                                                    if (IsPlayerAlive(client) && g_VipFeatureOn[client][26] && wS_VipTryCreateLaser(client)) {
                                                        new var32 = g_VipValue[client][9];
                                                        var32--;
                                                        if (var32 < 1) {
                                                            g_VipFeatureOn[client][26] = false;
                                                        }
                                                        Format(text, 75, "%T", 52940, client, g_VipValue[client][9]);
                                                        if (g_VipValue[client][9] < 1) {
                                                            ITEM_TYPE = 1;
                                                        }
                                                        need_edit_item = true;
                                                    }
                                                }
                                                if (g_OverlaysCount < 1) {
                                                    PrintToChat(client, "cfg/vip/overlays.txt не найден или пуст");
                                                    ITEM_TYPE = 1;
                                                } else {
                                                    new overlay_item = g_MyOverlayItem[client] + 1;
                                                    if (overlay_item > g_OverlaysCount) {
                                                        overlay_item = 0;
                                                    }
                                                    new var31 = overlay_item;
                                                    g_MyOverlayItem[client] = var31;
                                                    SetTrieValue(g_CookieTrie[20], g_SteamId[client], var31, true);
                                                    g_VipFeatureOn[client][15] = overlay_item > 0;
                                                    Format(text, 75, "%T", 52908, client, overlay_item, 43208);
                                                    if (IsPlayerAlive(client)) {
                                                        if (overlay_item) {
                                                            wS_TrySetOverlay(client, overlay_item);
                                                        }
                                                        wS_ClearOverlay(client);
                                                    }
                                                }
                                                need_edit_item = true;
                                            }
                                            g_MyLastVipMenuItem[client] = GetMenuSelectionPosition();
                                            DisplayMenu(g_Trails_Menu, client, 0);
                                            return 0;
                                        }
                                        enabled = !g_VipFeatureOn[client][10];
                                        g_VipFeatureOn[client][10] = enabled;
                                        SetTrieValue(g_CookieTrie[9], g_SteamId[client], enabled, true);
                                        new var14;
                                        if (enabled) {
                                            var14[0] = str_ON;
                                        } else {
                                            var14[0] = str_OFF;
                                        }
                                        Format(text, 75, "%T %s", 52816, client, var14);
                                        need_edit_item = true;
                                    }
                                    enabled = !g_VipFeatureOn[client][9];
                                    g_VipFeatureOn[client][9] = enabled;
                                    SetTrieValue(g_CookieTrie[8], g_SteamId[client], enabled, true);
                                    new var13;
                                    if (enabled) {
                                        var13[0] = str_ON;
                                    } else {
                                        var13[0] = str_OFF;
                                    }
                                    Format(text, 75, "%T %s", 52780, client, var13);
                                    need_edit_item = true;
                                }
                                enabled = !g_VipFeatureOn[client][21];
                                g_VipFeatureOn[client][21] = enabled;
                                SetTrieValue(g_CookieTrie[7], g_SteamId[client], enabled, true);
                                new var12;
                                if (enabled) {
                                    var12 = str_ON;
                                } else {
                                    var12 = str_OFF;
                                }
                                Format(text, 75, "%T %s", 52748, client, g_VipValue[client][4], var12);
                                need_edit_item = true;
                            }
                            enabled = !g_VipFeatureOn[client][19];
                            g_VipFeatureOn[client][19] = enabled;
                            SetTrieValue(g_CookieTrie[4], g_SteamId[client], enabled, true);
                            new var11;
                            if (enabled) {
                                var11 = str_ON;
                            } else {
                                var11 = str_OFF;
                            }
                            Format(text, 75, "%T %s", 52716, client, g_VipValue[client][2], var11);
                            need_edit_item = true;
                        }
                        if (GetEntityGravity(client) != g_VipValue[client][0]) {
                            enabled = true;
                            SetEntityGravity(client, g_VipValue[client][0]);
                        } else {
                            enabled = false;
                            SetEntityGravity(client, 1.0);
                        }
                        g_VipFeatureOn[client][17] = enabled;
                        SetTrieValue(g_CookieTrie[3], g_SteamId[client], enabled, true);
                        new var10;
                        if (enabled) {
                            var10 = str_ON;
                        } else {
                            var10 = str_OFF;
                        }
                        Format(text, 75, "%T %s", 52680, client, g_VipValue[client], var10);
                        need_edit_item = true;
                    }
                    enabled = !g_VipFeatureOn[client][8];
                    g_VipFeatureOn[client][8] = enabled;
                    SetTrieValue(g_CookieTrie[2], g_SteamId[client], enabled, true);
                    new var9;
                    if (enabled) {
                        var9[0] = str_ON;
                    } else {
                        var9[0] = str_OFF;
                    }
                    Format(text, 75, "%T %s", 52648, client, var9);
                    need_edit_item = true;
                }
                enabled = !g_VipFeatureOn[client][22];
                g_VipFeatureOn[client][22] = enabled;
                SetTrieValue(g_CookieTrie[1], g_SteamId[client], enabled, true);
                new var6;
                if (enabled) {
                    var6 = str_ON;
                } else {
                    var6 = str_OFF;
                }
                Format(text, 75, "%T %s", 52604, client, g_VipValue[client][5], var6);
                need_edit_item = true;
                if (player_alive) {
                    wS_KillTimer(g_RehpTimer[client]);
                    if (enabled) {
                        decl max_hp;
                        new var7;
                        if (g_VipHave[client][20] && g_VipFeatureOn[client][20]) {
                            var8 = g_VipValue[client][3];
                        } else {
                            var8 = 100;
                        }
                        max_hp = var8;
                        if (GetEntProp(client, PropType:0, "m_iHealth", 4, 0) < max_hp) {
                            g_RehpTimer[client] = CreateTimer(1.0, g_RehpTimer_CallBack, client, 1);
                        }
                    }
                }
            }
            g_MyLastVipMenuItem[client] = GetMenuSelectionPosition();
            wS_Show_g_VipSkinColorsMenu(client, 0);
            return 0;
        }
        enabled = !g_VipFeatureOn[client][18];
        g_VipFeatureOn[client][18] = enabled;
        SetTrieValue(g_CookieTrie[5], g_SteamId[client], enabled, true);
        new var3;
        if (enabled) {
            var3 = str_ON;
        } else {
            var3 = str_OFF;
        }
        Format(text, 75, "%T %s", 52524, client, g_VipValue[client][1], var3);
        need_edit_item = true;
        if (player_alive) {
            new var4;
            if (enabled) {
                var4 = g_VipValue[client][1];
            } else {
                var4 = 1.0;
            }
            SetEntPropFloat(client, PropType:1, "m_flLaggedMovementValue", var4, 0);
        }
    } else {
        enabled = !g_VipFeatureOn[client][20];
        g_VipFeatureOn[client][20] = enabled;
        SetTrieValue(g_CookieTrie[0], g_SteamId[client], enabled, true);
        new var2;
        if (enabled) {
            var2 = str_ON;
        } else {
            var2 = str_OFF;
        }
        Format(text, 75, "%T %s", 52496, client, g_VipValue[client][3], var2);
        need_edit_item = true;
    }
    if (need_edit_item) {
        InsertMenuItem(menu, item, info, text, ITEM_TYPE);
        RemoveMenuItem(menu, item + 1);
    }
    DisplayMenuAtItem(menu, client, GetMenuSelectionPosition(), 0);
    return 0;
}

wS_ReloadVipChatIgnoreCommands()
{
    if (0 < g_Num) {
        new var5 = MaxClients;
        if (1 > var5 & 0 < var5) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (!g_ChatCommandsTrie) {
        g_ChatCommandsTrie = CreateTrie();
    }
    static old_change_time = -1;
    new new_change_time = GetFileTime("cfg/vip/vip_chat_ignore_commands.txt", FileTimeMode:2);
    new var1;
    if (new_change_time == -1 || old_change_time != new_change_time) {
        if (new_change_time == -1) {
            LogToFileEx(g_ErrorLogFile, "cfg/vip/vip_chat_ignore_commands.txt not found");
        }
        return 0;
    }
    old_change_time = new_change_time;
    ClearTrie(g_ChatCommandsTrie);
    new Handle:file = OpenFile("cfg/vip/vip_chat_ignore_commands.txt", "r");
    if (file) {
        decl String:command[128];
        while (!IsEndOfFile(file) && ReadFileLine(file, command, 125)) {
            TrimString(command);
            new var3;
            if ((command[0] == '/' && command[0] == '/') && strlen(command) > 0) {
                SetTrieValue(g_ChatCommandsTrie, command, any:1, true);
            }
        }
        CloseHandle(file);
        return 0;
    }
    LogToFileEx(g_ErrorLogFile, "cfg/vip/vip_chat_ignore_commands.txt not found");
    return 0;
}

wS_ShowAdminFlagsPanel(client)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new Handle:panel = CreatePanel(Handle:0);
    decl String:str_value[68];
    Format(str_value, 65, "%T\n \n", 53616, client);
    SetPanelTitle(panel, str_value, false);
    if (GetTrieString(g_VipGroupTrie_admin, g_MyVipGroup[client], str_value, 45, 0)) {
        new flags_count = strlen(str_value);
        if (0 < flags_count) {
            decl String:str_flags[252];
            decl String:flag_name[20];
            decl String:trie_flag[4];
            str_flags[0] = MissingTAG:0;
            new i = 0;
            while (i < flags_count) {
                Format(trie_flag, 3, "%c", str_value[i]);
                if (GetTrieString(g_Trie_AdminFlagName, trie_flag, flag_name, 20, 0)) {
                    if (str_flags[0]) {
                        Format(str_flags, 250, "%s\n%s", str_flags, flag_name);
                        i++;
                    }
                    strcopy(str_flags, 20, flag_name);
                    i++;
                }
                i++;
            }
            DrawPanelText(panel, str_flags);
        }
    }
    DrawPanelText(panel, " ");
    SetPanelCurrentKey(panel, 8);
    DrawPanelItem(panel, "<-", 0);
    SendPanelToClient(panel, client, wS_ShowAdminFlagsPanel_CallBack, 0);
    CloseHandle(panel);
    return 0;
}

public wS_ShowAdminFlagsPanel_CallBack(Handle:menu, MenuAction:action, param1, param2)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (action == MenuAction:4 && g_VipAccess[param1] && g_VipMenu[param1]) {
        DisplayMenuAtItem(g_VipMenu[param1], param1, g_MyLastVipMenuItem[param1], 0);
    }
    return 0;
}

wS_Create_AdminFlags_Trie()
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    g_Trie_AdminFlagName = CreateTrie();
    SetTrieString(g_Trie_AdminFlagName, "a", "reservation (a)", true);
    SetTrieString(g_Trie_AdminFlagName, "b", "generic (b)", true);
    SetTrieString(g_Trie_AdminFlagName, "c", "kick (c)", true);
    SetTrieString(g_Trie_AdminFlagName, "d", "ban (d)", true);
    SetTrieString(g_Trie_AdminFlagName, "e", "unban (e)", true);
    SetTrieString(g_Trie_AdminFlagName, "f", "slay (f)", true);
    SetTrieString(g_Trie_AdminFlagName, "g", "changemap (g)", true);
    SetTrieString(g_Trie_AdminFlagName, "h", "cvars (h)", true);
    SetTrieString(g_Trie_AdminFlagName, "i", "config (i)", true);
    SetTrieString(g_Trie_AdminFlagName, "j", "chat (j)", true);
    SetTrieString(g_Trie_AdminFlagName, "k", "vote (k)", true);
    SetTrieString(g_Trie_AdminFlagName, "l", "password (l)", true);
    SetTrieString(g_Trie_AdminFlagName, "m", "rcon (m)", true);
    SetTrieString(g_Trie_AdminFlagName, "n", "cheats (n)", true);
    SetTrieString(g_Trie_AdminFlagName, "o", "custom1 (o)", true);
    SetTrieString(g_Trie_AdminFlagName, "p", "custom2 (p)", true);
    SetTrieString(g_Trie_AdminFlagName, "q", "custom3 (q)", true);
    SetTrieString(g_Trie_AdminFlagName, "r", "custom4 (r)", true);
    SetTrieString(g_Trie_AdminFlagName, "s", "custom5 (s)", true);
    SetTrieString(g_Trie_AdminFlagName, "t", "custom6 (t)", true);
    SetTrieString(g_Trie_AdminFlagName, "z", "ROOT (z)", true);
    return 0;
}

wS_ReloadVipSkinsMenu()
{
    if (0 < g_Num) {
        new var4 = MaxClients;
        if (1 > var4 & 0 < var4) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (!g_RedVipSkinsMenu) {
        g_RedVipSkinsMenu = CreateMenu(g_VipSkinsMenu_CallBack, MenuAction:28);
        SetMenuTitle(g_RedVipSkinsMenu, "Выбор скина (T):\n \n");
        SetMenuExitBackButton(g_RedVipSkinsMenu, true);
        AddMenuItem(g_RedVipSkinsMenu, "", "ОТКЛЮЧИТЬ (OFF)\n \n", 0);
        g_BluVipSkinsMenu = CreateMenu(g_VipSkinsMenu_CallBack, MenuAction:28);
        SetMenuTitle(g_BluVipSkinsMenu, "Выбор скина (CT):\n \n");
        SetMenuExitBackButton(g_BluVipSkinsMenu, true);
        AddMenuItem(g_BluVipSkinsMenu, "", "ОТКЛЮЧИТЬ (OFF)\n \n", 0);
    }
    static old_change_time = -1;
    new new_change_time = GetFileTime("cfg/vip/skins.txt", FileTimeMode:2);
    new var1;
    if (new_change_time == -1 || old_change_time != new_change_time) {
        if (new_change_time == -1) {
            LogToFileEx(g_ErrorLogFile, "cfg/vip/skins.txt not found");
        }
        return 0;
    }
    old_change_time = new_change_time;
    RemoveAllMenuItems(g_RedVipSkinsMenu);
    RemoveAllMenuItems(g_BluVipSkinsMenu);
    AddMenuItem(g_RedVipSkinsMenu, "", "ОТКЛЮЧИТЬ (OFF)\n \n", 0);
    AddMenuItem(g_BluVipSkinsMenu, "", "ОТКЛЮЧИТЬ (OFF)\n \n", 0);
    new Handle:kv = CreateKeyValues("skins", "", "");
    new var2;
    if (!FileToKeyValues(kv, "cfg/vip/skins.txt") || !KvGotoFirstSubKey(kv, true)) {
        CloseHandle(kv);
        LogToFileEx(g_ErrorLogFile, "cfg/vip/skins.txt KeyValues Error (UTF-8 без BOM!)");
        return 0;
    }
    decl String:model_name[68];
    decl String:model_path[128];
    decl String:str_team[8];
    decl team;
    do {
        if (KvGetSectionName(kv, model_name, 65)) {
            KvGetString(kv, "team", str_team, 5, "");
            if (strcmp(str_team, "t", false)) {
                if (strcmp(str_team, "ct", false)) {
                } else {
                    team = 3;
                }
            } else {
                team = 2;
            }
            KvGetString(kv, "model", model_path, 125, "");
            if (wS_EditVipSkin(model_path)) {
                new var3;
                if (team == 2) {
                    var3 = g_RedVipSkinsMenu;
                } else {
                    var3 = g_BluVipSkinsMenu;
                }
                AddMenuItem(var3, model_path, model_name, 0);
            }
        }
    } while (KvGotoNextKey(kv, true));
    CloseHandle(kv);
    return 0;
}

wS_ShowVipSkinsPanel(client)
{
    if (0 < g_Num) {
        new var3 = MaxClients;
        if (1 > var3 & 0 < var3) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new Handle:panel = CreatePanel(Handle:0);
    decl String:text[96];
    Format(text, 95, "%T\n \n", 54384, client);
    SetPanelTitle(panel, text, false);
    if (0 < g_MyRedSkinNum[client]) {
        text[0] = MissingTAG:0;
        decl String:temp[4];
        GetMenuItem(g_RedVipSkinsMenu, g_MyRedSkinNum[client], temp, 1, 0, text, 95);
        Format(text, 95, "%T", 54404, client, text);
    } else {
        Format(text, 95, "%T", 54420, client);
    }
    new var1;
    if (g_VipHave[client][0]) {
        var1 = 0;
    } else {
        var1 = 1;
    }
    DrawPanelItem(panel, text, var1);
    if (0 < g_MyBluSkinNum[client]) {
        text[0] = MissingTAG:0;
        decl String:temp[4];
        GetMenuItem(g_BluVipSkinsMenu, g_MyBluSkinNum[client], temp, 1, 0, text, 95);
        Format(text, 95, "%T", 54440, client, text);
    } else {
        Format(text, 95, "%T", 54456, client);
    }
    new var2;
    if (g_VipHave[client][1]) {
        var2 = 0;
    } else {
        var2 = 1;
    }
    DrawPanelItem(panel, text, var2);
    DrawPanelText(panel, " ");
    SetPanelCurrentKey(panel, 8);
    DrawPanelItem(panel, "<-", 0);
    SetPanelCurrentKey(panel, 10);
    DrawPanelItem(panel, "Выход", 0);
    SendPanelToClient(panel, client, vipskin_PaneL_CallBack, 0);
    CloseHandle(panel);
    return 0;
}

public vipskin_PaneL_CallBack(Handle:panel, MenuAction:action, client, option)
{
    if (0 < g_Num) {
        new var4 = MaxClients;
        if (1 > var4 & 0 < var4) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (action == MenuAction:4 && g_VipAccess[client]) {
        new var2;
        if (option == 1 && g_VipHave[client][0]) {
            DisplayMenu(g_RedVipSkinsMenu, client, 0);
        } else {
            new var3;
            if (option == 2 && g_VipHave[client][1]) {
                DisplayMenu(g_BluVipSkinsMenu, client, 0);
            }
            if (option == 8) {
                DisplayMenuAtItem(g_VipMenu[client], client, g_MyLastVipMenuItem[client], 0);
            }
        }
        ClientCommand(client, "playgamesound \"buttons/button14.wav\"");
    }
    return 0;
}

public g_VipSkinsMenu_CallBack(Handle:menu, MenuAction:action, client, item)
{
    if (0 < g_Num) {
        new var6 = MaxClients;
        if (1 > var6 & 0 < var6) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (action == MenuAction:8 && item == -6) {
        wS_ShowVipSkinsPanel(client);
        return 0;
    }
    if (action != MenuAction:4) {
        return 0;
    }
    if (g_RedVipSkinsMenu == menu) {
        g_VipFeatureOn[client][0] = item > 0;
        g_MyRedSkinNum[client] = item;
        SetTrieValue(g_CookieTrie[18], g_SteamId[client], item, true);
    } else {
        g_VipFeatureOn[client][1] = item > 0;
        g_MyBluSkinNum[client] = item;
        SetTrieValue(g_CookieTrie[19], g_SteamId[client], item, true);
    }
    if (IsPlayerAlive(client)) {
        new T = GetClientTeam(client);
        new var2;
        if ((T == 2 && g_RedVipSkinsMenu == menu && g_VipHave[client][0]) || (T == 3 && g_BluVipSkinsMenu == menu && g_VipHave[client][1])) {
            if (item) {
                wS_SetVipSkin(client, true, item, menu);
            }
            new var5;
            if (T == 2) {
                var5[0] = 54540;
            } else {
                var5[0] = 54568;
            }
            SetEntityModel(client, var5);
        }
    }
    wS_ShowVipSkinsPanel(client);
    return 0;
}

wS_SetVipSkin(client, bool:access, item, Handle:menu)
{
    if (0 < g_Num) {
        new var3 = MaxClients;
        if (1 > var3 & 0 < var3) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (access && item > 0) {
        decl String:model[128];
        new var2;
        if (GetMenuItem(menu, item, model, 125, 0, "", 0) && model[0] == 'm') {
            SetEntityModel(client, model);
        }
    }
    return 0;
}

wS_Create_TeamPanel()
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    g_TeamPanel = CreatePanel(Handle:0);
    SetPanelTitle(g_TeamPanel, "Смена Команды\n \n", false);
    DrawPanelItem(g_TeamPanel, "Spectator", 0);
    DrawPanelItem(g_TeamPanel, "Terrorist (T)", 0);
    DrawPanelItem(g_TeamPanel, "Counter-Terrorist (CT)\n \n", 0);
    SetPanelCurrentKey(g_TeamPanel, 8);
    DrawPanelItem(g_TeamPanel, "<-", 0);
    SetPanelCurrentKey(g_TeamPanel, 10);
    DrawPanelItem(g_TeamPanel, "Выход", 0);
    return 0;
}

public TeamPanel_CallBack(Handle:panel, MenuAction:action, client, item)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (action == MenuAction:4 && item > 8 && !g_VipAccess[client]) {
        return 0;
    }
    if (item == 8) {
        DisplayMenuAtItem(g_VipMenu[client], client, g_MyLastVipMenuItem[client], 0);
        return 0;
    }
    if (GetClientTeam(client) != item) {
        ChangeClientTeam(client, item);
    }
    SendPanelToClient(g_TeamPanel, client, TeamPanel_CallBack, 0);
    return 0;
}

wS_ReloadVipSkinColorsMenu()
{
    if (0 < g_Num) {
        new var3 = MaxClients;
        if (1 > var3 & 0 < var3) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (!g_VipSkinColorsMenu) {
        g_VipSkinColorsMenu = CreateMenu(g_VipSkinColorsMenu_CallBack, MenuAction:28);
        SetMenuExitBackButton(g_VipSkinColorsMenu, true);
        AddMenuItem(g_VipSkinColorsMenu, "", "ОТКЛЮЧИТЬ (OFF)\n \n", 0);
    }
    static old_change_time = -1;
    new new_change_time = GetFileTime("cfg/vip/colors.txt", FileTimeMode:2);
    new var1;
    if (new_change_time == -1 || old_change_time != new_change_time) {
        if (new_change_time == -1) {
            LogToFileEx(g_ErrorLogFile, "cfg/vip/colors.txt not found");
        }
        return 0;
    }
    old_change_time = new_change_time;
    RemoveAllMenuItems(g_VipSkinColorsMenu);
    AddMenuItem(g_VipSkinColorsMenu, "", "ОТКЛЮЧИТЬ (OFF)\n \n", 0);
    new Handle:kv = CreateKeyValues("colors", "", "");
    new var2;
    if (!FileToKeyValues(kv, "cfg/vip/colors.txt") || !KvGotoFirstSubKey(kv, true)) {
        CloseHandle(kv);
        LogToFileEx(g_ErrorLogFile, "cfg/vip/colors.txt KeyValues Error (UTF-8 без BOM!)");
        return 0;
    }
    decl String:ColorName[68];
    decl String:ColorInfo[28];
    decl r;
    decl g;
    decl b;
    decl a;
    do {
        if (KvGetSectionName(kv, ColorName, 65)) {
            r = 0;
            g = 0;
            b = 0;
            a = 0;
            KvGetColor(kv, "rgba", r, g, b, a);
            if (0 < g + r + b + a) {
                Format(ColorInfo, 25, "%d %d %d %d", r, g, b, a);
                AddMenuItem(g_VipSkinColorsMenu, ColorInfo, ColorName, 0);
            }
        }
    } while (KvGotoNextKey(kv, true));
    CloseHandle(kv);
    return 0;
}

public g_VipSkinColorsMenu_CallBack(Handle:menu, MenuAction:action, client, item)
{
    if (0 < g_Num) {
        new var3 = MaxClients;
        if (1 > var3 & 0 < var3) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (action == MenuAction:8 && item == -6) {
        DisplayMenuAtItem(g_VipMenu[client], client, g_MyLastVipMenuItem[client], 0);
        return 0;
    }
    new var2;
    if (action == MenuAction:4 && !g_VipHave[client][16]) {
        return 0;
    }
    if (g_MySkinColorItem[client] == item) {
        wS_Show_g_VipSkinColorsMenu(client, GetMenuSelectionPosition());
        return 0;
    }
    if (item < 1) {
        g_MySkinColor[client][0] = 255;
        g_MySkinColor[client][1] = 255;
        g_MySkinColor[client][2] = 255;
        g_MySkinColor[client][3] = 255;
    } else {
        decl String:str_rgba[28];
        decl String:buffer[16][12];
        GetMenuItem(menu, item, str_rgba, 25, 0, "", 0);
        ExplodeString(str_rgba, " ", buffer, 4, 9, false);
        new i = 0;
        while (i < 4) {
            g_MySkinColor[client][i] = StringToInt(buffer[i], 10);
            i++;
        }
    }
    if (IsPlayerAlive(client)) {
        wS_SetColor(client, g_MySkinColor[client][0], g_MySkinColor[client][1], g_MySkinColor[client][2], g_MySkinColor[client][3]);
    }
    g_MySkinColorItem[client] = item;
    SetTrieValue(g_CookieTrie[6], g_SteamId[client], item, true);
    g_VipFeatureOn[client][16] = item > 0;
    wS_Show_g_VipSkinColorsMenu(client, GetMenuSelectionPosition());
    return 0;
}

wS_Show_g_VipSkinColorsMenu(client, item)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    decl String:title[68];
    if (g_MySkinColorItem[client] < 1) {
        strcopy(title, 65, "Стандартный\n \n");
    } else {
        decl String:temp[4];
        title[0] = MissingTAG:0;
        GetMenuItem(g_VipSkinColorsMenu, g_MySkinColorItem[client], temp, 1, 0, title, 65);
        Format(title, 65, "%s\n \n", title);
    }
    SetMenuTitle(g_VipSkinColorsMenu, title);
    DisplayMenuAtItem(g_VipSkinColorsMenu, client, item, 0);
    return 0;
}

wS_TryRegen(client)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (g_VipAccess[client] && g_RehpTimer[client] && g_VipHave[client][22] && g_VipFeatureOn[client][22]) {
        g_RehpTimer[client] = CreateTimer(1.0, g_RehpTimer_CallBack, client, 1);
    }
    return 0;
}

public Action:g_RehpTimer_CallBack(Handle:timer, any:client)
{
    if (0 < g_Num) {
        new var3 = MaxClients;
        if (1 > var3 & 0 < var3) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (IsPlayerAlive(client)) {
        new hp = GetEntProp(client, PropType:0, "m_iHealth", 4, 0);
        decl max_hp;
        new var1;
        if (g_VipHave[client][20] && g_VipFeatureOn[client][20]) {
            var2 = g_VipValue[client][3];
        } else {
            var2 = 100;
        }
        max_hp = var2;
        if (hp < max_hp) {
            hp = g_VipValue[client][5][hp];
            if (hp > max_hp) {
                hp = max_hp;
            }
            SetEntProp(client, PropType:0, "m_iHealth", hp, 4, 0);
            if (hp < max_hp) {
                return Action:0;
            }
        }
    }
    g_RehpTimer[client] = 0;
    return Action:4;
}

wS_ReloadVipTrails()
{
    if (0 < g_Num) {
        new var3 = MaxClients;
        if (1 > var3 & 0 < var3) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (!g_Trails_Menu) {
        g_Trails_Menu = CreateMenu(g_Trails_Menu_CallBack, MenuAction:28);
        SetMenuTitle(g_Trails_Menu, "Выбор Хвоста (TraiL)\n \n");
        SetMenuExitBackButton(g_Trails_Menu, true);
        AddMenuItem(g_Trails_Menu, "", "ОТКЛЮЧИТЬ (OFF)\n \n", 0);
    }
    static old_change_time = -1;
    new new_change_time = GetFileTime("cfg/vip/trails.txt", FileTimeMode:2);
    new var1;
    if (new_change_time == -1 || old_change_time != new_change_time) {
        if (new_change_time == -1) {
            LogToFileEx(g_ErrorLogFile, "cfg/vip/trails.txt not found");
        }
        return 0;
    }
    old_change_time = new_change_time;
    RemoveAllMenuItems(g_Trails_Menu);
    AddMenuItem(g_Trails_Menu, "", "ОТКЛЮЧИТЬ (OFF)\n \n", 0);
    new Handle:kv = CreateKeyValues("trails", "", "");
    new var2;
    if (!FileToKeyValues(kv, "cfg/vip/trails.txt") || !KvGotoFirstSubKey(kv, true)) {
        CloseHandle(kv);
        LogToFileEx(g_ErrorLogFile, "cfg/vip/trails.txt KeyValues Error (UTF-8 без BOM!)");
        return 0;
    }
    decl String:trail_name[68];
    decl String:trail_material[128];
    do {
        if (KvGetSectionName(kv, trail_name, 65)) {
            KvGetString(kv, "material", trail_material, 125, "");
            if (0 < StrContains(trail_material, ".vmt", false)) {
                AddMenuItem(g_Trails_Menu, trail_material, trail_name, 0);
            }
        }
    } while (KvGotoNextKey(kv, true));
    CloseHandle(kv);
    return 0;
}

public g_Trails_Menu_CallBack(Handle:menu, MenuAction:action, client, item)
{
    if (0 < g_Num) {
        new var3 = MaxClients;
        if (1 > var3 & 0 < var3) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (action == MenuAction:8 && item == -6) {
        DisplayMenuAtItem(g_VipMenu[client], client, g_MyLastVipMenuItem[client], 0);
        return 0;
    }
    new var2;
    if (action == MenuAction:4 && wS_VipMenuFloodDetected(client, true)) {
        return 0;
    }
    if (item == g_MyTrailNum[client]) {
        DisplayMenuAtItem(menu, client, GetMenuSelectionPosition(), 0);
        return 0;
    }
    g_MyTrailNum[client] = item;
    SetTrieValue(g_CookieTrie[17], g_SteamId[client], item, true);
    g_VipFeatureOn[client][11] = item > 0;
    if (IsPlayerAlive(client)) {
        new trail = wS_GetClientTrailIndex(client);
        if (0 < trail) {
            AcceptEntityInput(trail, "HideSprite", -1, -1, 0);
            if (0 < item) {
                wS_SetTrailModelByPosInMenu(trail, item);
                AcceptEntityInput(trail, "ShowSprite", -1, -1, 0);
            }
        }
    }
    DisplayMenuAtItem(menu, client, GetMenuSelectionPosition(), 0);
    return 0;
}

wS_SetTrailModelByPosInMenu(trail, item)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    decl String:material[128];
    if (GetMenuItem(g_Trails_Menu, item, material, 125, 0, "", 0)) {
        DispatchKeyValue(trail, "spritename", material);
        SetEntityModel(trail, material);
    }
    return 0;
}

wS_GetClientTrailIndex(client)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new trail = g_MyTrailIndex[client];
    new var1;
    if (trail < 1 || !IsValidEntity(trail)) {
        trail = wS_CreateVipTrail(client, false);
        g_MyTrailIndex[client] = trail;
    }
    return trail;
}

wS_TryKillPlayerTrail(client)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (0 < client) {
        new ent = g_MyTrailIndex[client];
        if (ent > MaxClients) {
            g_MyTrailIndex[client] = 0;
            if (IsValidEntity(ent)) {
                AcceptEntityInput(ent, "Kill", -1, -1, 0);
            }
        }
    }
    return 0;
}

wS_CreateVipTrail(client, bool:show_sprite)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new trail = CreateEntityByName("env_spritetrail", -1);
    if (trail < 1) {
        g_MyTrailIndex[client] = -1;
        PrintToChat(client, "error: env_spritetrail not created");
        return -1;
    }
    decl Float:trail_origin[3];
    GetClientAbsOrigin(client, trail_origin);
    trail_origin[2] += GetConVarFloat(vip_cvar_trail_height);
    DispatchKeyValueVector(trail, "origin", trail_origin);
    decl String:ParentName[20];
    Format(ParentName, 20, "plr_%d", client);
    DispatchKeyValue(client, "targetname", ParentName);
    SetEntPropFloat(trail, PropType:0, "m_flTextureRes", 0.01, 0);
    wS_SetTrailModelByPosInMenu(trail, g_MyTrailNum[client]);
    DispatchKeyValueFloat(trail, "lifetime", GetConVarFloat(vip_cvar_trail_lifetime));
    DispatchKeyValueFloat(trail, "startwidth", GetConVarFloat(vip_cvar_trail_startwidth));
    DispatchKeyValueFloat(trail, "endwidth", GetConVarFloat(vip_cvar_trail_endwidth));
    DispatchKeyValue(trail, "rendermode", "3");
    DispatchKeyValue(trail, "renderamt", "255");
    DispatchKeyValue(trail, "rendercolor", "255 255 255");
    DispatchSpawn(trail);
    SetVariantString(ParentName);
    AcceptEntityInput(trail, "SetParent", -1, -1, 0);
    new var1;
    if (show_sprite) {
        var1[0] = 55564;
    } else {
        var1[0] = 55576;
    }
    AcceptEntityInput(trail, var1, -1, -1, 0);
    g_MyTrailIndex[client] = trail;
    return trail;
}

wS_ReloadVipOverlays()
{
    if (0 < g_Num) {
        new var5 = MaxClients;
        if (1 > var5 & 0 < var5) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    static old_change_time = -1;
    if (!g_Array_Overlays) {
        g_Array_Overlays = CreateArray(125, 0);
        PushArrayString(g_Array_Overlays, "");
    }
    new new_change_time = GetFileTime("cfg/vip/overlays.txt", FileTimeMode:2);
    new var1;
    if (old_change_time != new_change_time && new_change_time == -1) {
        if (new_change_time == -1) {
            LogToFileEx(g_ErrorLogFile, "cfg/vip/overlays.txt not found");
        }
        return 0;
    }
    old_change_time = new_change_time;
    g_OverlaysCount = 0;
    ClearArray(g_Array_Overlays);
    PushArrayString(g_Array_Overlays, "");
    new Handle:file = OpenFile("cfg/vip/overlays.txt", "r");
    if (file) {
        decl String:overlay[128];
        while (!IsEndOfFile(file) && ReadFileLine(file, overlay, 125)) {
            TrimString(overlay);
            new var3;
            if ((overlay[0] == '/' && overlay[0] == '/') && strlen(overlay) > 5) {
                PushArrayString(g_Array_Overlays, overlay);
                g_OverlaysCount += 1;
            }
        }
        CloseHandle(file);
        return 0;
    }
    LogToFileEx(g_ErrorLogFile, "cfg/vip/overlays.txt not found");
    return 0;
}

wS_ClearOverlay(client)
{
    ClientCommand(client, "r_screenoverlay \"\"");
    return 0;
}

wS_TrySetOverlayPause(client)
{
    new var1;
    if (g_VipHave[client][15] && g_VipFeatureOn[client][15]) {
        wS_ClearOverlay(client);
    }
    return 0;
}

wS_TrySetOverlay(client, item)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (0 < item) {
        decl String:material[128];
        material[0] = MissingTAG:0;
        GetArrayString(g_Array_Overlays, item, material, 125);
        ClientCommand(client, "r_screenoverlay \"%s\"", material);
    }
    return 0;
}

bool:wS_VipTryCreateLaser(vip_client)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    decl Float:start_pos[3];
    decl Float:normal[3];
    GetClientEyePosition(vip_client, start_pos);
    GetClientEyeAngles(vip_client, normal);
    TR_TraceRayFilter(start_pos, normal, 33570827, RayType:1, wS_LaserFilter, vip_client);
    if (!TR_DidHit(Handle:0)) {
        return false;
    }
    decl Float:laser_start_pos[3];
    TR_GetEndPosition(laser_start_pos, Handle:0);
    TR_GetPlaneNormal(Handle:0, normal);
    GetVectorAngles(normal, normal);
    TR_TraceRayFilter(laser_start_pos, normal, 33570827, RayType:1, wS_LaserFilter, vip_client);
    decl Float:laser_end_pos[3];
    TR_GetEndPosition(laser_end_pos, Handle:0);
    if (!TR_DidHit(Handle:0)) {
        return false;
    }
    new index = CreateEntityByName("env_beam", -1);
    if (index < 1) {
        return false;
    }
    DispatchKeyValueVector(index, "origin", laser_start_pos);
    SetEntityModel(index, "sprites/laser.vmt");
    DispatchKeyValue(index, "texture", "sprites/laser.vmt");
    DispatchKeyValue(index, "life", "0");
    DispatchKeyValue(index, "renderamt", "255");
    if (GetClientTeam(vip_client) == 2) {
        DispatchKeyValue(index, "rendercolor", "255 0 0");
        DispatchKeyValue(index, "targetname", "vip_laser_2");
    } else {
        DispatchKeyValue(index, "rendercolor", "0 0 255");
        DispatchKeyValue(index, "targetname", "vip_laser_3");
    }
    decl String:str_width[8];
    str_width[0] = MissingTAG:0;
    GetConVarString(vip_cvar_laser_width, str_width, 7);
    DispatchKeyValue(index, "BoltWidth", str_width);
    DispatchKeyValue(index, "StrikeTime", "0");
    DispatchKeyValue(index, "TouchType", "4");
    SetEntPropVector(index, PropType:1, "m_vecEndPos", laser_end_pos, 0);
    DispatchKeyValue(index, "spawnflags", "1");
    DispatchSpawn(index);
    EmitAmbientSound("ambient/office/button1.wav", NULL_VECTOR, index, 75, 0, 1.0, 100, 0.0);
    new Float:laser_life = GetConVarFloat(vip_cvar_laser_life);
    if (laser_life > 0.0) {
        decl String:info[56];
        Format(info, 55, "OnUser1 !self:kill::%f:1", laser_life);
        SetVariantString(info);
        AcceptEntityInput(index, "AddOutput", -1, -1, 0);
        AcceptEntityInput(index, "FireUser1", -1, -1, 0);
    }
    HookSingleEntityOutput(index, "OnTouchedByEntity", Event_LaserTouched, false);
    return true;
}

/* ERROR! lysis.nodes.types.DReturn cannot be cast to lysis.nodes.types.DJumpCondition */
 function "wS_LaserFilter" (number 93)
public Event_LaserTouched(String:output[], ent, activator, Float:delay)
{
    if (0 < g_Num) {
        new var4 = MaxClients;
        if (1 > var4 & 0 < var4) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (activator < 1 || activator > MaxClients) {
        return 0;
    }
    decl String:laser_name[16];
    laser_name[0] = MissingTAG:0;
    GetEntPropString(ent, PropType:1, "m_iName", laser_name, 15, 0);
    new var2;
    if (GetClientTeam(activator) == StringToInt(laser_name[2], 10) && !GetConVarBool(vip_cvar_laser_team)) {
        decl Float:origin[3];
        GetClientAbsOrigin(activator, origin);
        ForcePlayerSuicide(activator);
        TE_SetupExplosion(origin, g_LaserIndex, 50.0, 0, 0, 150, 1, 56140, 67);
        TE_SendToAll(0.0);
        EmitAmbientSound("weapons/hegrenade/explode5.wav", NULL_VECTOR, activator, 75, 0, 1.0, 100, 0.0);
        new ragdoll = GetEntPropEnt(activator, PropType:0, "m_hRagdoll", 0);
        new var3;
        if (ragdoll > 0 && IsValidEntity(ragdoll)) {
            IgniteEntity(ragdoll, 3.0, false, 0.0, false);
            CreateTimer(3.0, KillRagdoll_Timer, ragdoll, 0);
        }
        if (GetConVarBool(vip_cvar_laser_clear)) {
            AcceptEntityInput(ent, "Kill", -1, -1, 0);
            return 0;
        }
    }
    AcceptEntityInput(ent, "TurnOff", -1, -1, 0);
    CreateTimer(0.1, ActivateLaser_Timer, ent, 0);
    return 0;
}

public Action:ActivateLaser_Timer(Handle:timer, any:laser)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (IsValidEntity(laser)) {
        AcceptEntityInput(laser, "TurnOn", -1, -1, 0);
    }
    return Action:0;
}

public Action:KillRagdoll_Timer(Handle:timer, any:ragdoll)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (IsValidEntity(ragdoll)) {
        decl String:name[16];
        new var1;
        if (GetEntityClassname(ragdoll, name, 15) && strcmp(name, "cs_ragdoll", true)) {
            Format(name, 15, "rgd_%d", ragdoll);
            DispatchKeyValue(ragdoll, "targetname", name);
            wS_DissolveEntityByName(ragdoll, name);
        }
    }
    return Action:0;
}

public Action:drop(client, String:command[], args)
{
    if (0 < g_Num) {
        new var3 = MaxClients;
        if (1 > var3 & 0 < var3) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (client > 0 && g_VipHave[client][2] && IsPlayerAlive(client)) {
        new index = GetEntPropEnt(client, PropType:1, "m_hActiveWeapon", 0);
        if (0 < index) {
            decl String:class[28];
            if (GetEntityClassname(index, class, 25)) {
                new var2;
                if (strcmp(class[1], "hegrenade", true) && strcmp(class[1], "smokegrenade", true) && strcmp(class[1], "flashbang", true)) {
                    CS_DropWeapon(client, index, true, false);
                    return Action:3;
                }
            }
        }
    }
    return Action:0;
}

wS_CreateBarrel(client)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new index = CreateEntityByName("prop_physics", -1);
    if (0 < index) {
        decl Float:origin[3];
        GetClientEyePosition(client, origin);
        TR_TraceRayFilter(origin, 56340, 33570827, RayType:1, wS_CreateBarrel_TraceRayFilter, client);
        if (TR_DidHit(Handle:0)) {
            TR_GetEndPosition(origin, Handle:0);
            origin[2] -= 30.0;
            DispatchKeyValueVector(index, "origin", origin);
            DispatchKeyValue(index, "model", "models/props_c17/oildrum001_explosive.mdl");
            DispatchSpawn(index);
        } else {
            AcceptEntityInput(index, "Kill", -1, -1, 0);
        }
    }
    return 0;
}

public bool:wS_CreateBarrel_TraceRayFilter(ent, mask, any:client)
{
    return client != ent;
}

wS_CreateBeam(vip_attacker, victim, att_team)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    decl Float:start[3];
    decl Float:end[3];
    GetClientEyePosition(vip_attacker, start);
    GetClientEyePosition(victim, end);
    new var1;
    if (att_team == 3) {
        var1[0] = 56424;
    } else {
        var1[0] = 56440;
    }
    TE_SetupBeamPoints(start, end, g_LaserIndex, g_LaserIndex, 0, 0, 1.0, 2.0, 2.0, 0, 0.0, var1, 10);
    TE_SendToAll(0.0);
    return 0;
}

wS_TryRescueHostage(hostage)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new zone = CreateEntityByName("func_hostage_rescue", -1);
    if (zone < 1) {
        LogToFileEx(g_ErrorLogFile, "func_hostage_rescue error (CreateEntityByName)");
        return 0;
    }
    decl Float:origin[3];
    GetEntPropVector(hostage, PropType:0, "m_vecOrigin", origin, 0);
    DispatchSpawn(zone);
    ActivateEntity(zone);
    SetEntityModel(zone, "models/props/cs_office/vending_machine.mdl");
    SetEntPropVector(zone, PropType:0, "m_vecMins", 56596, 0);
    SetEntPropVector(zone, PropType:0, "m_vecMaxs", 56620, 0);
    SetEntProp(zone, PropType:0, "m_nSolidType", any:2, 4, 0);
    SetEntProp(zone, PropType:0, "m_fEffects", GetEntProp(zone, PropType:0, "m_fEffects", 4, 0) | 32, 4, 0);
    TeleportEntity(zone, origin, NULL_VECTOR, NULL_VECTOR);
    AcceptEntityInput(zone, "Enable", -1, -1, 0);
    SetEntityMoveType(hostage, MoveType:4);
    TeleportEntity(hostage, origin, NULL_VECTOR, origin);
    decl String:info[56];
    Format(info, 55, "OnUser1 !self:kill::0.2:1");
    SetVariantString(info);
    AcceptEntityInput(zone, "AddOutput", -1, -1, 0);
    AcceptEntityInput(zone, "FireUser1", -1, -1, 0);
    return 0;
}

wS_Create_Cookie_Trie()
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    g_CookieTrie[0] = CreateTrie();
    g_CookieTrie[1] = CreateTrie();
    g_CookieTrie[2] = CreateTrie();
    g_CookieTrie[3] = CreateTrie();
    g_CookieTrie[4] = CreateTrie();
    g_CookieTrie[5] = CreateTrie();
    g_CookieTrie[6] = CreateTrie();
    g_CookieTrie[7] = CreateTrie();
    g_CookieTrie[8] = CreateTrie();
    g_CookieTrie[9] = CreateTrie();
    g_CookieTrie[10] = CreateTrie();
    g_CookieTrie[11] = CreateTrie();
    g_CookieTrie[12] = CreateTrie();
    g_CookieTrie[13] = CreateTrie();
    g_CookieTrie[14] = CreateTrie();
    g_CookieTrie[15] = CreateTrie();
    g_CookieTrie[16] = CreateTrie();
    g_CookieTrie[17] = CreateTrie();
    g_CookieTrie[18] = CreateTrie();
    g_CookieTrie[19] = CreateTrie();
    g_CookieTrie[20] = CreateTrie();
    g_CookieTrie[21] = CreateTrie();
    return 0;
}

wS_LoadVipValuesFromCookie(client, String:steamid[])
{
    if (0 < g_Num) {
        new var24 = MaxClients;
        if (1 > var24 & 0 < var24) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new bool:def_status = GetConVarBool(vip_cvar_functions_status);
    decl bool:enabled;
    if (g_VipHave[client][20]) {
        new var1;
        if (GetTrieValue(g_CookieTrie[0], steamid, enabled)) {
            var1 = enabled;
        } else {
            var1 = def_status;
        }
        g_VipFeatureOn[client][20] = var1;
    }
    if (g_VipHave[client][22]) {
        new var2;
        if (GetTrieValue(g_CookieTrie[1], steamid, enabled)) {
            var2 = enabled;
        } else {
            var2 = def_status;
        }
        g_VipFeatureOn[client][22] = var2;
    }
    if (g_VipHave[client][8]) {
        new var3;
        if (GetTrieValue(g_CookieTrie[2], steamid, enabled)) {
            var3 = enabled;
        } else {
            var3 = def_status;
        }
        g_VipFeatureOn[client][8] = var3;
    }
    if (g_VipHave[client][17]) {
        new var4;
        if (GetTrieValue(g_CookieTrie[3], steamid, enabled)) {
            var4 = enabled;
        } else {
            var4 = def_status;
        }
        g_VipFeatureOn[client][17] = var4;
    }
    if (g_VipHave[client][19]) {
        new var5;
        if (GetTrieValue(g_CookieTrie[4], steamid, enabled)) {
            var5 = enabled;
        } else {
            var5 = def_status;
        }
        g_VipFeatureOn[client][19] = var5;
    }
    if (g_VipHave[client][18]) {
        new var6;
        if (GetTrieValue(g_CookieTrie[5], steamid, enabled)) {
            var6 = enabled;
        } else {
            var6 = def_status;
        }
        g_VipFeatureOn[client][18] = var6;
    }
    if (g_VipHave[client][21]) {
        new var7;
        if (GetTrieValue(g_CookieTrie[7], steamid, enabled)) {
            var7 = enabled;
        } else {
            var7 = def_status;
        }
        g_VipFeatureOn[client][21] = var7;
    }
    if (g_VipHave[client][9]) {
        new var8;
        if (GetTrieValue(g_CookieTrie[8], steamid, enabled)) {
            var8 = enabled;
        } else {
            var8 = def_status;
        }
        g_VipFeatureOn[client][9] = var8;
    }
    if (g_VipHave[client][10]) {
        new var9;
        if (GetTrieValue(g_CookieTrie[9], steamid, enabled)) {
            var9 = enabled;
        } else {
            var9 = def_status;
        }
        g_VipFeatureOn[client][10] = var9;
    }
    if (g_VipHave[client][13]) {
        new var10;
        if (GetTrieValue(g_CookieTrie[10], steamid, enabled)) {
            var10 = enabled;
        } else {
            var10 = def_status;
        }
        g_VipFeatureOn[client][13] = var10;
    }
    if (g_VipHave[client][27]) {
        new var11;
        if (GetTrieValue(g_CookieTrie[11], steamid, enabled)) {
            var11 = enabled;
        } else {
            var11 = def_status;
        }
        g_VipFeatureOn[client][27] = var11;
    }
    if (g_VipHave[client][14]) {
        new var12;
        if (GetTrieValue(g_CookieTrie[12], steamid, enabled)) {
            var12 = enabled;
        } else {
            var12 = def_status;
        }
        g_VipFeatureOn[client][14] = var12;
    }
    if (g_VipHave[client][28]) {
        new var13;
        if (GetTrieValue(g_CookieTrie[13], steamid, enabled)) {
            var13 = enabled;
        } else {
            var13 = def_status;
        }
        g_VipFeatureOn[client][28] = var13;
    }
    if (g_VipHave[client][3]) {
        new var14;
        if (GetTrieValue(g_CookieTrie[14], steamid, enabled)) {
            var14 = enabled;
        } else {
            var14 = def_status;
        }
        g_VipFeatureOn[client][3] = var14;
    }
    if (g_VipHave[client][4]) {
        new var15;
        if (GetTrieValue(g_CookieTrie[15], steamid, enabled)) {
            var15 = enabled;
        } else {
            var15 = def_status;
        }
        g_VipFeatureOn[client][4] = var15;
    }
    if (g_VipHave[client][6]) {
        new var16;
        if (GetTrieValue(g_CookieTrie[16], steamid, enabled)) {
            var16 = enabled;
        } else {
            var16 = def_status;
        }
        g_VipFeatureOn[client][6] = var16;
    }
    if (g_VipHave[client][7]) {
        new var17;
        if (GetTrieValue(g_CookieTrie[21], steamid, enabled)) {
            var17 = enabled;
        } else {
            var17 = def_status;
        }
        g_VipFeatureOn[client][7] = var17;
    }
    decl value;
    decl String:temp[4];
    if (g_VipHave[client][11]) {
        new var18;
        if (GetTrieValue(g_CookieTrie[17], steamid, value) && GetMenuItem(g_Trails_Menu, value, temp, 1, 0, "", 0)) {
            g_MyTrailNum[client] = value;
            g_VipFeatureOn[client][11] = value > 0;
        }
    }
    new var19;
    if (g_VipHave[client][0] && GetTrieValue(g_CookieTrie[18], steamid, value)) {
        new var20;
        if (value > 0 && GetMenuItem(g_RedVipSkinsMenu, value, temp, 1, 0, "", 0)) {
            g_MyRedSkinNum[client] = value;
            g_VipFeatureOn[client][0] = true;
        }
    }
    new var21;
    if (g_VipHave[client][1] && GetTrieValue(g_CookieTrie[19], steamid, value) && value > 0) {
        if (GetMenuItem(g_BluVipSkinsMenu, value, temp, 1, 0, "", 0)) {
            g_MyBluSkinNum[client] = value;
            g_VipFeatureOn[client][1] = true;
        }
    }
    new var22;
    if (g_VipHave[client][15] && GetTrieValue(g_CookieTrie[20], steamid, value)) {
        new var25 = value;
        if (g_OverlaysCount >= var25 & 0 < var25) {
            g_MyOverlayItem[client] = value;
            g_VipFeatureOn[client][15] = true;
        }
    }
    new var23;
    if (g_VipHave[client][16] && GetTrieValue(g_CookieTrie[6], steamid, value) && value > 0) {
        decl String:str_rgba[28];
        if (GetMenuItem(g_VipSkinColorsMenu, value, str_rgba, 25, 0, "", 0)) {
            decl String:buffer[16][12];
            ExplodeString(str_rgba, " ", buffer, 4, 9, false);
            new i = 0;
            while (i < 4) {
                g_MySkinColor[client][i] = StringToInt(buffer[i], 10);
                i++;
            }
            g_MySkinColorItem[client] = value;
            g_VipFeatureOn[client][16] = true;
        }
    }
    return 0;
}

wS_ClearVipVars(client)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    g_VipHave[client][0] = false;
    g_VipHave[client][1] = false;
    g_VipHave[client][2] = false;
    g_VipHave[client][3] = false;
    g_VipHave[client][4] = false;
    g_VipHave[client][5] = false;
    g_VipHave[client][6] = false;
    g_VipHave[client][7] = false;
    g_VipHave[client][8] = false;
    g_VipHave[client][9] = false;
    g_VipHave[client][10] = false;
    g_VipHave[client][11] = false;
    g_VipHave[client][12] = false;
    g_VipHave[client][13] = false;
    g_VipHave[client][14] = false;
    g_VipHave[client][15] = false;
    g_VipHave[client][16] = false;
    g_VipHave[client][17] = false;
    g_VipHave[client][18] = false;
    g_VipHave[client][19] = false;
    g_VipHave[client][21] = false;
    g_VipHave[client][23] = false;
    g_VipHave[client][24] = false;
    g_VipHave[client][25] = false;
    g_VipHave[client][26] = false;
    g_VipHave[client][27] = false;
    g_VipHave[client][28] = false;
    g_VipHave[client][29] = false;
    g_VipHave[client][30] = false;
    g_VipHave[client][20] = false;
    g_VipHave[client][22] = false;
    g_VipHave[client][31] = false;
    g_VipValue[client][0] = 0;
    g_VipValue[client][1] = 0;
    g_VipValue[client][2] = 0;
    g_VipValue[client][3] = 0;
    g_VipValue[client][4] = 0;
    g_VipValue[client][5] = 0;
    g_VipValue[client][6] = 0;
    g_VipValue[client][7] = 0;
    g_VipValue[client][8] = 0;
    g_VipValue[client][9] = 0;
    g_VipValue[client][10] = 0;
    g_VipValue[client][11] = 0;
    g_VipValue[client][12] = 0;
    g_VipValue[client][13] = 0;
    g_VipValue[client][14] = 0;
    g_VipFeatureOn[client][0] = false;
    g_VipFeatureOn[client][1] = false;
    g_VipFeatureOn[client][3] = false;
    g_VipFeatureOn[client][4] = false;
    g_VipFeatureOn[client][5] = false;
    g_VipFeatureOn[client][6] = false;
    g_VipFeatureOn[client][7] = false;
    g_VipFeatureOn[client][8] = false;
    g_VipFeatureOn[client][9] = false;
    g_VipFeatureOn[client][10] = false;
    g_VipFeatureOn[client][11] = false;
    g_VipFeatureOn[client][13] = false;
    g_VipFeatureOn[client][14] = false;
    g_VipFeatureOn[client][15] = false;
    g_VipFeatureOn[client][16] = false;
    g_VipFeatureOn[client][17] = false;
    g_VipFeatureOn[client][18] = false;
    g_VipFeatureOn[client][19] = false;
    g_VipFeatureOn[client][21] = false;
    g_VipFeatureOn[client][27] = false;
    g_VipFeatureOn[client][28] = false;
    g_VipFeatureOn[client][20] = false;
    g_VipFeatureOn[client][22] = false;
    g_VipFeatureOn[client][31] = true;
    g_VipFeatureOn[client][2] = true;
    g_VipFeatureOn[client][29] = true;
    g_VipFeatureOn[client][30] = true;
    g_VipFeatureOn[client][23] = true;
    g_VipFeatureOn[client][24] = true;
    g_VipFeatureOn[client][25] = true;
    g_VipFeatureOn[client][26] = true;
    g_VipFeatureOn[client][12] = true;
    g_MyRedSkinNum[client] = 0;
    g_MyBluSkinNum[client] = 0;
    g_MyOverlayItem[client] = 0;
    return 0;
}

/* ERROR! lysis.nodes.types.DReturn cannot be cast to lysis.nodes.types.DJumpCondition */
 function "wS_SetAccessFromVipGroup" (number 105)
wS_SetStandartClient(client)
{
    if (0 < g_Num) {
        new var8 = MaxClients;
        if (1 > var8 & 0 < var8) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (g_VipHave[client][17] && g_VipFeatureOn[client][17]) {
        SetEntityGravity(client, 1.0);
    }
    new var2;
    if (g_VipHave[client][16] && g_VipFeatureOn[client][16]) {
        wS_SetColor(client, 255, 255, 255, 255);
    }
    new var3;
    if (g_VipHave[client][15] && g_VipFeatureOn[client][15]) {
        wS_ClearOverlay(client);
    }
    wS_KillTimer(g_RehpTimer[client]);
    wS_ClearHandle(g_VipMenu[client]);
    wS_TrySetImmunAndAdminFlags(client, false);
    if (IsPlayerAlive(client)) {
        new var4;
        if (g_VipHave[client][20] && GetEntProp(client, PropType:0, "m_iHealth", 4, 0) > 100) {
            SetEntProp(client, PropType:0, "m_iHealth", any:100, 4, 0);
        }
        new var5;
        if (g_VipHave[client][18] && g_VipFeatureOn[client][18]) {
            SetEntPropFloat(client, PropType:1, "m_flLaggedMovementValue", 1.0, 0);
        }
        new team = GetClientTeam(client);
        new var6;
        if (team == 2 && g_VipHave[client][0] && g_VipFeatureOn[client][0]) {
            SetEntityModel(client, "models/player/t_phoenix.mdl");
        } else {
            new var7;
            if (team == 3 && g_VipHave[client][1] && g_VipFeatureOn[client][1]) {
                SetEntityModel(client, "models/player/ct_sas.mdl");
            }
        }
        wS_TryKillPlayerTrail(client);
    }
    wS_ClearVipVars(client);
    return 0;
}

bool:VIP_HaveTime(client)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new vip_timestamp = g_VipTime[client];
    if (vip_timestamp < 1) {
        return true;
    }
    new cur_timestamp = GetTime({0,0});
    if (vip_timestamp <= cur_timestamp) {
        VIP_Remove(client, g_SteamId[client], "auto", 0);
        return false;
    }
    wS_TryCreateVipDelTimer(g_SteamId[client], float(vip_timestamp - cur_timestamp));
    return true;
}

wS_TryCreateVipDelTimer(String:steamid[], Float:sec)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    decl Handle:timer;
    if (!GetTrieValue(g_VipDelTimerTrie, steamid, timer)) {
        new Handle:pack = 0;
        timer = CreateDataTimer(sec, g_VipDelTimerTrie_CallBack, pack, 0);
        WritePackString(pack, steamid);
        SetTrieValue(g_VipDelTimerTrie, steamid, timer, true);
    }
    return 0;
}

public Action:g_VipDelTimerTrie_CallBack(Handle:timer, Handle:pack)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    ResetPack(pack, false);
    decl String:steamid[28];
    ReadPackString(pack, steamid, 28);
    RemoveFromTrie(g_VipDelTimerTrie, steamid);
    VIP_Remove(0, steamid, "auto", 0);
    return Action:0;
}

wS_SQL_Connect()
{
    if (0 < g_Num) {
        new var3 = MaxClients;
        if (1 > var3 & 0 < var3) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    decl String:error[256];
    if (SQL_CheckConfig("wS_VIP")) {
        g_SQL = SQL_Connect("wS_VIP", true, error, 256);
        if (g_SQL) {
        } else {
            LogToFileEx(g_ErrorLogFile, "Could not connect to Mysql. The error text:");
            LogToFileEx(g_ErrorLogFile, error);
        }
    }
    new var1;
    if (g_SQL && var4) {
        LogToFileEx(g_ErrorLogFile, error);
        SetFailState("Error, unable to establish MYSQL and SQLite connection");
        return 0;
    }
    decl String:driver[16];
    SQL_ReadDriver(g_SQL, driver, 15);
    g_MYSQL = StrEqual(driver, "mysql", false);
    new var2;
    if (g_MYSQL) {
        var2[0] = 57116;
    } else {
        var2[0] = 57124;
    }
    LogMessage("The connection is successful! Type: %s", var2);
    if (g_MYSQL) {
        SQL_TQuery(g_SQL, SQL_Default_CallBack, "CREATE TABLE IF NOT EXISTS `wS_vip_tab` (`steamid` varchar(28) NOT NULL, `time` int(20) NOT NULL, `group` varchar(65) NOT NULL, PRIMARY KEY (`steamid`))", any:0, DBPriority:1);
    } else {
        SQL_TQuery(g_SQL, SQL_Default_CallBack, "CREATE TABLE IF NOT EXISTS `wS_vip_tab` (`steamid` TEXT NOT NULL, `time` INTEGER NOT NULL, `group` TEXT NOT NULL, PRIMARY KEY (`steamid`))", any:0, DBPriority:1);
    }
    return 0;
}

public SQL_Default_CallBack(Handle:owner, Handle:hndl, String:error[], any:data)
{
    if (!hndl) {
        LogToFileEx(g_ErrorLogFile, error);
    }
    return 0;
}

public Action:vip_add(admin, args)
{
    if (0 < g_Num) {
        new var3 = MaxClients;
        if (1 > var3 & 0 < var3) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (args != 3) {
        PrintToConsole(admin, "Syntax: vip_add \"steamid\" \"min (0 = forever)\" \"group\"");
        if (admin < 1) {
            LogToFileEx(g_ErrorLogFile, "Syntax: vip_add \"steamid\" \"min (0 = forever)\" \"group\"");
        }
        return Action:3;
    }
    decl String:vip_steamid[28];
    if (!wS_GetSteamIdFromArgNum(admin, vip_steamid, 1)) {
        return Action:3;
    }
    decl String:vip_group[68];
    GetCmdArg(3, vip_group, 65);
    if (!wS_VipGroupExist(vip_group)) {
        PrintToConsole(admin, "Group \"%s\" not exists", vip_group);
        if (admin < 1) {
            LogToFileEx(g_ErrorLogFile, "Group \"%s\" not exists", vip_group);
        }
        return Action:3;
    }
    decl String:str_min[16];
    GetCmdArg(2, str_min, 15);
    new int_value = strlen(str_min);
    new i = 0;
    while (i < int_value) {
        if (!IsCharNumeric(str_min[i])) {
            PrintToConsole(admin, "Bad value \"%s\"", str_min);
            if (admin < 1) {
                LogToFileEx(g_ErrorLogFile, "Bad value \"%s\"", str_min);
            }
            return Action:3;
        }
        i++;
    }
    new var4 = StringToInt(str_min, 10);
    int_value = var4;
    if (var4 < 1) {
        int_value = 0;
    } else {
        int_value = GetTime({0,0}) + int_value * 60;
    }
    new Handle:pack = CreateDataPack();
    new var1;
    if (admin > 0) {
        var1 = GetClientUserId(admin);
    } else {
        var1 = 0;
    }
    WritePackCell(pack, var1);
    WritePackString(pack, vip_steamid);
    WritePackString(pack, vip_group);
    WritePackCell(pack, int_value);
    decl String:str_query[200];
    new var2;
    if (g_MYSQL) {
        var2[0] = 57676;
    } else {
        var2[0] = 57684;
    }
    Format(str_query, 200, "INSERT %s INTO `wS_vip_tab` VALUES ('%s', %d, '%s')", var2, vip_steamid, int_value, vip_group);
    SQL_TQuery(g_SQL, vip_add_CallBack, str_query, pack, DBPriority:1);
    return Action:3;
}

public vip_add_CallBack(Handle:sql, Handle:result, String:error[], any:pack)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    ResetPack(pack, false);
    new admin = ReadPackCell(pack);
    if (0 < admin) {
        admin = GetClientOfUserId(admin);
    }
    if (result) {
        decl String:vip_steamid[28];
        ReadPackString(pack, vip_steamid, 28);
        if (SQL_GetAffectedRows(result) < 1) {
            CloseHandle(pack);
            PrintToConsole(admin, "%s already exists in database", vip_steamid);
            if (admin < 1) {
                LogToFileEx(g_ErrorLogFile, "%s already exists in database", vip_steamid);
            }
            return 0;
        }
        decl String:vip_group[68];
        ReadPackString(pack, vip_group, 65);
        new vip_timestamp = ReadPackCell(pack);
        CloseHandle(pack);
        if (0 < vip_timestamp) {
            new sec = vip_timestamp - GetTime({0,0});
            if (sec < 1) {
                VIP_Remove(0, vip_steamid, "auto", 0);
                return 0;
            }
            wS_TryCreateVipDelTimer(vip_steamid, float(sec));
        }
        decl String:info[48];
        if (0 < vip_timestamp) {
            FormatTime(info, 45, "%d/%m/%Y - %H:%M", vip_timestamp);
        } else {
            strcopy(info, 45, "forever");
        }
        PrintToConsole(admin, "VIP \"%s\" successfully added to the group \"%s\" (access: %s)", vip_steamid, vip_group, info);
        new vip_client = wS_GetClientBySteamId(vip_steamid);
        if (0 < vip_client) {
            g_VipTime[vip_client] = vip_timestamp;
            g_VipAccess[vip_client] = 1;
            strcopy(g_MyVipGroup[vip_client], 65, vip_group);
            wS_SetAccessFromVipGroup(vip_client, vip_group, false);
            info[0] = MissingTAG:0;
            GetClientName(vip_client, info, 45);
            PrintToChatAll("\x04%t", "vip_added_msg", info);
        }
        Call_StartForward(g_Event_VIP_Added);
        Call_PushCell(vip_client);
        Call_PushString(vip_steamid);
        Call_PushString(vip_group);
        Call_PushCell(vip_timestamp);
        Call_PushCell(admin);
        Call_Finish(0);
        return 0;
    }
    CloseHandle(pack);
    PrintToConsole(admin, error);
    LogToFileEx(g_ErrorLogFile, error);
    return 0;
}

public Action:vip_del(admin, args)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (args != 1) {
        PrintToConsole(admin, "Syntax: vip_del \"steamid\"");
        return Action:3;
    }
    decl String:steamid[28];
    if (wS_GetSteamIdFromArgNum(admin, steamid, 1)) {
        if (0 < admin) {
            decl String:by[76];
            Format(by, 75, "admin: %N, %s", admin, g_SteamId[admin]);
            VIP_Remove(0, steamid, by, GetClientUserId(admin));
        }
        VIP_Remove(0, steamid, "rcon", 0);
    }
    return Action:3;
}

public Action:vip_add_time(admin, args)
{
    if (0 < g_Num) {
        new var4 = MaxClients;
        if (1 > var4 & 0 < var4) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    decl String:command[20];
    GetCmdArg(0, command, 20);
    if (args != 2) {
        PrintToConsole(admin, "Syntax: %s \"steamid\" \"min\"", command);
        return Action:3;
    }
    new bool:need_add_time = strcmp(command, "vip_add_time", false) == 0;
    decl String:str_min[16];
    GetCmdArg(2, str_min, 15);
    new min = StringToInt(str_min, 10);
    new var1;
    if (min < 1 && need_add_time) {
        PrintToConsole(admin, "The minimum number of minutes: 1");
        return Action:3;
    }
    decl String:vip_steamid[28];
    if (wS_GetSteamIdFromArgNum(admin, vip_steamid, 1)) {
        new Handle:pack = CreateDataPack();
        new var2;
        if (admin > 0) {
            var2 = GetClientUserId(admin);
        } else {
            var2 = 0;
        }
        WritePackCell(pack, var2);
        WritePackString(pack, vip_steamid);
        WritePackCell(pack, min * 60);
        new var3;
        if (need_add_time) {
            var3 = 1;
        } else {
            var3 = 0;
        }
        WritePackCell(pack, var3);
        decl String:str_query[128];
        Format(str_query, 125, "SELECT `time` FROM `wS_vip_tab` WHERE `steamid` = '%s' LIMIT 1", vip_steamid);
        SQL_TQuery(g_SQL, vip_add_time_CallBack, str_query, pack, DBPriority:1);
    }
    return Action:3;
}

public vip_add_time_CallBack(Handle:sql, Handle:result, String:error[], any:pack)
{
    if (0 < g_Num) {
        new var4 = MaxClients;
        if (1 > var4 & 0 < var4) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    ResetPack(pack, false);
    new admin = ReadPackCell(pack);
    if (0 < admin) {
        admin = GetClientOfUserId(admin);
    }
    if (result) {
        decl String:vip_steamid[28];
        ReadPackString(pack, vip_steamid, 28);
        if (!SQL_FetchRow(result)) {
            CloseHandle(pack);
            PrintToConsole(admin, "VIP '%s' not exists", vip_steamid);
            if (admin < 1) {
                LogToFileEx(g_ErrorLogFile, "VIP '%s' not exists", vip_steamid);
            }
            return 0;
        }
        new new_vip_timestamp = SQL_FetchInt(result, 0, 0);
        new sec = ReadPackCell(pack);
        new bool:need_add_time = ReadPackCell(pack) == 1;
        CloseHandle(pack);
        new var1;
        if (new_vip_timestamp < 1 && need_add_time) {
            PrintToConsole(admin, "VIP '%s' имеет постоянный доступ (vip_add_time)", vip_steamid);
            if (admin < 1) {
                LogToFileEx(g_ErrorLogFile, "VIP '%s' имеет постоянный доступ (vip_add_time)", vip_steamid);
            }
            return 0;
        }
        new old_vip_timestamp = new_vip_timestamp;
        new current_timestamp = GetTime({0,0});
        if (new_vip_timestamp < current_timestamp) {
            new_vip_timestamp = current_timestamp;
        }
        if (need_add_time) {
            new_vip_timestamp = sec + new_vip_timestamp;
        } else {
            if (0 < sec) {
                new_vip_timestamp = sec + current_timestamp;
            }
            new_vip_timestamp = 0;
        }
        decl String:info[152];
        if (0 < new_vip_timestamp) {
            FormatTime(info, 150, "%d/%m/%Y - %H:%M", new_vip_timestamp);
        } else {
            strcopy(info, 150, "forever");
        }
        PrintToConsole(admin, "VIP time for \"%s\" successfully changed (%s)", vip_steamid, info);
        new var2;
        if (g_MYSQL) {
            var2[0] = 58400;
        } else {
            var2[0] = 58408;
        }
        Format(info, 150, "UPDATE %s `wS_vip_tab` SET `time` = %d WHERE `steamid` = '%s'", var2, new_vip_timestamp, vip_steamid);
        SQL_TQuery(g_SQL, SQL_Default_CallBack, info, any:0, DBPriority:1);
        decl Handle:timer;
        if (GetTrieValue(g_VipDelTimerTrie, vip_steamid, timer)) {
            KillTimer(timer, false);
            RemoveFromTrie(g_VipDelTimerTrie, vip_steamid);
        }
        if (0 < new_vip_timestamp) {
            sec = new_vip_timestamp - current_timestamp;
            if (sec < 1) {
                VIP_Remove(0, vip_steamid, "auto", 0);
                return 0;
            }
            new Handle:pack2 = 0;
            timer = CreateDataTimer(float(sec), g_VipDelTimerTrie_CallBack, pack2, 0);
            WritePackString(pack2, vip_steamid);
            SetTrieValue(g_VipDelTimerTrie, vip_steamid, timer, true);
        }
        new vip_client = wS_GetClientBySteamId(vip_steamid);
        new var3;
        if (vip_client > 0 && g_VipAccess[vip_client]) {
            g_VipTime[vip_client] = new_vip_timestamp;
            if (wS_Update_g_VipMenuTitle(vip_client, false)) {
                DisplayMenu(g_VipMenu[vip_client], vip_client, 0);
            }
            PrintToChat(vip_client, "\x04%t", "your_vip_time_changed");
        } else {
            vip_client = 0;
        }
        Call_StartForward(g_Event_VIP_TimeChanged);
        Call_PushCell(vip_client);
        Call_PushString(vip_steamid);
        Call_PushCell(old_vip_timestamp);
        Call_PushCell(new_vip_timestamp);
        Call_Finish(0);
        return 0;
    }
    CloseHandle(pack);
    LogToFileEx(g_ErrorLogFile, error);
    PrintToConsole(admin, error);
    return 0;
}

public Action:vip_groups_rename(client, args)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (args != 2) {
        PrintToConsole(client, "Syntax: vip_groups_rename \"bad group name\" \"good group name\"");
        return Action:3;
    }
    decl String:bad_group[68];
    GetCmdArg(1, bad_group, 65);
    if (wS_VipGroupExist(bad_group)) {
        PrintToConsole(client, "You can not change the name of an existing group");
        return Action:3;
    }
    decl String:new_group[68];
    GetCmdArg(2, new_group, 65);
    if (!wS_VipGroupExist(new_group)) {
        PrintToConsole(client, "Group \"%s\" not exist", new_group);
        return Action:3;
    }
    new Handle:pack = CreateDataPack();
    WritePackCell(pack, client);
    WritePackString(pack, bad_group);
    WritePackString(pack, new_group);
    decl String:str_query[200];
    new var1;
    if (g_MYSQL) {
        var1[0] = 58656;
    } else {
        var1[0] = 58664;
    }
    Format(str_query, 200, "UPDATE %s `wS_vip_tab` SET `group` = '%s' WHERE `group` = '%s'", var1, new_group, bad_group);
    SQL_TQuery(g_SQL, vip_groups_rename_CallBack, str_query, pack, DBPriority:1);
    return Action:3;
}

public vip_groups_rename_CallBack(Handle:owner, Handle:query, String:error[], any:pack)
{
    if (0 < g_Num) {
        new var4 = MaxClients;
        if (1 > var4 & 0 < var4) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    ResetPack(pack, false);
    new admin = ReadPackCell(pack);
    new var1;
    if (admin > 0 && IsClientInGame(admin)) {
        var2 = admin;
    } else {
        var2 = 0;
    }
    admin = var2;
    if (query) {
        new strok = SQL_GetAffectedRows(query);
        PrintToConsole(admin, "Renamed groups: %d", strok);
        LogMessage("Renamed groups: %d (vip_groups_rename)", strok);
        if (strok < 1) {
            return 0;
        }
        decl String:bad_group[68];
        decl String:new_group[68];
        ReadPackString(pack, bad_group, 65);
        ReadPackString(pack, new_group, 65);
        CloseHandle(pack);
        new i = 1;
        while (i <= MaxClients) {
            new var3;
            if (g_VipAccess[i] && !g_MyVipGroupExists[i] && IsClientInGame(i) && strcmp(g_MyVipGroup[i], bad_group, true)) {
                strcopy(g_MyVipGroup[i], 65, new_group);
                wS_SetAccessFromVipGroup(i, new_group, false);
                PrintToChat(i, "\x04%t", "your_group_changed");
                i++;
            }
            i++;
        }
        return 0;
    }
    PrintToConsole(admin, error);
    LogToFileEx(g_ErrorLogFile, error);
    return 0;
}

public Action:vip_info(client, args)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (args != 1) {
        PrintToConsole(client, "Syntax: vip_info \"steamid\"");
        return Action:3;
    }
    decl String:steamid[28];
    if (wS_GetSteamIdFromArgNum(client, steamid, 1)) {
        decl String:str_query[108];
        Format(str_query, 105, "SELECT `group`, `time` FROM `wS_vip_tab` WHERE `steamid` = '%s' LIMIT 1", steamid);
        SQL_TQuery(g_SQL, vip_info_CallBack, str_query, client, DBPriority:1);
    }
    return Action:3;
}

public vip_info_CallBack(Handle:owner, Handle:query, String:error[], any:client)
{
    if (0 < g_Num) {
        new var4 = MaxClients;
        if (1 > var4 & 0 < var4) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    decl admin;
    new var1;
    if (client > any:0 && IsClientInGame(client)) {
        var2 = client;
    } else {
        var2 = 0;
    }
    admin = var2;
    if (query) {
        if (!SQL_FetchRow(query)) {
            PrintToConsole(admin, "VIP not exists");
            return 0;
        }
        decl String:vip_group[68];
        decl String:access_info[76];
        SQL_FetchString(query, 0, vip_group, 65, 0);
        new vip_time = SQL_FetchInt(query, 1, 0);
        if (0 < vip_time) {
            FormatTime(access_info, 75, "%d/%m/%Y - %H:%M", vip_time);
            new var3;
            if (vip_time <= GetTime({0,0})) {
                var3[0] = 58916;
            } else {
                var3[0] = 58928;
            }
            Format(access_info, 75, "%s (%s)", var3, access_info);
        } else {
            strcopy(access_info, 75, "unlimited");
        }
        PrintToConsole(admin, "group: \"%s\"\naccess: \"%s\"\n", vip_group, access_info);
        return 0;
    }
    LogToFileEx(g_ErrorLogFile, error);
    PrintToConsole(admin, error);
    return 0;
}

public Action:vip_list(client, args)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (args < 1) {
        SQL_TQuery(g_SQL, vip_list_CallBack, "SELECT `steamid`, `group`, `time` FROM `wS_vip_tab`", client, DBPriority:1);
    }
    return Action:3;
}

public vip_list_CallBack(Handle:owner, Handle:query, String:error[], any:client)
{
    if (0 < g_Num) {
        new var4 = MaxClients;
        if (1 > var4 & 0 < var4) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    decl admin;
    new var1;
    if (client > any:0 && IsClientInGame(client)) {
        var2 = client;
    } else {
        var2 = 0;
    }
    admin = var2;
    if (query) {
        new strok = SQL_GetRowCount(query);
        if (strok < 1) {
            PrintToConsole(admin, "Number of VIP players: 0");
            return 0;
        }
        PrintToConsole(admin, "Number of VIP players: %d\n \n", strok);
        decl String:vip_steamid[28];
        decl String:vip_group[68];
        decl String:access_info[76];
        decl vip_time;
        new GetTime_value = GetTime({0,0});
        while (SQL_FetchRow(query)) {
            vip_time = SQL_FetchInt(query, 2, 0);
            if (vip_time < 1) {
                strcopy(access_info, 75, "unlimited");
            } else {
                FormatTime(access_info, 75, "%d/%m/%Y - %H:%M", vip_time);
                new var3;
                if (vip_time <= GetTime_value) {
                    var3[0] = 59132;
                } else {
                    var3[0] = 59144;
                }
                Format(access_info, 75, "%s (%s)", var3, access_info);
            }
            SQL_FetchString(query, 0, vip_steamid, 28, 0);
            SQL_FetchString(query, 1, vip_group, 65, 0);
            PrintToConsole(admin, "%s\ngroup: %s\naccess: %s\n \n", vip_steamid, vip_group, access_info);
        }
        return 0;
    }
    PrintToConsole(admin, error);
    LogToFileEx(g_ErrorLogFile, error);
    return 0;
}

public Action:vip_past_remove(client, args)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (args < 1) {
        new GetTime_Value = GetTime({0,0});
        decl String:str_query[96];
        Format(str_query, 95, "DELETE FROM `wS_vip_tab` WHERE `time` > 0 AND `time` < %d", GetTime_Value);
        SQL_TQuery(g_SQL, vip_past_remove_CallBack, str_query, client, DBPriority:1);
    }
    return Action:3;
}

public vip_past_remove_CallBack(Handle:owner, Handle:query, String:error[], any:client)
{
    if (0 < g_Num) {
        new var3 = MaxClients;
        if (1 > var3 & 0 < var3) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    decl admin;
    new var1;
    if (client > any:0 && IsClientInGame(client)) {
        var2 = client;
    } else {
        var2 = 0;
    }
    admin = var2;
    if (query) {
        new strok = SQL_GetAffectedRows(query);
        PrintToConsole(admin, "Removed VIP players: %d", strok);
        LogMessage("Removed VIP players: %d (vip_past_remove)", strok);
        return 0;
    }
    PrintToConsole(admin, error);
    LogToFileEx(g_ErrorLogFile, error);
    return 0;
}

public Action:vip_set_group(client, args)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (args != 2) {
        PrintToConsole(client, "Syntax: vip_set_group \"steamid\" \"new group\"");
        return Action:3;
    }
    decl String:new_group[68];
    GetCmdArg(2, new_group, 65);
    if (!wS_VipGroupExist(new_group)) {
        PrintToConsole(client, "Group \"%s\" not exists", new_group);
        return Action:3;
    }
    decl String:steamid[28];
    if (!wS_GetSteamIdFromArgNum(client, steamid, 1)) {
        return Action:3;
    }
    new Handle:pack = CreateDataPack();
    WritePackCell(pack, client);
    WritePackString(pack, steamid);
    WritePackString(pack, new_group);
    decl String:str_query[152];
    new var1;
    if (g_MYSQL) {
        var1[0] = 59472;
    } else {
        var1[0] = 59480;
    }
    Format(str_query, 150, "UPDATE %s `wS_vip_tab` SET `group` = '%s' WHERE `steamid` = '%s' AND `group` != '%s'", var1, new_group, steamid, new_group);
    SQL_TQuery(g_SQL, vip_set_group_CallBack, str_query, pack, DBPriority:1);
    return Action:3;
}

public vip_set_group_CallBack(Handle:owner, Handle:query, String:error[], any:pack)
{
    if (0 < g_Num) {
        new var4 = MaxClients;
        if (1 > var4 & 0 < var4) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    ResetPack(pack, false);
    new admin = ReadPackCell(pack);
    new var1;
    if (admin > 0 && IsClientInGame(admin)) {
        var2 = admin;
    } else {
        var2 = 0;
    }
    admin = var2;
    if (query) {
        if (SQL_GetAffectedRows(query) < 1) {
            CloseHandle(pack);
            PrintToConsole(admin, "Or a player not in the database, or he is already in this group");
            return 0;
        }
        decl String:steamid[28];
        decl String:new_group[68];
        ReadPackString(pack, steamid, 28);
        ReadPackString(pack, new_group, 65);
        CloseHandle(pack);
        PrintToConsole(admin, "VIP \"%s\" successfully moved to the group \"%s\"", steamid, new_group);
        LogMessage("VIP \"%s\" successfully moved to the group \"%s\"", steamid, new_group);
        new vip_client = wS_GetClientBySteamId(steamid);
        new var3;
        if (vip_client > 0 && g_VipAccess[vip_client]) {
            wS_SetStandartClient(vip_client);
            strcopy(g_MyVipGroup[vip_client], 65, new_group);
            wS_SetAccessFromVipGroup(vip_client, new_group, false);
            PrintToChat(vip_client, "\x04%t", "your_group_changed");
        }
        return 0;
    }
    CloseHandle(pack);
    PrintToConsole(admin, error);
    LogToFileEx(g_ErrorLogFile, error);
    return 0;
}

wS_CheckVipAccess(client)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    decl String:str_query[128];
    Format(str_query, 125, "SELECT `time`, `group` FROM `wS_vip_tab` WHERE `steamid` = '%s' LIMIT 1", g_SteamId[client]);
    SQL_TQuery(g_SQL, wS_CheckVipAccess_CallBack, str_query, GetClientUserId(client), DBPriority:1);
    return 0;
}

public wS_CheckVipAccess_CallBack(Handle:sql, Handle:result, String:error[], any:userid)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (result) {
        new client = GetClientOfUserId(userid);
        new var1;
        if (client < 1 || !SQL_FetchRow(result)) {
            return 0;
        }
        g_VipTime[client] = SQL_FetchInt(result, 0, 0);
        if (VIP_HaveTime(client)) {
            SQL_FetchString(result, 1, g_MyVipGroup[client], 65, 0);
            g_VipAccess[client] = 1;
            wS_SetAccessFromVipGroup(client, g_MyVipGroup[client], true);
        }
        return 0;
    }
    LogToFileEx(g_ErrorLogFile, error);
    return 0;
}

VIP_Remove(vip_client, String:vip_steamid[], String:by[], admin_id)
{
    if (0 < g_Num) {
        new var4 = MaxClients;
        if (1 > var4 & 0 < var4) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    decl Handle:timer;
    if (GetTrieValue(g_VipDelTimerTrie, vip_steamid, timer)) {
        KillTimer(timer, false);
        RemoveFromTrie(g_VipDelTimerTrie, vip_steamid);
    }
    decl target;
    new var5 = vip_client;
    new var1;
    if (MaxClients >= var5 & 0 < var5) {
        var1 = vip_client;
    } else {
        var1 = wS_GetClientBySteamId(vip_steamid);
    }
    target = var1;
    decl vip_id;
    new var2;
    if (target > 0) {
        var2 = GetClientUserId(target);
    } else {
        var2 = 0;
    }
    vip_id = var2;
    new Handle:pack = CreateDataPack();
    WritePackCell(pack, admin_id);
    WritePackCell(pack, vip_id);
    WritePackString(pack, vip_steamid);
    WritePackString(pack, by);
    decl String:str_query[96];
    Format(str_query, 95, "DELETE FROM `wS_vip_tab` WHERE `steamid` = '%s'", vip_steamid);
    SQL_TQuery(g_SQL, VIP_Remove_CallBack, str_query, pack, DBPriority:1);
    new var3;
    if (target > 0 && g_VipAccess[target]) {
        wS_SetStandartClient(target);
        g_VipAccess[target] = 0;
        g_MyVipGroupExists[target] = 0;
        g_MyVipGroup[target][0] = MissingTAG:0;
        decl String:panel_text[500];
        if (0 < admin_id) {
            Format(panel_text, 500, "%T\n \n", 59820, target, by);
        } else {
            if (strcmp(by, "auto", true)) {
                Format(panel_text, 500, "%T\n \n", 59888, target);
            }
            Format(panel_text, 500, "%T\n \n", 59856, target);
        }
        wS_ShowClientMsgInPanel(target, panel_text, true);
        decl String:nick[32];
        nick[0] = MissingTAG:0;
        GetClientName(target, nick, 32);
        PrintToChatAll("\x04%t", "vip_deleted_msg", nick);
    }
    return 0;
}

public VIP_Remove_CallBack(Handle:sql, Handle:result, String:error[], any:pack)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    ResetPack(pack, false);
    new admin = ReadPackCell(pack);
    if (0 < admin) {
        admin = GetClientOfUserId(admin);
    }
    if (result) {
        if (0 < SQL_GetAffectedRows(result)) {
            new vip = ReadPackCell(pack);
            if (0 < vip) {
                vip = GetClientOfUserId(vip);
            }
            decl String:vip_steamid[28];
            decl String:by[76];
            ReadPackString(pack, vip_steamid, 28);
            ReadPackString(pack, by, 75);
            CloseHandle(pack);
            PrintToConsole(admin, "VIP \"%s\" successfully deleted", vip_steamid);
            LogToFile("cfg/vip/history.txt", "\nVIP \"%s\" deleted (%s)\n", vip_steamid, by);
            Call_StartForward(g_Event_VIP_Removed);
            Call_PushCell(vip);
            Call_PushString(vip_steamid);
            Call_PushCell(admin);
            Call_PushString(by);
            Call_Finish(0);
            return 0;
        }
        CloseHandle(pack);
        PrintToConsole(admin, "VIP not found");
        return 0;
    }
    CloseHandle(pack);
    PrintToConsole(admin, error);
    LogToFileEx(g_ErrorLogFile, error);
    return 0;
}

public player_spawn(Handle:event, String:name[], bool:silent)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (0 < g_VipGroups_Count) {
        new client = GetClientOfUserId(GetEventInt(event, "userid"));
        new var1;
        if (g_VipAccess[client] && g_MyVipGroupExists[client]) {
            wS_TryKillPlayerTrail(client);
            wS_SetVipFeaturesForAliveVip(client);
        }
    }
    return 0;
}

wS_SetVipFeaturesForAliveVip(client)
{
    if (0 < g_Num) {
        new var8 = MaxClients;
        if (1 > var8 & 0 < var8) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new team = GetClientTeam(client);
    if (team < 2) {
        return 0;
    }
    if (team == 2) {
        wS_SetVipSkin(client, g_VipHave[client][0], g_MyRedSkinNum[client], g_RedVipSkinsMenu);
    } else {
        wS_SetVipSkin(client, g_VipHave[client][1], g_MyBluSkinNum[client], g_BluVipSkinsMenu);
    }
    new var1;
    if (g_VipHave[client][20] && g_VipFeatureOn[client][20]) {
        SetEntProp(client, PropType:0, "m_iHealth", g_VipValue[client][3], 4, 0);
    }
    new var2;
    if (g_VipHave[client][17] && g_VipFeatureOn[client][17]) {
        SetEntityGravity(client, g_VipValue[client][0]);
    }
    new var3;
    if (g_VipHave[client][19] && g_VipFeatureOn[client][19] && GetEntProp(client, PropType:0, "m_iAccount", 4, 0) < g_VipValue[client][2]) {
        SetEntProp(client, PropType:0, "m_iAccount", g_VipValue[client][2], 4, 0);
    }
    new var4;
    if (g_VipHave[client][18] && g_VipFeatureOn[client][18]) {
        SetEntPropFloat(client, PropType:1, "m_flLaggedMovementValue", g_VipValue[client][1], 0);
    }
    new var5;
    if (g_VipHave[client][16] && g_VipFeatureOn[client][16]) {
        wS_SetColor(client, g_MySkinColor[client][0], g_MySkinColor[client][1], g_MySkinColor[client][2], g_MySkinColor[client][3]);
    }
    new var6;
    if (g_VipHave[client][21] && g_VipFeatureOn[client][21]) {
        SetEntProp(client, PropType:0, "m_ArmorValue", g_VipValue[client][4], 1, 0);
    }
    new var7;
    if (g_VipHave[client][15] && g_VipFeatureOn[client][15]) {
        wS_TrySetOverlay(client, g_MyOverlayItem[client]);
    }
    CreateTimer(0.5, VipSpawn2_Timer, client, 2);
    return 0;
}

public Action:VipSpawn2_Timer(Handle:timer, any:client)
{
    if (0 < g_Num) {
        new var4 = MaxClients;
        if (1 > var4 & 0 < var4) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (IsClientInGame(client) && g_VipAccess[client] && g_MyVipGroupExists[client] && IsPlayerAlive(client)) {
        new var2;
        if (g_VipHave[client][11] && g_VipFeatureOn[client][11] && g_Trails_Menu) {
            wS_CreateVipTrail(client, true);
        }
        new var3;
        if (g_MapType_de && GetClientTeam(client) == 2 && g_VipHave[client][13] && g_VipFeatureOn[client][13]) {
            if (GetPlayerWeaponSlot(client, 4) < 1) {
                GivePlayerItem(client, "weapon_c4", 0);
            }
        }
    }
    return Action:0;
}

public Action:jointeam(client, String:command[], args)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (client > 0 && args > 0 && g_VipAccess[client] && g_VipHave[client][12]) {
        decl String:str_team[8];
        GetCmdArg(1, str_team, 5);
        new team = StringToInt(str_team, 10);
        new var3 = team;
        if (4 > var3 & 0 < var3) {
            ChangeClientTeam(client, team);
            return Action:3;
        }
    }
    return Action:0;
}

public player_blind(Handle:event, String:name[], bool:silent)
{
    if (0 < g_Num) {
        new var3 = MaxClients;
        if (1 > var3 & 0 < var3) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (g_FlashDuration_Offs == -1 || g_FlashAlpha_Offs == -1) {
        return 0;
    }
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    new var2;
    if (g_VipAccess[client] && g_VipHave[client][9] && g_VipFeatureOn[client][9]) {
        SetEntDataFloat(client, g_FlashAlpha_Offs, 0.0, false);
        SetEntDataFloat(client, g_FlashDuration_Offs, 0.0, false);
    }
    return 0;
}

public Action:say(client, String:command[], args)
{
    if (0 < g_Num) {
        new var3 = MaxClients;
        if (1 > var3 & 0 < var3) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var1;
    if (g_VipAccess[client] && client > 0 && args > 0 && g_VipHave[client][8] && g_VipFeatureOn[client][8]) {
        decl String:text[256];
        decl x;
        GetCmdArgString(text, 256);
        StripQuotes(text);
        new var2;
        if (g_ChatCommandsTrie && GetTrieValue(g_ChatCommandsTrie, text, x)) {
            return Action:0;
        }
        Format(text, 256, "\x03[ VIP ] %N: %s", client, text);
        wS_TeamColorMsg(client, text, 0);
        return Action:3;
    }
    return Action:0;
}

public bomb_begindefuse(Handle:event, String:name[], bool:silent)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    new var1;
    if (g_VipAccess[client] && g_VipHave[client][10] && g_VipFeatureOn[client][10]) {
        new c4_index = FindEntityByClassname(-1, "planted_c4");
        if (0 < c4_index) {
            CreateTimer(0.5, wS_DefuseC4_Timer, c4_index, 2);
        }
    }
    return 0;
}

public Action:wS_DefuseC4_Timer(Handle:timer, any:c4_index)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (IsValidEntity(c4_index)) {
        SetEntPropFloat(c4_index, PropType:0, "m_flDefuseCountDown", 1.0, 0);
    }
    return Action:0;
}

public player_death(Handle:event, String:name[], bool:silent)
{
    if (0 < g_Num) {
        new var4 = MaxClients;
        if (1 > var4 & 0 < var4) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    new killer = GetClientOfUserId(GetEventInt(event, "attacker"));
    wS_TrySetOverlayPause(client);
    wS_TryKillPlayerTrail(client);
    new var1;
    if (killer > 0 && g_VipAccess[killer] && client != killer && GetClientTeam(client) != GetClientTeam(killer)) {
        new var2;
        if (g_VipHave[killer][27] && g_VipFeatureOn[killer][27] && IsPlayerAlive(killer)) {
            SetEntProp(killer, PropType:1, "m_iHealth", g_VipValue[killer][10][GetEntProp(killer, PropType:1, "m_iHealth", 4, 0)], 4, 0);
        }
        new var3;
        if (g_VipHave[killer][3] && g_VipFeatureOn[killer][3]) {
            wS_CreateBarrel(client);
        }
    }
    return 0;
}

public player_team(Handle:event, String:name[], bool:silent)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    wS_TryKillPlayerTrail(client);
    new var1;
    if (GetEventInt(event, "team") < 2 && !GetEventBool(event, "disconnect")) {
        wS_TrySetOverlayPause(client);
    }
    return 0;
}

public hegrenade_detonate(Handle:event, String:name[], bool:silent)
{
    wS_GrenEvent(event, g_HeColor);
    return 0;
}

public smokegrenade_detonate(Handle:event, String:name[], bool:silent)
{
    wS_GrenEvent(event, g_SgColor);
    return 0;
}

public flashbang_detonate(Handle:event, String:name[], bool:silent)
{
    wS_GrenEvent(event, g_FbColor);
    return 0;
}

wS_GrenEvent(Handle:event, color[4])
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    new var1;
    if (client > 0 && g_VipAccess[client] && g_VipHave[client][7] && g_VipFeatureOn[client][7]) {
        decl Float:center[3];
        center[0] = GetEventFloat(event, "x");
        center[1] = GetEventFloat(event, "y");
        center[2] = GetEventFloat(event, "z");
        TE_SetupBeamRingPoint(center, 10.0, 1000.0, g_LaserIndex, g_LaserIndex, 0, 0, 0.8, 10.0, 50.0, color, 20, 0);
        TE_SendToAll(0.0);
    }
    return 0;
}

public round_start(Handle:event, String:name[], bool:silent)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    g_Dissolver = CreateEntityByName("env_entity_dissolver", -1);
    new i = 1;
    while (i <= MaxClients) {
        new var1;
        if (g_VipAccess[i] && g_MyVipGroupExists[i] && IsClientInGame(i)) {
            wS_AgainGetVipValuesFromTrie(i, g_MyVipGroup[i]);
            i++;
        }
        i++;
    }
    return 0;
}

wS_AgainGetVipValuesFromTrie(client, String:vip_group[])
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (g_VipHave[client][29]) {
        GetTrieValue(g_VipGroupTrie_respawn, vip_group, g_VipValue[client][12]);
        g_VipFeatureOn[client][29] = true;
    }
    if (g_VipHave[client][23]) {
        GetTrieValue(g_VipGroupTrie_he, vip_group, g_VipValue[client][6]);
        g_VipFeatureOn[client][23] = true;
    }
    if (g_VipHave[client][24]) {
        GetTrieValue(g_VipGroupTrie_sg, vip_group, g_VipValue[client][7]);
        g_VipFeatureOn[client][24] = true;
    }
    if (g_VipHave[client][25]) {
        GetTrieValue(g_VipGroupTrie_fb, vip_group, g_VipValue[client][8]);
        g_VipFeatureOn[client][25] = true;
    }
    if (g_VipHave[client][26]) {
        GetTrieValue(g_VipGroupTrie_laser, vip_group, g_VipValue[client][9]);
        g_VipFeatureOn[client][26] = true;
    }
    if (g_VipHave[client][30]) {
        GetTrieValue(g_VipGroupTrie_tele, vip_group, g_VipValue[client][13]);
        g_VipFeatureOn[client][30] = true;
    }
    wS_Create_g_VipMenu_ForVipClient(client, false, false, false);
    return 0;
}

public player_hurt(Handle:event, String:name[], bool:silent)
{
    if (0 < g_Num) {
        new var4 = MaxClients;
        if (1 > var4 & 0 < var4) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    g_Hurt_Attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
    g_Hurt_Victim = GetClientOfUserId(GetEventInt(event, "userid"));
    if (0 < GetEventInt(event, "health")) {
        wS_TryRegen(g_Hurt_Victim);
    }
    new var1;
    if (g_Hurt_Attacker > 0 && g_VipAccess[g_Hurt_Attacker] && /* NULL */ != /* NULL */) {
        new att_team = GetClientTeam(g_Hurt_Attacker);
        if (GetClientTeam(g_Hurt_Victim) != att_team) {
            new var2;
            if (g_VipHave[g_Hurt_Attacker][14] && g_VipFeatureOn[g_Hurt_Attacker][14]) {
                SetVariantString("WaterSurfaceExplosion");
                AcceptEntityInput(g_Hurt_Victim, "DispatchEffect", -1, -1, 0);
            }
            new var3;
            if (g_VipHave[g_Hurt_Attacker][4] && g_VipFeatureOn[g_Hurt_Attacker][4]) {
                wS_CreateBeam(g_Hurt_Attacker, g_Hurt_Victim, att_team);
            }
        }
    }
    return 0;
}

public weapon_fire_on_empty(Handle:event, String:name[], bool:silent)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    new var1;
    if (g_VipAccess[client] && g_VipHave[client][5]) {
        new index = GetEntPropEnt(client, PropType:0, "m_hActiveWeapon", 0);
        if (index > client) {
            RemovePlayerItem(client, index);
            decl String:weapon[32];
            GetEventString(event, "weapon", weapon, 32);
            Format(weapon, 32, "weapon_%s", weapon);
            GivePlayerItem(client, weapon, 0);
        }
    }
    return 0;
}

public hostage_follows(Handle:event, String:name[], bool:silent)
{
    if (0 < g_Num) {
        new var3 = MaxClients;
        if (1 > var3 & 0 < var3) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new x = GetClientOfUserId(GetEventInt(event, "userid"));
    new var1;
    if (g_VipAccess[x] && g_VipHave[x][6] && g_VipFeatureOn[x][6]) {
        new var4 = GetEventInt(event, "hostage");
        x = var4;
        new var2;
        if (var4 > 0 && IsValidEntity(x)) {
            wS_TryRescueHostage(x);
        }
    }
    return 0;
}

public OnConfigsExecuted()
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    wS_GetCvarColor(vip_cvar_he_rgba, g_HeColor, 60500);
    wS_GetCvarColor(vip_cvar_sg_rgba, g_SgColor, 60516);
    wS_GetCvarColor(vip_cvar_fb_rgba, g_FbColor, 60532);
    return 0;
}

public OnPluginStart()
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    wS_Protect_IpPort();
    LoadTranslations("vip.phrases");
    wS_SQL_Connect();
    wS_CreateServerVars();
    wS_GetOffs();
    wS_Create_AdminFlags_Trie();
    wS_Create_Cookie_Trie();
    wS_Create_GlobalFunctions();
    wS_Create_TeamPanel();
    g_VipDelTimerTrie = CreateTrie();
    RegAdminCmd("vip_add", vip_add, 16384, "", "", 0);
    RegAdminCmd("vip_add_time", vip_add_time, 16384, "", "", 0);
    RegAdminCmd("vip_set_time", vip_add_time, 16384, "", "", 0);
    RegAdminCmd("vip_del", vip_del, 16384, "", "", 0);
    RegAdminCmd("vip_list", vip_list, 16384, "", "", 0);
    RegAdminCmd("vip_info", vip_info, 16384, "", "", 0);
    RegAdminCmd("vip_groups_list", vip_groups_list, 16384, "", "", 0);
    RegAdminCmd("vip_groups_rename", vip_groups_rename, 16384, "", "", 0);
    RegAdminCmd("vip_set_group", vip_set_group, 16384, "", "", 0);
    RegAdminCmd("vip_past_remove", vip_past_remove, 16384, "", "", 0);
    RegConsoleCmd("vip", vip_command, "", 0);
    RegConsoleCmd("vip_version", vip_version, "", 0);
    AddCommandListener(say, "say");
    AddCommandListener(jointeam, "jointeam");
    AddCommandListener(drop, "drop");
    HookEvent("player_spawn", player_spawn, EventHookMode:1);
    HookEvent("player_hurt", player_hurt, EventHookMode:1);
    HookEvent("player_blind", player_blind, EventHookMode:1);
    HookEvent("bomb_begindefuse", bomb_begindefuse, EventHookMode:1);
    HookEvent("player_death", player_death, EventHookMode:1);
    HookEvent("player_team", player_team, EventHookMode:1);
    HookEvent("hegrenade_detonate", hegrenade_detonate, EventHookMode:1);
    HookEvent("smokegrenade_detonate", smokegrenade_detonate, EventHookMode:1);
    HookEvent("flashbang_detonate", flashbang_detonate, EventHookMode:1);
    HookEvent("round_start", round_start, EventHookMode:2);
    HookEvent("weapon_fire_on_empty", weapon_fire_on_empty, EventHookMode:1);
    HookEvent("hostage_follows", hostage_follows, EventHookMode:1);
    CreateTimer(1.0, OnPluginStart_ChangeLevel, any:0, 2);
    return 0;
}

public Action:OnPluginStart_ChangeLevel(Handle:timer)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    decl String:map[128];
    map[0] = MissingTAG:0;
    GetCurrentMap(map, 125);
    ServerCommand("changelevel \"%s\"", map);
    return Action:0;
}

public OnMapStart()
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    wS_OpenFileAndLoadFiles("cfg/vip/downloads.txt");
    new var1;
    if (GameRules_GetProp("m_bMapHasBombTarget", 4, 0)) {
        var1 = 1;
    } else {
        var1 = 0;
    }
    g_MapType_de = var1;
    wS_ReloadVipTrails();
    wS_ReloadVipOverlays();
    wS_ReloadVipChatIgnoreCommands();
    wS_ReloadVipGroups();
    wS_ReloadVipSkinsMenu();
    wS_ReloadVipSkinColorsMenu();
    wS_Precache();
    return 0;
}

public OnClientConnected(client)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    g_VipAccess[client] = 0;
    g_MyVipGroupExists[client] = 0;
    g_SteamId[client][0] = MissingTAG:0;
    g_MyVipGroup[client][0] = MissingTAG:0;
    wS_ClearVipVars(client);
    return 0;
}

public OnClientPutInServer(client)
{
    if (0 < g_Num) {
        new var2 = MaxClients;
        if (1 > var2 & 0 < var2) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    if (!wS_Protect_GameAllowed()) {
        return 0;
    }
    g_MyGameTimeWhenSelectOption[client] = 0;
    new var1;
    if (!IsFakeClient(client) && GetClientAuthString(client, g_SteamId[client], 28)) {
        wS_CheckVipAccess(client);
    }
    return 0;
}

public OnClientDisconnect_Post(client)
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    wS_KillTimer(g_RehpTimer[client]);
    wS_ClearHandle(g_VipMenu[client]);
    g_VipAccess[client] = 0;
    g_MyVipGroupExists[client] = 0;
    g_SteamId[client][0] = MissingTAG:0;
    g_MyVipGroup[client][0] = MissingTAG:0;
    wS_ClearVipVars(client);
    return 0;
}

wS_GetOffs()
{
    if (0 < g_Num) {
        new var1 = MaxClients;
        if (1 > var1 & 0 < var1) {
            PrintToServer(wS_GetMyNick());
        }
        new wS_List[MaxClients];
        wS_List[0] = 0;
        new xaxa = -1;
        PrintToServer("%d", xaxa);
    }
    new var2 = FindSendPropOffs("CCSPlayer", "m_flFlashDuration");
    g_FlashDuration_Offs = var2;
    if (var2 == -1) {
        LogToFileEx(g_ErrorLogFile, "m_flFlashDuration not found (FindSendPropOffs)");
    }
    new var3 = FindSendPropOffs("CCSPlayer", "m_flFlashMaxAlpha");
    g_FlashAlpha_Offs = var3;
    if (var3 == -1) {
        LogToFileEx(g_ErrorLogFile, "m_flFlashMaxAlpha not found (FindSendPropOffs)");
    }
    return 0;
}

public Action:vip_version(client, args)
{
    new var1;
    if (g_MYSQL) {
        var1[0] = 61308;
    } else {
        var1[0] = 61316;
    }
    new var2;
    if (TEST_VERSION == 1) {
        var2[0] = 61272;
    } else {
        var2[0] = 61292;
    }
    ReplyToCommand(client, "VIP %s (%s версия). Тип подключения: %s", PLUGIN_VERS, var2, var1);
    return Action:3;
}
__________________

Last edited by Peace-Maker; 12-19-2012 at 09:21.
Peace-Maker is offline
Dr. McKay
Sir Dr. SourceMod Plugin Approver Esq. Ltd. M.D. PhD
Join Date: Aug 2011
Location: Atlantis
Old 12-19-2012 , 09:52   Re: Lysis: An experimental .smx decompiler
Reply With Quote #132

Maybe we should just make SourceMod refuse to load anything with ".ru" in the plugin's URL.
Spoiler
__________________

Last edited by Dr. McKay; 12-19-2012 at 09:53.
Dr. McKay is offline
Despirator
Senior Member
Join Date: Jun 2011
Location: Kazakhstan ->Shymkent
Old 12-19-2012 , 21:17   Re: Lysis: An experimental .smx decompiler
Reply With Quote #133

Quote:
Originally Posted by Dr. McKay View Post
Maybe we should just make SourceMod refuse to load anything with ".ru" in the plugin's URL.
Spoiler
oh no my plugins
Spoiler

Last edited by Despirator; 12-19-2012 at 21:18.
Despirator is offline
Oshizu
Veteran Member
Join Date: Nov 2012
Location: Warsaw
Old 12-26-2012 , 17:21   Re: Lysis: An experimental .smx decompiler
Reply With Quote #134

When i'm decompiling TF2TD.smx that i've attached in post i'm getting
Code:
/* ERROR! Object reference not set to an instance of an object. */
Would be great if that issue with decompiling would be fixed someday

- Thanks
Attached Files
File Type: smx TF2TD.smx (13.3 KB, 260 views)
__________________
...

Last edited by Oshizu; 12-26-2012 at 17:22.
Oshizu is offline
ecca
Sexy Santa
Join Date: Jan 2011
Old 12-27-2012 , 22:22   Re: Lysis: An experimental .smx decompiler
Reply With Quote #135

#139

I can't see any errors in the decompiler ?

PHP Code:
public PlVers:__version =
{
    
version 5,
    
filevers "1.3.8",
    
date "07/06/2011",
    
time "16:42:42"
};
new 
Float:NULL_VECTOR[3];
new 
String:NULL_STRING[1];
public 
Extension:__ext_core =
{
    
name "Core",
    
file "core",
    
autoload 0,
    
required 0,
};
new 
MaxClients;
public 
Extension:__ext_sdkhooks =
{
    
name "sdkhooks",
    
file "sdkhooks.ext",
    
autoload 1,
    
required 1,
};
public 
Extension:__ext_tf2 =
{
    
name "TF2 Tools",
    
file "game.tf2.ext",
    
autoload 0,
    
required 1,
};
public 
Extension:__ext_sdktools =
{
    
name "SDKTools",
    
file "sdktools.ext",
    
autoload 1,
    
required 1,
};
new 
String:TFResourceNames[18][0];
public 
Plugin:myinfo =
{
    
name "Tower Defense",
    
description "Tower Defense",
    
author "Gran PC",
    
version "2.0",
    
url "http://peniscorp.com"
};
new 
MULTIPLY_BASECOST_CRIT 200;
new 
MULTIPLY_BASECOST_OTHERS 400;
new 
MULTIPLY_ADDITION_CRIT 200;
new 
MULTIPLY_ADDITION_OTHERS 400;
new 
String:EngineerTowerBuilt[35] = "\x04An Engineer with infinite metal will appear on the teleporter location and start repairing whatever is close to him (for \x03%i\x04 metal).";
new 
AmmoBoxes[4096] =
{
    -
1, ...
};
new 
String:TowerNames[9][8] =
{
    
"towersniper",
    
"towermedic",
    
"towerflame",
    
"towergrenade",
    
"towerjarate",
    
"towerrepair",
    
"towerscout",
    
"towerair2",
    
"towerair"
};
new 
String:TowerNiceNames[9][32] =
{
    
"Sniper",
    
"Medic",
    
"Pyro",
    
"Demoman",
    
"Jarate",
    
"-",
    
"Scout",
    
"Anti-Aerial Pyro",
    
"Anti-Aerial Soldier"
};
new 
TowerPrices[9] =
{
    
130035022002000850500500850850
};
new 
TowerBought[9];
new 
String:MultiplierName[5][8] =
{
    
"bullet",
    
"fire",
    
"explosion",
    
"sentry",
    
"crits"
};
new 
String:MultiplierStrings[5][8] =
{
    
"Bullets",
    
"Fire",
    
"Explosions",
    
"Sentries",
    
"-"
};
new 
MultiplierPrices[5] =
{
    
400, ...
};
new 
Multipliers[5] =
{
    
1, ...
};
new 
GotSaw;
new 
Handle:DebugMode;
public 
__ext_core_SetNTVOptional()
{
    
MarkNativeAsOptional("GetFeatureStatus");
    
MarkNativeAsOptional("RequireFeature");
    
MarkNativeAsOptional("AddCommandListener");
    
MarkNativeAsOptional("RemoveCommandListener");
    
VerifyCoreVersion();
    return 
0;
}

Float:operator*(Float:,_:)(Float:oper1oper2)
{
    return 
oper1 float(oper2);
}

Float:operator/(Float:,_:)(Float:oper1oper2)
{
    return 
oper1 float(oper2);
}

bool:operator==(Float:,_:)(Float:oper1oper2)
{
    return 
FloatCompare(oper1float(oper2)) == 0;
}

bool:operator>(_:,Float:)(oper1Float:oper2)
{
    return 
FloatCompare(float(oper1), oper2) > 0;
}

Float:DegToRad(Float:angle)
{
    return 
3.141593 angle 180;
}

bool:StrEqual(String:str1[], String:str2[], bool:caseSensitive)
{
    return 
strcmp(str1str2caseSensitive) == 0;
}

StrCat(String:buffer[], maxlengthString:source[])
{
    new 
len strlen(buffer);
    if (
len >= maxlength)
    {
        return 
0;
    }
    return 
Format(buffer[len], maxlength len"%s"source);
}

PrintToChatAll(String:format[])
{
    
decl String:buffer[192];
    new 
1;
    while (
<= MaxClients)
    {
        if (
IsClientInGame(i))
        {
            
SetGlobalTransTarget(i);
            
VFormat(buffer192format2);
            
PrintToChat(i"%s"buffer);
            
i++;
        }
        
i++;
    }
    return 
0;
}

ReplyToTargetError(clientreason)
{
    switch (
reason)
    {
        case -
7:
        {
            
ReplyToCommand(client"[SM] %t""More than one client matched");
        }
        case -
6:
        {
            
ReplyToCommand(client"[SM] %t""Cannot target bot");
        }
        case -
5:
        {
            
ReplyToCommand(client"[SM] %t""No matching clients");
        }
        case -
4:
        {
            
ReplyToCommand(client"[SM] %t""Unable to target");
        }
        case -
3:
        {
            
ReplyToCommand(client"[SM] %t""Target is not in game");
        }
        case -
2:
        {
            
ReplyToCommand(client"[SM] %t""Target must be dead");
        }
        case -
1:
        {
            
ReplyToCommand(client"[SM] %t""Target must be alive");
        }
        case 
0:
        {
            
ReplyToCommand(client"[SM] %t""No matching client");
        }
        default:
        {
        }
    }
    return 
0;
}

FindTarget(clientString:target[], bool:nobotsbool:immunity)
{
    
decl String:target_name[64];
    
decl target_list[1];
    
decl target_count;
    
decl bool:tn_is_ml;
    new 
flags 16;
    if (
nobots)
    {
        
flags |= 32;
    }
    if (!
immunity)
    {
        
flags |= 8;
    }
    new 
var1 ProcessTargetString(targetclienttarget_list1flagstarget_name64tn_is_ml);
    
target_count var1;
    if (
var1)
    {
        return 
target_list[0];
    }
    
ReplyToTargetError(clienttarget_count);
    return -
1;
}

TFClassType:TF2_GetPlayerClass(client)
{
    return 
GetEntProp(clientPropType:0TFResourceNames4);
}

public 
OnPluginStart()
{
    
RegAdminCmd("sm_multiply"BuyMultiplier4"Buys a multiplier.\nSyntax: sm_multiply multipliername"""0);
    
RegAdminCmd("sm_buy"BuyTower4"Buys a tower.\nSyntax: sm_buy tower"""0);
    
RegAdminCmd("sm_saw"Saw4"Enables the saw"""0);
    
RegConsoleCmd("mt"Metal""0);
    
RegConsoleCmd("allmetal"AllMetal""0);
    
RegConsoleCmd("amt"AllMetal""0);
    
RegConsoleCmd("drop"DropMetal""0);
    
RegAdminCmd("sm_reset_multipliers"ResetMultipliers4"Resets the game."""0);
    
RegAdminCmd("ammotest"Command_Ammo4"Ammotest."""0);
    
RegAdminCmd("bot_refill_blu"RefillBlu4"Refills BLU"""0);
    
RegAdminCmd("bot_heal"SetBotHealth4"Heals a single bot."""0);
    
RegAdminCmd("bot_setangles"SetBotAngles4"Changes the eye angles of a single bot."""0);
    
RegAdminCmd("bot_give"GiveWeapon4"Gives a weapon to a bot."""0);
    
RegAdminCmd("bot_spawn"SpawnBot4"Spawns a bunch of bots. Usage: bot_spawn number class name health. This doesn't work properly."""0);
    
HookEvent("player_spawn"PlayerSpawnEventHookMode:1);
    
HookEvent("player_connect"PlayerConnectEventHookMode:0);
    
HookEvent("player_disconnect"PlayerDisconnectEventHookMode:0);
    
HookEvent("player_team"PlayerTeamEventHookMode:0);
    
DebugMode CreateConVar("tf2td_debug_mode""0""Debug mode for TF2 TD. Options:\n    0: No debugging\n    1: Low debugging.\n    2: Extreme chat spam."0false0false0);
    return 
0;
}

public 
OnMapStart()
{
    
PrecacheModel("models/items\ammopack_small.mdl"true);
    
DoMessage();
    
DoResetMultipliers();
    return 
0;
}

public 
Action:Saw(clientargs)
{
    if (
GotSaw)
    {
        return 
Action:3;
    }
    if (!
TF_ChargePlayers(450))
    {
        return 
Action:3;
    }
    
BreakEntity(FindEntityByTargetname("saw""func_breakable"));
    
PrintToChatAll("\x04The saw is now enabled.");
    
GotSaw 1;
    return 
Action:3;
}

public 
Action:AllMetal(clientargs)
{
    new 
index = -1;
    new 
var2 FindEntityByClassname(index"player");
    
index var2;
    while (
var2 != -1)
    {
        if (
GetClientTeam(index) == 3)
        {
            
decl String:name[32];
            
GetClientName(indexname32);
            
PrintToChatAll("\x05%s"nameTF_GetMetalAmount(index));
        }
    }
    return 
Action:3;
}

public 
bool:TraceRayDontHitSelf(entitycontentsMaskdata)
{
    return 
data != entity;
}

public 
Action:DropMetal(clientargs)
{
    
decl String:arg1[12];
    
GetCmdArg(1arg110);
    if (
StringToInt(arg110) < 1)
    {
        return 
Action:3;
    }
    
decl Float:PlayerPos[3];
    
decl Float:EndPos[3];
    
decl Float:PlayerAngle[3];
    
GetClientAbsOrigin(clientPlayerPos);
    
GetClientEyeAngles(clientPlayerAngle);
    
EndPos[0] = PlayerPos[0] + Cosine(DegToRad(PlayerAngle[1])) * 50;
    
EndPos[1] = PlayerPos[1] + Sine(DegToRad(PlayerAngle[1])) * 50;
    
EndPos[2] = PlayerPos[2];
    new 
AmmoBox CreateEntityByName("prop_dynamic", -1);
    
TeleportEntity(AmmoBoxEndPosNULL_VECTORNULL_VECTOR);
    
AmmoBoxes[AmmoBox] = StringToInt(arg110);
    
SetEntityModel(AmmoBox"models/items\ammopack_small.mdl");
    
DispatchKeyValue(AmmoBox"Solid""6");
    
DispatchSpawn(AmmoBox);
    
TF_SetMetalAmount(clientTF_GetMetalAmount(client) - StringToInt(arg110));
    return 
Action:3;
}

public 
Action:BuyTower(clientargs)
{
    
decl String:TowerName[32];
    
GetCmdArg(1TowerName32);
    new 
0;
    while (
9)
    {
        if (
strcmp(TowerNameTowerNames[i][0][0], true))
        {
            
i++;
        }
        else
        {
            if (!
TF_ChargePlayers(TowerPrices[i][0][0]))
            {
                return 
Action:3;
            }
            
BreakEntity(FindEntityByTargetname(TowerNames[i][0][0], "func_breakable"));
            if (
== 5)
            {
                
PrintToChatAll(EngineerTowerBuiltTowerPrices[i]);
            }
            else
            {
                
decl String:buymessage[128];
                
StrCat(buymessage128TowerNiceNames[i][0][0]);
                
StrCat(buymessage128" tower has been bought (for \x03%i\x04 metal).");
                
PrintToChatAll(buymessageTowerPrices[i]);
            }
            
TowerBought[i] = 1;
            
i++;
        }
        
i++;
    }
    return 
Action:3;
}


/* ERROR! Object reference not set to an instance of an object. */
 
function "BuyMultiplier" (number 19)
DoResetMultipliers()
{
    new 
0;
    while (
!= 4)
    {
        
Multipliers[i] = 1;
        
i++;
    }
    new 
0;
    while (
!= 8)
    {
        
TowerBought[i] = 0;
        
i++;
    }
    new 
0;
    while (
!= 4)
    {
        
MultiplierPrices[i] = MULTIPLY_BASECOST_OTHERS;
        
i++;
    }
    
GotSaw 0;
    new 
0;
    while (
!= 4095)
    {
        
AmmoBoxes[i] = -1;
        
i++;
    }
    
Multipliers[4] = 9;
    
MultiplierPrices[4] = MULTIPLY_BASECOST_CRIT;
    
PrintToChatAll("\x04The round has been reset.");
    return 
0;
}

public 
Action:ResetMultipliers(clientargs)
{
    
DoResetMultipliers();
    return 
Action:0;
}

public 
Action:SetBotHealth(clientargs)
{
    new 
index2 = -1;
    
decl String:HP[8];
    
GetCmdArg(1HP8);
    new 
hp StringToInt(HP10);
    new 
var1 FindEntityByClassname(index2"player");
    
index2 var1;
    while (
var1 != -1)
    {
        if (
GetClientTeam(index2) == 2)
        {
            
decl String:name[64];
            
GetClientName(index2name64);
            
ServerCommand("sm_sethealth %s %i"namehp);
        }
    }
    return 
Action:0;
}

public 
Action:SetBotAngles(clientargs)
{
    new 
index2 = -1;
    
decl String:SEyeAngles[8];
    
GetCmdArg(2SEyeAngles8);
    
decl Float:EyeAngles[3];
    
decl String:arg1[32];
    
GetCmdArg(1arg132);
    
index2 FindTarget(clientarg1falsetrue);
    if (
index2 == -1)
    {
        return 
Action:0;
    }
    
GetClientEyeAngles(index2EyeAngles);
    
EyeAngles[0] = StringToFloat(SEyeAngles);
    
TeleportEntity(index2NULL_VECTOREyeAnglesNULL_VECTOR);
    return 
Action:3;
}

public 
Action:SpawnBot(clientargs)
{
    
decl String:amount[8];
    
decl String:class[16];
    
decl String:name[32];
    
decl String:health[8];
    
GetCmdArg(1amount6);
    
GetCmdArg(2, class, 16);
    
GetCmdArg(3name32);
    
GetCmdArg(4health5);
    new 
iamount StringToInt(amount10);
    new 
1;
    while (
iamount == i)
    {
        
ServerCommand("bot -team red -class %s -name %s%i", class, namei);
        
i++;
    }
    return 
Action:0;
}

public 
Action:RefillBlu(clientargs)
{
    new 
index2 = -1;
    new 
var2 FindEntityByClassname(index2"player");
    
index2 var2;
    while (
var2 != -1)
    {
        if (
GetClientTeam(index2) == 3)
        {
            
TF2_RegeneratePlayer(index2);
        }
    }
    return 
Action:0;
}

public 
Action:GiveWeapon(clientargs)
{
    
decl String:arg1[128];
    
GetCmdArg(1arg1128);
    
decl String:arg2[256];
    
GetCmdArg(2arg2256);
    new 
weaponIndex 0;
    new 
weaponSlot 0;
    while (
weaponSlot 6)
    {
        new 
var1 GetPlayerWeaponSlot(FindTarget(clientarg1falsetrue), weaponSlot);
        
weaponIndex var1;
        while (
var1 != -1)
        {
            
RemovePlayerItem(FindTarget(clientarg1falsetrue), weaponIndex);
            
RemoveEdict(weaponIndex);
        }
        
weaponSlot++;
    }
    new 
entity GivePlayerItem(FindTarget(clientarg1falsetrue), arg20);
    
EquipPlayerWeapon(FindTarget(clientarg1falsetrue), entity);
    return 
Action:0;
}

public 
Action:Command_Ammo(clientargs)
{
    
decl String:arg1[32];
    
GetCmdArg(1arg132);
    new 
ply FindTarget(clientarg1falsetrue);
    if (
ply == -1)
    {
        return 
Action:0;
    }
    
TF_SetMetalAmount(plyTF_GetMetalAmount(ply) + 1500);
    return 
Action:3;
}

IsDebugging()
{
    return 
GetConVarInt(DebugMode);
}

Min(ab)
{
    if (
b)
    {
        return 
b;
    }
    return 
a;
}

TF_ChargePlayers(Amount)
{
    new 
bool:Return = 1;
    new 
index = -1;
    new 
var3 FindEntityByClassname(index"player");
    
index var3;
    while (
var3 != -1)
    {
        if (
GetClientTeam(index) == 3)
        {
            if (
TF_GetMetalAmount(index) < Amount)
            {
                if (
IsDebugging())
                {
                    
PrintToChatAll("Can't charge %i because you only have %i"AmountTF_GetMetalAmount(index));
                }
                Return = 
0;
            }
        }
    }
    if (!Return)
    {
        
PrintToChatAll("Couldn't charge the following users: ");
    }
    new 
index2 = -1;
    new 
var4 FindEntityByClassname(index2"player");
    
index2 var4;
    while (
var4 != -1)
    {
        if (
GetClientTeam(index2) == 3)
        {
            if (Return == 
true)
            {
                
TF_SetMetalAmount(index2TF_GetMetalAmount(index2) - Amount);
            }
            if (
TF_GetMetalAmount(index2) < Amount)
            {
                
decl String:name[32];
                
GetClientName(index2name32);
                
PrintToChatAll("\x05%s"nameTF_GetMetalAmount(index2), Amount TF_GetMetalAmount(index2));
            }
        }
    }
    return Return;
}

BreakEntity(ent)
{
    if (
IsDebugging())
    {
        
PrintToChatAll("DEBUG: Breaking entity %i"ent);
    }
    return 
AcceptEntityInput(ent"break", -1, -10);
}

FindEntityByTargetname(String:targetname[], String:classname[])
{
    
decl String:namebuf[32];
    new 
index = -1;
    
namebuf[0] = 0;
    while (
strcmp(namebuftargetnametrue) && var2 != -1)
    {
        
GetEntPropString(indexPropType:1"m_iName"namebuf32);
    }
    return 
index;
}

TF_SetMetalAmount(PlayerAmount)
{
    
SetEntData(PlayerFindDataMapOffs(Player"m_iAmmo"00) + 12Amount4true);
    return 
0;
}

TF_GetMetalAmount(Player)
{
    return 
GetEntData(PlayerFindDataMapOffs(Player"m_iAmmo"00) + 124);
}

public 
Action:OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
    
decl String:Class[64];
    
GetEdictClassname(inflictor, Class, 64);
    
decl String:AttackerClass[64];
    
GetEdictClassname(attackerAttackerClass64);
    
decl String:Victim[64];
    
GetEdictClassname(victimAttackerClass64);
    if (
StrEqual(Victim"func_breakable"true))
    {
        if (
damagetype 2)
        {
            return 
Action:0;
        }
        
damage 0;
        return 
Action:1;
    }
    if (!
StrEqual(AttackerClass"obj_sentrygun"true))
    {
        if (!
StrEqual(AttackerClass"tf_projectile_sentryrocket"true))
        {
            if (!
StrEqual(AttackerClass"player"true))
            {
                return 
Action:0;
            }
        }
    }
    if (
StrEqual(Class, "obj_sentrygun"true))
    {
        
damage damage Multipliers[3][0];
        return 
Action:1;
    }
    if (
damagetype 2)
    {
        if (
damagetype 128)
        {
            return 
Action:0;
        }
        
damage damage Multipliers[0][0];
        return 
Action:1;
    }
    if (
damagetype 64)
    {
        
damage damage Multipliers[2][0];
        return 
Action:1;
    }
    if (
damagetype 8)
    {
        
damage damage Multipliers[1][0];
        return 
Action:1;
    }
    return 
Action:0;
}

public 
Action:RemoveMetal(Handle:timerclient)
{
    
TF_SetMetalAmount(client0);
    return 
Action:0;
}

public 
Action:Metal(clientargs)
{
    
PrintToChat(client"\x03You have %i metal."TF_GetMetalAmount(client));
    return 
Action:3;
}

public 
OnClientPutInServer(client)
{
    
SDKHook(clientSDKHookType:2OnTakeDamage);
    
SDKHook(clientSDKHookType:8OnTouch);
    return 
0;
}

public 
OnTouch(clientother)
{
    
decl String:Class[256];
    
GetEntPropString(otherPropType:1"m_ModelName", Class, 256);
    if (
GetClientTeam(client) != 3)
    {
        
RemoveEdict(other);
        
AmmoBoxes[other] = -1;
        return 
0;
    }
    if (
TF2_GetPlayerClass(client) != 9)
    {
        return 
0;
    }
    if (
AmmoBoxes[other][0][0] != -1)
    {
        
TF_SetMetalAmount(clientAmmoBoxes[other][0][0] + TF_GetMetalAmount(client));
        
RemoveEdict(other);
        
AmmoBoxes[other] = -1;
        return 
0;
    }
    if (
StrEqual(Class, "models/items\ammopack_small.mdl"true))
    {
        
TF_SetMetalAmount(clientTF_GetMetalAmount(client) + 100);
        
RemoveEdict(other);
        return 
0;
    }
    if (
StrEqual(Class, "models/items\ammopack_medium.mdl"true))
    {
        
TF_SetMetalAmount(clientTF_GetMetalAmount(client) + 200);
        
RemoveEdict(other);
        return 
0;
    }
    if (
StrEqual(Class, "models/items\ammopack_large.mdl"true))
    {
        
TF_SetMetalAmount(clientTF_GetMetalAmount(client) + 400);
        
RemoveEdict(other);
        return 
0;
    }
    return 
0;
}

public 
Action:PlayerSpawn(Handle:eventString:name[], bool:NoBroadcast)
{
    new 
client_id GetEventInt(event"userid");
    new 
client GetClientOfUserId(client_id);
    new 
TFClassType:Class = TF2_GetPlayerClass(client);
    if (
TF2_GetClass("engineer") == Class)
    {
        
CreateTimer(0.03RemoveMetalclient2);
    }
    return 
Action:0;
}

public 
Action:PlayerConnect(Handle:eventString:name[], bool:NoBroadcast)
{
    return 
Action:3;
}

public 
Action:PlayerDisconnect(Handle:eventString:name[], bool:NoBroadcast)
{
    return 
Action:3;
}

public 
Action:PlayerTeam(Handle:eventString:name[], bool:NoBroadcast)
{
    return 
Action:3;
}

public 
Action:TF2_CalcIsAttackCritical(clientweaponString:weaponname[], &bool:result)
{
    if (
== Multipliers[4][0])
    {
        return 
Action:0;
    }
    if (
IsDebugging() > 1)
    {
        
PrintToChatAll("DEBUG: Rolling crit with %i%s chance"19168 1620832);
    }
    if (
Multipliers[4][0] > GetRandomFloat(0100))
    {
        
result 1;
        return 
Action:3;
    }
    if (
IsDebugging() > 1)
    {
        
PrintToChatAll("Crit failed!");
    }
    
result 0;
    return 
Action:3;
}

DoMessage()
{
    
CreateTimer(300Advertany:01);
    return 
0;
}

public 
Action:Advert(Handle:timer)
{
    
PrintToChatAll("\x04TF2 Tower Defense Mod (alpha), made by Visiteur, Gran PC and flyflo.");
    
PrintToChatAll("\x04Visit tf2td.com for updates and more info.");
    return 
Action:0;

ecca is offline
Peace-Maker
SourceMod Plugin Approver
Join Date: Aug 2008
Location: Germany
Old 12-29-2012 , 11:03   Re: Lysis: An experimental .smx decompiler
Reply With Quote #136

Quote:
Originally Posted by ecca View Post
#139

I can't see any errors in the decompiler ?

PHP Code:
/* ERROR! Object reference not set to an instance of an object. */
 
function "BuyMultiplier" (number 19
You even posted it yourself ;)

Quote:
Originally Posted by Oshizu View Post
When i'm decompiling TF2TD.smx that i've attached in post i'm getting
Code:
/* ERROR! Object reference not set to an instance of an object. */
Would be great if that issue with decompiling would be fixed someday

- Thanks
That issue with decompiling will never actually end. You shouldn't take this stuff for granted. You're welcome to jump in and provide your own patches

Where did you get that .smx?

The missing function looks similar to
PHP Code:
public Action:BuyMultiplier(clientargs)
{
    
decl String:CurrentMultiplierName[32];
    
GetCmdArg(1CurrentMultiplierName32);
    new 
0;
    while (
5) {
        if (
strcmp(CurrentMultiplierNameMultiplierName[i], true)) {
            
i++;
        } else {
            new 
Multiplier Multipliers[i] + -1;
            new 
BaseCost MULTIPLY_BASECOST_OTHERS;
            new 
Addition MULTIPLY_ADDITION_OTHERS;
            if (
== 4) {
                
Multiplier Multipliers[i][-2] / 5;
                
BaseCost MULTIPLY_BASECOST_CRIT;
                
Addition MULTIPLY_ADDITION_CRIT;
            }
            
MultiplierPrices[i] = Addition Multiplier BaseCost;
            if (!
TF_ChargePlayers(MultiplierPrices[i])) {
                return 
Action:3;
            }
            if (
== 4) {
                
Multipliers[i] = Min(100Multipliers[i][1]);
                
PrintToChatAll("\x04Crits now have a %i%s chance of happening (for \x03%i\x04 metal)!"Multipliers[i], "%"MultiplierPrices[i]);
                
i++;
            } else {
                
decl String:buymessage[128];
                
StrCat(buymessage128MultiplierStrings[i]);
                
StrCat(buymessage128" now %s %i times more damage  (for \x03%i\x04 metal)!");
                
Multipliers[i]++;
                
decl String:does[8];
                if (!(
== 1)) {
                }
                
PrintToChatAll(buymessagedoesMultipliers[i], MultiplierPrices[i]);
                
i++;
            }
            
i++;
        }
        
i++;
    }
    return 
Action:3;

__________________
Peace-Maker is offline
Oshizu
Veteran Member
Join Date: Nov 2012
Location: Warsaw
Old 12-29-2012 , 16:50   Re: Lysis: An experimental .smx decompiler
Reply With Quote #137

Quote:
Originally Posted by Peace-Maker View Post

Where did you get that .smx?
Downloaded it while ago somewhere around 2010 year from Team Fortress 2 Tower Defense site with few other plugins included in zip file.
__________________
...

Last edited by Oshizu; 12-29-2012 at 16:51.
Oshizu is offline
pubhero
Veteran Member
Join Date: Aug 2012
Location: Central Europe
Old 01-16-2013 , 02:52   Re: Lysis: An experimental .smx decompiler
Reply With Quote #138

Lol.
It's a war!

Code:
public Plugin:myinfo =
{
    name = "UCP Server",
    description = "Ultra Core Protector Anti-Cheat",
    author = "Endi",
    version = "7.8.3",
    url = "http://ucp-anticheat.org/"
};
Code:
public Extension:__ext_smsock =
{
    name = "Socket",
    file = "socket.ext",
    autoload = 1,
    required = 1,
};
new String:ForBAILOPAN[7] = "David Anderson - Noob :)";
new String:hw32[3][4] =
{
    "a",
    "n",
    "z"
};
pubhero is offline
Zephyrus
Cool Pig B)
Join Date: Jun 2010
Location: Hungary
Old 01-16-2013 , 03:38   Re: Lysis: An experimental .smx decompiler
Reply With Quote #139

I saw that too lol but how did he get a 7 byte string to have a much longer text in it
__________________
Taking private C++/PHP/SourcePawn requests, PM me.
Zephyrus is offline
asherkin
SourceMod Developer
Join Date: Aug 2009
Location: OnGameFrame()
Old 01-16-2013 , 12:03   Re: Lysis: An experimental .smx decompiler
Reply With Quote #140

Quote:
Originally Posted by Zephyrus View Post
I saw that too lol but how did he get a 7 byte string to have a much longer text in it
It's calculating the number of cells, not bytes. Just lacking a special case for the String: tag.
__________________

Last edited by asherkin; 01-16-2013 at 12:04.
asherkin is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 12:04.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode