csgo_gunmenu Only for admin

vasil

Участник
Сообщения
115
Реакции
21
Всем привет.Уважаемые Гуру.Нужна ваша помощь.
Не могу сделать следующее.
1.Сделать чтоб менюшка при открытии открывалась бы только тому у кого есть флаг
2.Или вобще выключить менюшку, чтоб она не выскакивала в начале раунда всем(Тоесть ее включить не могут потом простые игроки-это работает )
Лчше конечно первый вариант.Ну как говорится чем поможете и тому рады будем.
Спасибо.
PHP:
#include <sourcemod>
#include <sdktools>

#pragma semicolon 1

// Plugin definitions
#define PLUGIN_VERSION "1.0-lm"
#define PLUGIN_ANNOUNCE "\x04[Gun Menu Lite]\x01 v1.0-lm by LumiStance"
public Plugin:myinfo =
{
    name = "[CS:GO] Gun Menu",
    author = "LumiStance (adapting by Grey83)",
    version = PLUGIN_VERSION,
    description = "Lets players select from a menu of allowed weapons.",
    url = "http://srcds.LumiStance.com/"
};

// Constants
enum Slots
{
    Slot_Primary,
    Slot_Secondary,
    Slot_Knife,
    Slot_Grenade,
    Slot_C4,
    Slot_None
};
enum Teams
{
    CS_TEAM_NONE,
    CS_TEAM_SPECTATOR,
    CS_TEAM_T,
    CS_TEAM_CT
};

// Console Variables
new Handle:g_ConVar_Version;
// Configuration
new g_ConfigTimeStamp = -1;
new String:g_szFragSound[PLATFORM_MAX_PATH];
new g_AllowBuyMenu = false;
new g_AllowBomb = false;
new g_SpawnArmor = 0;
new bool:g_SpawnHelmet = false;
new bool:g_SpawnFlash = false;
new bool:g_SpawnSmoke = false;
new bool:g_SpawnHE = false;
new bool:g_SpawnInc = false;
new bool:g_SpawnDefuser = false;
// Weapon Entity Members and Data
new m_ArmorValue = -1;
new m_bHasHelmet = -1;
new m_bHasDefuser = -1;
// Weapon Menu Configuration
#define MAX_WEAPON_COUNT 32
#define RANDOM_WEAPON 0x63
#define SHOW_MENU -1
new g_PrimaryGunCount;
new g_SecondaryGunCount;
new String:g_PrimaryGuns[MAX_WEAPON_COUNT][32];
new String:g_SecondaryGuns[MAX_WEAPON_COUNT][32];
// Menus
new bool:g_MenuOpen[MAXPLAYERS+1] = {false, ...};
new Handle:g_PrimaryMenu = INVALID_HANDLE;
new Handle:g_SecondaryMenu = INVALID_HANDLE;
// Player Settings
new g_PlayerPrimary[MAXPLAYERS+1] = {-1, ...};
new g_PlayerSecondary[MAXPLAYERS+1] = {-1, ...};

public OnPluginStart()
{
    // Version of plugin - Visible to game-monitor.com - Don't store in configuration file
    g_ConVar_Version = CreateConVar("csgo_gunmenu_version", PLUGIN_VERSION, "[CS:GO] Gun Menu version", FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_NOTIFY|FCVAR_DONTRECORD);

    // Cache Send Property Offsets
    m_ArmorValue = FindSendPropOffs("CCSPlayer", "m_ArmorValue");
    m_bHasHelmet = FindSendPropOffs("CCSPlayer", "m_bHasHelmet");
    m_bHasDefuser = FindSendPropOffs("CCSPlayer", "m_bHasDefuser");
    if (m_ArmorValue == -1 || m_bHasHelmet == -1 || m_bHasDefuser == -1)
        SetFailState("\nFailed to retrieve entity member offsets");

    // Client Commands
    RegConsoleCmd("sm_guns", Command_GunMenu);
    RegConsoleCmd("sm_gunmenu", Command_GunMenu);

    // Event Hooks
    HookEvent("player_spawn", Event_PlayerSpawn);
    HookEvent("player_death", Event_PlayerDeath);
    HookEvent("bomb_pickup", Event_BombPickup);
    HookEvent("player_team", Event_PlayerTeam);
}

