[CS: Source] TwoWeapons

Тема в разделе "Новые плагины", создана пользователем Scarface_slv, 21 окт 2015.

  1. Scarface_slv

    Scarface_slv

    Сообщения:
    228
    Симпатии:
    47
    Two Guns

    С данным плагином игроки смогут носить два оружия в одном слоте.
    Awp и m4a1 или usp и deagle в случае с пистолетами. Писал на v34


    Пример использования:
    Например покупаем m4a1, снова заходим в закупку и покупаем awp, затем переключаем между ними на клавишу "E".

    Переменные:
    sm_twoguns_adminflag "z" - администратору с каким флагом можно купить два оружия?
    По умолчанию могут пользоваться все игроки.


    sm_twoguns_slot 1 - Какие виды оружий можно носить по два? Только автоматы - 1. Только пистолеты -2. Обо вида - 0.
    По умолчанию разрешены оба вида оружий.

    Переменные можно добавить например в server.cfg
     

    Вложения:

    • Two Guns.rar
      Размер файла:
      11,2 КБ
      Просмотров:
      24
    Последнее редактирование: 4 мар 2016
  2. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.719
    Симпатии:
    459
    PHP:
    public OnGameFrame()
    {
        
    decl String:sWeapon[20], String:sClientWeapon[20], iWeaponiSlot
        for(new 
    1<= MaxClientsi++)
        {
            if(
    g_bAdminOn[i] && IsClientInGame(i) && IsPlayerAlive(i))
            {
                if(
    GetClientButtons(i) & BUTTONS
                {
                            
    // --// 
                
    }
                else 
    g_bReload[i] = false;
            }
        }
    }
    Данный код есть смысл заменить на такой:

    PHP:
    public Action:OnPlayerRunCmd(client, &buttons, &impulseFloat:vel[3], Float:angles[3], &weapon)
    {
        
    decl String:sWeapon[20], String:sClientWeapon[20], iWeaponiSlot;
        if(
    g_bAdminOn[client] && IsClientInGame(client) && IsPlayerAlive(client))
        {
            if(
    buttons IN_USE)
            {
                 
    // --// 
            
    }
            else 
    g_bReload[client] = false;
        }
    }
    Я не думаю что тут стоит использовать OnGameFrame (+ цикл по всем игрокам на проверки), в плане оптимизации OnPlayerRunCmd будет намного выгодней.
     
  3. Scarface_slv

    Scarface_slv

    Сообщения:
    228
    Симпатии:
    47
    Danyas, Спасибо
     
  4. vaxa

    vaxa Rock Rulet!

    Сообщения:
    859
    Симпатии:
    102
    Scarface_slv,
    if(g_bAdminOn[client] && IsClientInGame(client) && IsPlayerAlive(client))
     
  5. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.994
    Симпатии:
    2.989
    PHP:
    public OnClientPostAdminCheck(clientg_bAdminOn[client] = CheckAdmin(client);
    PHP:
    bool:CheckAdmin(client)
    {
        
    decl String:sFlag[3];sFlag[0] = '\0';
        
    GetConVarString(g_hFlagsFlagsizeof(sFlag));
        if(
    sFlag[0] != '\0')
        {
            new 
    AdminId:AdminID GetUserAdmin(client);
            if(
    AdminID != INVALID_ADMIN_ID)
            {
                new 
    AdminFlag:flag;
                if(
    FindFlagByChar(sFlag[0], flag) && GetAdminFlag(AdminIDflag)) return true;
            }
            return 
    false;
        }
        return 
    true;
    }
    Ф-я бул, а переменная g_bAdminOn int хотя называется как бул.

    stock тут нигде не нужны.

    PHP:
    decl String:sFlag[3];sFlag[0] = '\0';
        
    GetConVarString(g_hFlagsFlagsizeof(sFlag));
        if(
    sFlag[0] != '\0')
        {
            new 
    AdminId:AdminID GetUserAdmin(client);
            if(
    AdminID != INVALID_ADMIN_ID)
            {
                new 
    AdminFlag:flag;
                if(
    FindFlagByChar(sFlag[0], flag) && GetAdminFlag(AdminIDflag)) return true;
            }
            return 
    false;
        }
    Это можно заменить на:
    PHP:
    bool:CheckAdmin(client)
    {
        
    decl String:sFlag[3], iFlag;
        
    GetConVarString(g_hFlagsFlagsizeof(sFlag));
        
    iFlag ReadFlagString(sFlag);

        return 
    CheckCommandAccess(client"TwoWeapons"iFlag);
    }
    И то
    PHP:
    decl String:sFlag[3], iFlag;
        
    GetConVarString(g_hFlagsFlagsizeof(sFlag));
        
    iFlag ReadFlagString(sFlag);
    Можно делать только 2 раза при смене квара и при получении дефолт значения.

    ЛОгику не смотрел.

    лучше static
     
  6. Scarface_slv

    Scarface_slv

    Сообщения:
    228
    Симпатии:
    47
    Всем спасибо, пойду исправлю)
     
  7. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.719
    Симпатии:
    459
    OnGameFrame - идет исполнение данной функции 66 раз в секунду (равен тикрейту).
    OnPlayerRunCmd - идет исполнение данной функции только при нажатии клиентом на клавишу.

    Т.е. в OnGameFrame ты 66 раз в секунду проверяешь 65 игроков на
    PHP:
    g_bAdminOn[i] && IsClientInGame(i) && IsPlayerAlive(i)
    А потом в тех, которые проверенные проверяешь еще нажатую кнопку.

    В OnPlayerRunCmd ты проверяешь при нажатии любой клавиши у клиента (что в любом случае меньше 66-и)
    PHP:
    g_bAdminOn[i] && IsClientInGame(i) && IsPlayerAlive(i)
    по ОДНОМУ игроку и с самого действия берешь buttons
    public Action:OnPlayerRunCmd(client, &buttons, &impulse, Float:vel[3], Float:angles[3], &weapon)

    Оффтоп
     
  8. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.540
    Симпатии:
    1.984
    Такое вообще должно быть 1 проверкой int/bool для частых обратных вызовов, используя событие спавна и смерти, возможно отключения.
     
  9. Scarface_slv

    Scarface_slv

    Сообщения:
    228
    Симпатии:
    47
    Вроде исправил все
    Но почему?
     
  10. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.540
    Симпатии:
    1.984
    Код:
    decl String:sFlag[[B]3[/B]];
    Почему? А если захочется указать более 2 флагов? У тебя должно быть места на все флаги.
    PHP:
    public OnConVarChange(Handle:convar, const String:oldValue[], const String:newValue[])
    {
        
    decl String:sFlag[3]; 
        
    GetConVarString(g_hFlagsFlagsizeof(sFlag)); 
        
    g_iFlag ReadFlagString(sFlag);  
    }
    Тебе и так приходит строка - её и читай, заодно экономия памяти на Handle.
    PHP:
    FormatEx(sWeapon20"weapon_%s"weapon); 
    А надо?
    PHP:
    SetTrieValue(g_hTrie,    "weapon_glock",    1);
    Расписал бы без weapon_ - столько памяти сэкономил, да и проц спасибо сказал.
    Код:
    if (!GetTrieValue(g_hTrie, sClientWeapon[B][7][/B], iSlot))
    Тогда бы дальше так сравнивал и всё.
    Опять же, для часто вызываемых функций лучше сразу всё создать и далее просто пользоваться. Т.е. выделяем память лишь 1 раз, а далее просто записываем в неё.
     
  11. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.994
    Симпатии:
    2.989
    Scarface_slv, короче decl создает переменные каждый раз, а static создает их 1 раз и хранит их значение при повторном вызове ф-и. Тоесть по сути это глобальная переменная но видна только в пределах этой ф-и (как локальная)
     
  12. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.719
    Симпатии:
    459
    PHP:
        if(IsClientInGame(client) && IsPlayerAlive(client) && CheckCommandAccess(client"TwoWeapons"g_iFlag))
        {
            if(
    buttons BUTTONS
            { 
    Почему бы не сделать одним ифом и не перенести проверку кнопки на перед?
    В данном случае имеет смысл проверять сначала кнопку, а потом только всё остальное.
    Почему? А потому что в OnGameFrame ты проверяешь всех игроков циклом, а тут только одного. Выиграш в производительности будет

    PHP:
        if(buttons BUTTONS && IsPlayerAlive(client) && CheckCommandAccess(client"TwoWeapons"g_iFlag) && IsClientInGame(client))
        {
     
  13. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.540
    Симпатии:
    1.984
    Если последнее там нужно, то менять местами нельзя.
     
  14. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.719
    Симпатии:
    459
    Тогда так:
    PHP:
    if(buttons BUTTONS && IsClientInGame(client) && IsPlayerAlive(client) && CheckCommandAccess(client"TwoWeapons"g_iFlag))
     
  15. September

    September

    Сообщения:
    1.187
    Симпатии:
    164
  16. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.994
    Симпатии:
    2.989
    Danyas, согласен. Так быстрее но CheckCommandAccess(client, "TwoWeapons", g_iFlag) лучше в bool хранить. А то получать это в OnPlayerRunCmd не очень то хорошо
     
  17. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.540
    Симпатии:
    1.984
    Оффтоп
     
  18. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.994
    Симпатии:
    2.989
    Оффтоп
     
  19. Scarface_slv

    Scarface_slv

    Сообщения:
    228
    Симпатии:
    47
    Но в OnPlayerRunCmd есть GivePlayerItem(client, sWeapon) и тогда придется там делать FormatEx
    Остальное вроде поправил все, всем спасибо)
     
  20. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.540
    Симпатии:
    1.984
    PHP:
    static String:sWeapon[20] = "weapon_";
    DeleteWeaponClient(clientiWeaponiSlottrue);
    GetArrayString(g_hArray[client][iSlot], 0sWeapon[7], 20);
    Без проблем, оптимизация приблизительно та же в этой функции. Итоговая - достаточна ощутима относительно плагина.