public OnPluginEnd()
{
    CancelMenu(g_PrimaryMenu);
    CheckCloseHandle(g_PrimaryMenu);
    CancelMenu(g_SecondaryMenu);
    CheckCloseHandle(g_SecondaryMenu);
}

public OnMapStart()
{
    // Load configuration
    CheckConfig("configs/gunmenu.ini");

    // Remove buy zones from map to disable the buy menu
    if (!g_AllowBuyMenu)
        RemoveBuyZones();

    // Handle late load
    if (GetClientCount(true))
        for (new client_index = 1; client_index <= MaxClients; ++client_index)
            if (IsClientInGame(client_index))
            {
                OnClientPutInServer(client_index);
                if (IsPlayerAlive(client_index))
                    CreateTimer(0.1, Event_HandleSpawn, GetClientUserId(client_index));
            }


    // Work around A2S_RULES bug in linux orange box
    SetConVarString(g_ConVar_Version, PLUGIN_VERSION);
}

// Must be manually replayed for late load
public OnClientPutInServer(client_index)
{
    PrintToChat(client_index, PLUGIN_ANNOUNCE);
    g_MenuOpen[client_index]=false;

    // Give bots random guns
    if (IsFakeClient(client_index))
    {
        g_PlayerPrimary[client_index] = RANDOM_WEAPON;
        g_PlayerSecondary[client_index] = RANDOM_WEAPON;
    }
    else
    {
        g_PlayerPrimary[client_index] = SHOW_MENU;
        g_PlayerSecondary[client_index] = SHOW_MENU;
    }
}

public Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
    CreateTimer(0.1, Event_HandleSpawn, GetEventInt(event, "userid"));
}

// Did a player get a kill?
public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
    if (g_szFragSound[0])
    {
        new victim_index = GetClientOfUserId(GetEventInt(event, "userid"));
        new attacker_index = GetClientOfUserId(GetEventInt(event, "attacker"));

        if (0 < attacker_index && attacker_index <= MaxClients && attacker_index != victim_index && !IsFakeClient(attacker_index))
            EmitSoundToClient(attacker_index, g_szFragSound, SOUND_FROM_PLAYER, SNDCHAN_AUTO, SNDLEVEL_GUNFIRE);
    }
}

public Action:Event_BombPickup( Handle:event, const String:name[], bool:dontBroadcast )
{
    if (!g_AllowBomb)
        RemoveWeaponBySlot(GetClientOfUserId(GetEventInt(event, "userid")), Slot_C4);
}

// If player spectated close any gun menus
public Event_PlayerTeam(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client_index = GetClientOfUserId(GetEventInt(event, "userid"));

    if (g_MenuOpen[client_index] && (Teams:GetEventInt(event, "team") == CS_TEAM_SPECTATOR))
    {
        CancelClientMenu(client_index);        // Delayed
        g_MenuOpen[client_index] = false;
    }
}

stock CheckConfig(const String:ini_file[])
{
    decl String:file[PLATFORM_MAX_PATH];
    BuildPath(Path_SM, file, sizeof(file), ini_file);

    new timestamp = GetFileTime(file, FileTime_LastChange);

    if (timestamp == -1)
        SetFailState("\nCould not stat config file: %s.", file);

    if (timestamp != g_ConfigTimeStamp)
    {
        InitializeMenus();
        if (ParseConfigFile(file))
        {
            FinalizeMenus();

            if (g_szFragSound[0])
                CacheSoundFile(g_szFragSound);

            g_ConfigTimeStamp = timestamp;
        }
    }
}

stock CacheSoundFile(String:sound[])
{
    decl String:buffer[PLATFORM_MAX_PATH];
    PrecacheSound(sound, true);
    Format(buffer, sizeof(buffer), "sound/%s", sound);
    AddFileToDownloadsTable(buffer);
}

stock InitializeMenus()
{
    g_PrimaryGunCount=0;
    CheckCloseHandle(g_PrimaryMenu);
    g_PrimaryMenu = CreateMenu(MenuHandler_ChoosePrimary, MenuAction_Display|MenuAction_Select|MenuAction_Cancel);
    SetMenuTitle(g_PrimaryMenu, "Choose a Primary Weapon:");
    AddMenuItem(g_PrimaryMenu, "63", "Random");

    g_SecondaryGunCount=0;
    CheckCloseHandle(g_SecondaryMenu);
    g_SecondaryMenu = CreateMenu(MenuHandler_ChooseSecondary, MenuAction_Display|MenuAction_Select|MenuAction_Cancel);
    SetMenuTitle(g_SecondaryMenu, "Choose a Secondary Weapon:");
    AddMenuItem(g_SecondaryMenu, "63", "Random");
}

stock FinalizeMenus()
{
    AddMenuItem(g_PrimaryMenu, "FF", "None");
    AddMenuItem(g_SecondaryMenu, "FF", "None");
}

bool:ParseConfigFile(const String:file[]) {
    // Set Defaults
    g_szFragSound[0] = 0;
    g_AllowBuyMenu = false;
    g_AllowBomb = false;

    new Handle:parser = SMC_CreateParser();
    SMC_SetReaders(parser, Config_NewSection, Config_UnknownKeyValue, Config_EndSection);
    SMC_SetParseEnd(parser, Config_End);

    new line = 0;
    new col = 0;
    new String:error[128];
    new SMCError:result = SMC_ParseFile(parser, file, line, col);
    CloseHandle(parser);

    if (result != SMCError_Okay) {
        SMC_GetErrorString(result, error, sizeof(error));
        LogError("%s on line %d, col %d of %s", error, line, col, file);
    }

    return (result == SMCError_Okay);
}

new g_configLevel;
public SMCResult:Config_NewSection(Handle:parser, const String:section[], bool:quotes)
{
    g_configLevel++;
    if (g_configLevel==2)
    {
        if (StrEqual("Settings", section, false))
            SMC_SetReaders(parser, Config_NewSection, Config_SettingsKeyValue, Config_EndSection);
        else if (StrEqual("SpawnItems", section, false))
            SMC_SetReaders(parser, Config_NewSection, Config_SpawnItemsKeyValue, Config_EndSection);
        else if (StrEqual("PrimaryMenu", section, false))
            SMC_SetReaders(parser, Config_NewSection, Config_PrimaryKeyValue, Config_EndSection);
        else if (StrEqual("SecondaryMenu", section, false))
            SMC_SetReaders(parser, Config_NewSection, Config_SecondaryKeyValue, Config_EndSection);
    }
    else
        SMC_SetReaders(parser, Config_NewSection, Config_UnknownKeyValue, Config_EndSection);
    return SMCParse_Continue;
}

public SMCResult:Config_UnknownKeyValue(Handle:parser, const String:key[], const String:value[], bool:key_quotes, bool:value_quotes)
{
    SetFailState("\nDidn't recognize configuration: Level %i %s=%s", g_configLevel, key, value);
    return SMCParse_Continue;
}

public SMCResult:Config_SettingsKeyValue(Handle:parser, const String:key[], const String:value[], bool:key_quotes, bool:value_quotes)
{
    if (StrEqual("frag_sound", key, false))
        strcopy(g_szFragSound, sizeof(g_szFragSound), value);
    else if (StrEqual("allow_c4", key, false))
        g_AllowBomb = StrEqual("yes", value, false);
    else if (StrEqual("buy_zones", key, false))
        g_AllowBuyMenu = StrEqual("yes", value, false);
    return SMCParse_Continue;
}

public SMCResult:Config_SpawnItemsKeyValue(Handle:parser, const String:key[], const String:value[], bool:key_quotes, bool:value_quotes)
{
    if (StrEqual("armor", key, false))
        g_SpawnArmor = StringToInt(value);
    else if (StrEqual("helmet", key, false))
        g_SpawnHelmet = StrEqual("yes", value, false);
    else if (StrEqual("flashbangs", key, false))
        g_SpawnFlash = StrEqual("yes", value, false);
    else if (StrEqual("smokegrenade", key, false))
        g_SpawnSmoke = StrEqual("yes", value, false);
    else if (StrEqual("hegrenade", key, false))
        g_SpawnHE = StrEqual("yes", value, false);
    else if (StrEqual("incgrenade", key, false))
        g_SpawnInc = StrEqual("yes", value, false);
    else if (StrEqual("defusekits", key, false))
        g_SpawnDefuser = StrEqual("yes", value, false);
    return SMCParse_Continue;
}

public SMCResult:Config_PrimaryKeyValue(Handle:parser, const String:weapon_class[], const String:weapon_name[], bool:key_quotes, bool:value_quotes) {
    if (g_PrimaryGunCount>=MAX_WEAPON_COUNT)
        SetFailState("\nToo many weapons declared!");

    decl String:weapon_id[4];
    strcopy(g_PrimaryGuns[g_PrimaryGunCount], sizeof(g_PrimaryGuns[]), weapon_class);
    Format(weapon_id, sizeof(weapon_id), "%02.2X", g_PrimaryGunCount++);
    AddMenuItem(g_PrimaryMenu, weapon_id, weapon_name);
    return SMCParse_Continue;
}

public SMCResult:Config_SecondaryKeyValue(Handle:parser, const String:weapon_class[], const String:weapon_name[], bool:key_quotes, bool:value_quotes)
{
    if (g_SecondaryGunCount>=MAX_WEAPON_COUNT)
        SetFailState("\nToo many weapons declared!");

    decl String:weapon_id[4];
    strcopy(g_SecondaryGuns[g_SecondaryGunCount], sizeof(g_SecondaryGuns[]), weapon_class);
    Format(weapon_id, sizeof(weapon_id), "%02.2X", g_SecondaryGunCount++);
    AddMenuItem(g_SecondaryMenu, weapon_id, weapon_name);
    return SMCParse_Continue;
}

public SMCResult:Config_EndSection(Handle:parser)
{
    g_configLevel--;
    SMC_SetReaders(parser, Config_NewSection, Config_UnknownKeyValue, Config_EndSection);
    return SMCParse_Continue;
}

public Config_End(Handle:parser, bool:halted, bool:failed)
{
    if (failed)
        SetFailState("\nPlugin configuration error");
}

// Set Player's Primary Weapon
public MenuHandler_ChoosePrimary(Handle:menu, MenuAction:action, param1, param2)
{
    if (action == MenuAction_Display)
        g_MenuOpen[param1] = true;
    else if (action == MenuAction_Select)
    {
        new client_index = param1;
        decl String:weapon_id[4];
        GetMenuItem(menu, param2, weapon_id, sizeof(weapon_id));
        new weapon_index = StringToInt(weapon_id, 16);

        g_PlayerPrimary[client_index] = weapon_index;
        if (Teams:GetClientTeam(client_index) > CS_TEAM_SPECTATOR)
            GivePrimary(client_index);

        DisplayMenu(g_SecondaryMenu, client_index, MENU_TIME_FOREVER);
    }
    else if (action == MenuAction_Cancel)
    {
        g_MenuOpen[param1] = false;
        if (param2 == MenuCancel_Exit)    // CancelClientMenu sends MenuCancel_Interrupted reason
        {
            if (g_SecondaryMenu != INVALID_HANDLE)
                DisplayMenu(g_SecondaryMenu, param1, MENU_TIME_FOREVER);
        }
    }
}

// Set Player's Secondary Weapon
public MenuHandler_ChooseSecondary(Handle:menu, MenuAction:action, param1, param2)
{
    if (action == MenuAction_Display)
        g_MenuOpen[param1] = true;
    else if (action == MenuAction_Select)
    {
        new client_index = param1;
        decl String:weapon_id[4];
        GetMenuItem(menu, param2, weapon_id, sizeof(weapon_id));
        new weapon_index = StringToInt(weapon_id, 16);

        g_PlayerSecondary[client_index] = weapon_index;
        if (Teams:GetClientTeam(client_index) > CS_TEAM_SPECTATOR)
            GiveSecondary(client_index);
    }
    else if (action == MenuAction_Cancel)
        g_MenuOpen[param1] = false;
}

// After Delay, Show Menu or Give Weapons
public Action:Event_HandleSpawn(Handle:timer, any:user_index)
{
    // This event implies client is in-game while GetClientOfUserId() checks IsClientConnected()
    new client_index = GetClientOfUserId(user_index);
    if (!client_index)
        return;

    new Teams:client_team = Teams:GetClientTeam(client_index);
    if (client_team > CS_TEAM_SPECTATOR)
    {
        // Vest Armor
        if (g_SpawnArmor)
            SetEntData(client_index, m_ArmorValue, g_SpawnArmor, 1, true);
        // Helmet
        SetEntData(client_index, m_bHasHelmet, 1&_:g_SpawnHelmet, 1, true);
        // Remove any nades
        StripNades(client_index);
        // Flash Bangs
        if (g_SpawnFlash)
            GivePlayerItem(client_index, "weapon_flashbang");
        // Smoke Grenade
        if (g_SpawnSmoke)
            GivePlayerItem(client_index, "weapon_smokegrenade");
        // HE Grenade
        if (g_SpawnHE)
            GivePlayerItem(client_index, "weapon_hegrenade");
        // Incendiary Grenade
        if (g_SpawnInc)
            GivePlayerItem(client_index, "weapon_incgrenade");
        // Defuser Kit
        if (client_team == CS_TEAM_CT)
            SetEntData(client_index, m_bHasDefuser, 1&_:g_SpawnDefuser, 1, true);

        // Show Menu or Give Guns
        if (g_PlayerPrimary[client_index]==SHOW_MENU && g_PlayerSecondary[client_index]==SHOW_MENU)
        {
            if (g_PrimaryMenu != INVALID_HANDLE)
                DisplayMenu(g_PrimaryMenu, client_index, MENU_TIME_FOREVER);
            else if (g_SecondaryMenu != INVALID_HANDLE)
                DisplayMenu(g_SecondaryMenu, client_index, MENU_TIME_FOREVER);
        }
        else
        {
            GivePrimary(client_index);
            GiveSecondary(client_index);
        }
    }
}

stock GivePrimary(client_index)
{
    new weapon_index = g_PlayerPrimary[client_index];
    RemoveWeaponBySlot(client_index, Slot_Primary);
    if (weapon_index == RANDOM_WEAPON)
        weapon_index = GetRandomInt(0, g_PrimaryGunCount-1);
    if (weapon_index >= 0 && weapon_index < g_PrimaryGunCount)
        GivePlayerItem(client_index, g_PrimaryGuns[weapon_index]);
}

stock GiveSecondary(client_index)
{
    new weapon_index = g_PlayerSecondary[client_index];
    RemoveWeaponBySlot(client_index, Slot_Secondary);
    if (weapon_index == RANDOM_WEAPON)
        weapon_index = GetRandomInt(0, g_SecondaryGunCount-1);
    if (weapon_index >= 0 && weapon_index < g_SecondaryGunCount)
        GivePlayerItem(client_index, g_SecondaryGuns[weapon_index]);
}

public Action:Command_GunMenu(client_index, args)
{
    if (IsClientInGame(client_index) && Teams:GetClientTeam(client_index) > CS_TEAM_SPECTATOR)
    {
        if (g_PrimaryMenu != INVALID_HANDLE)
            DisplayMenu(g_PrimaryMenu, client_index, MENU_TIME_FOREVER);
        else if (g_SecondaryMenu != INVALID_HANDLE)
            DisplayMenu(g_SecondaryMenu, client_index, MENU_TIME_FOREVER);
    }
    return Plugin_Continue;
}

stock CheckCloseHandle(&Handle:handle)
{
    if (handle != INVALID_HANDLE)
    {
        CloseHandle(handle);
        handle = INVALID_HANDLE;
    }
}

stock StripNades(client_index)
{
    while (RemoveWeaponBySlot(client_index, Slot_Grenade)) {}
}

stock bool:RemoveWeaponBySlot(client_index, Slots:slot)
{
    new entity_index = GetPlayerWeaponSlot(client_index, _:slot);
    if (entity_index>0)
    {
        RemovePlayerItem(client_index, entity_index);
        AcceptEntityInput(entity_index, "Kill");
        return true;
    }
    return false;
}

stock RemoveBuyZones()
{
    new MaxEntities = GetMaxEntities();
    decl String:sz_classname[16];

    for (new entity_index = MaxClients+1; entity_index < MaxEntities; ++entity_index)
    {
        if (IsValidEdict(entity_index))
        {
            GetEdictClassname(entity_index, sz_classname, sizeof(sz_classname));
            if (StrEqual(sz_classname, "func_buyzone"))
                AcceptEntityInput(entity_index, "Kill");
        }
    }
}

stock min(a, b) {return (a<b) ? a:b;}
stock max(a, b) {return (a>b) ? a:b;}
оригинал
 

SourceSamil

Мошенник
Сообщения
121
Реакции
28
RegConsoleCmd("sm_guns", Command_GunMenu);
RegConsoleCmd("sm_gunmenu", Command_GunMenu);

Смени на
RegAdminCmd( "sm_guns", Command_GunMenu, ADMFLAG_GENERIC );
RegAdminCmd( "sm_gunmenu", Command_GunMenu, ADMFLAG_GENERIC );

И у всех у кого есть флаг b смогут открыть меню
 

vasil

Участник
Сообщения
115
Реакции
21
Это все правильно...Это я делал... Это для тех кому открывать меню....
Ну при респавне начало новой карты .Менюшка всплывает для всех.Вот и хочется чтоб она не всплывала для всех а тому у кого флаг.
 

SourceSamil

Мошенник
Сообщения
121
Реакции
28
Ну, я так исход глянул, тут много перепиливать, а для начала
public Event_PlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
{
CreateTimer(0.1, Event_HandleSpawn, GetEventInt(event, "userid"));
}
Удалить
И Event_PlayerSpawn
 

vasil

Участник
Сообщения
115
Реакции
21
Да все это хорошо..Только тоже не выход. из конфига
PHP:
gunmenu.ini
все ставится всем игрокам...
А нельзя ли как где нибудь что то вроде этого вставить где нибудь?
PHP:
if (client > 0 && args > 0 && GetUserFlagBits(client) & ADMFLAG_CUSTOM6)
или
PHP:
if (CheckCommandAccess(client, "generic_admin", ADMFLAG_CUSTOM6, false))
 
Последнее редактирование:

vasil

Участник
Сообщения
115
Реакции
21
1.Менюшка(всплывающая) при респавне только у кого флаг
2. Из конфига ставится только у кого флаг

Гуру - скриптеры !!!! Помогите решить эту задачу
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,981
Я обновил плагин на AlliedModders. Заодно добавил функционал, что ты тут просишь.

Попробуй как работает: я серверами КС:ГО больше заниматься не планирую и проверять плагины для них мне не на чем.
Единственное, что я могу проверить: компилируется плагин или нет.
 

Похожие темы

Сверху Снизу