Новый парашют

Тема в разделе "Программирование / Скриптинг", создана пользователем R1KO, 5 окт 2013.

  1. R1KO

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

    Сообщения:
    5.970
    Симпатии:
    2.977
    Мне не понравилось, что парашют юзает OnGameFrame. Решил попробывать сделать через OnPlayerRunCmd.

    Кому не сложно протестируйте и отпишитесь.

    http://hlmod.ru/forum/showpost.php?p=142288&postcount=6
     
    Последнее редактирование: 7 фев 2014
    pokypka20, Webman, acik и ещё 1-му нравится это.
  2. acik

    acik

    Сообщения:
    734
    Симпатии:
    628
    R1KO, я смотрю ты запретил после прыжка использовать, но вот если кто нибудь с большой высоты под прыгнит и нажмет Е, а ему фига) будет весело вроде нормально но он без модели
     
  3. R1KO

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

    Сообщения:
    5.970
    Симпатии:
    2.977
    Где ?)


    Если всё будет норм - тогда попробую прикрутить.
     
    pokypka20 нравится это.
  4. acik

    acik

    Сообщения:
    734
    Симпатии:
    628
    R1KO, не знаю но он дает после прыжка использовать только с какой ерунды сваливаться
     
    anderson15 нравится это.
  5. R1KO

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

    Сообщения:
    5.970
    Симпатии:
    2.977
    acik, тоже это заметил, думаю как исправить
     
    pokypka20 нравится это.
  6. R1KO

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

    Сообщения:
    5.970
    Симпатии:
    2.977
    В общем это работает:
    PHP:
    #include <sourcemod>
    #include <sdktools>
    #pragma semicolon 1

    public Action:OnPlayerRunCmd(client, &buttons, &impulseFloat:vel[3], Float:angles[3], &weapon)
    {
        if (
    IsPlayerAlive(client))
        {
            static 
    bool:g_InUse[MAXPLAYERS+1];
            if(!
    g_InUse[client] && (buttons IN_USE) && !(GetEntityFlags(client) & FL_ONGROUND))
            {
                
    SetEntityGravity(client0.1);
                
    g_InUse[client] = true;
            }
            else if (!(
    buttons IN_USE) && g_InUse[client])
            {
                
    SetEntityGravity(client1.0);
                
    g_InUse[client] = false;
            }
        }
        return 
    Plugin_Continue;
    }
    НО если зажать пробел и E, то улетаешь в прямом смысле слова, тоесть грава становится 0,1.
    Вопрос к скриптерам: как это исправить?

    Такой способ ничего не дал:
    PHP:
    #include <sourcemod>
    #include <sdktools>
    #pragma semicolon 1

    new g_iVelocity = -1;

    public 
    OnPluginStart() g_iVelocity FindSendPropOffs("CBasePlayer""m_vecVelocity[0]");

    public 
    Action:OnPlayerRunCmd(client, &buttons, &impulseFloat:vel[3], Float:angles[3], &weapon)
    {
        if (
    IsPlayerAlive(client))
        {
            static 
    bool:g_InUse[MAXPLAYERS+1];
            if(!
    g_InUse[client] && (buttons IN_USE) && !(GetEntityFlags(client) & FL_ONGROUND))
            {
                
    decl Float:fVelocity[3];
                
    GetEntDataVector(clientg_iVelocityfVelocity);
                if(
    fVelocity[2] < 0.0)
                {
                    
    fVelocity[2] = (fVelocity[2] >= -100.0) ? -100.0:(fVelocity[2] +50.0);
                    
    TeleportEntity(clientNULL_VECTORNULL_VECTORfVelocity);
                    
    SetEntDataVector(clientg_iVelocityfVelocity);
                    
    SetEntityGravity(client0.1);
                    
    g_InUse[client] = true;
                }
            }
            else if (!(
    buttons IN_USE) && g_InUse[client])
            {
                
    SetEntityGravity(client1.0);
                
    g_InUse[client] = false;
            }
        }
        return 
    Plugin_Continue;
    }
     
    pokypka20 нравится это.
  7. Webman

    Webman Developer

    Сообщения:
    702
    Симпатии:
    182
    Оффтоп
     
  8. R1KO

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

    Сообщения:
    5.970
    Симпатии:
    2.977
    Webman, он вызывается 66 раз в секунду. Мне не нравится 66 раз в секунду проверять не зажата ли кнопка у каждого игрока
     
    pokypka20 нравится это.
  9. NagarD

    NagarD

    Сообщения:
    412
    Симпатии:
    170
    удаляй флаг пробела при нажатой Е \и если игрок не на земле buttons &= ~IN_ПРОБЕЛ
    OnPlayerRunCmd тоже 66 раз в сек вызывается
     
  10. R1KO

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

    Сообщения:
    5.970
    Симпатии:
    2.977
    NagarD, нет вроде
     
    pokypka20 нравится это.
  11. R1KO

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

    Сообщения:
    5.970
    Симпатии:
    2.977
    pokypka20 нравится это.
  12. FrozDark

    FrozDark Команда сайта HLMod Модератор

    Сообщения:
    1.761
    Симпатии:
    1.914
    vel[2] <= 0.0
     
  13. Черная вдова

    Черная вдова

    Сообщения:
    1.621
    Симпатии:
    234
    Оффтоп
     
  14. R1KO

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

    Сообщения:
    5.970
    Симпатии:
    2.977
    FrozDark,
    Если ты имел ввиду тут:
    PHP:
    if(fVelocity[2] <= 0.0// тут
                
    {
                    
    fVelocity[2] = (fVelocity[2] >= -100.0) ? -100.0:(fVelocity[2] +50.0);
                    
    TeleportEntity(clientNULL_VECTORNULL_VECTORfVelocity);
                    
    SetEntDataVector(clientg_iVelocityfVelocity);
                    
    SetEntityGravity(client0.1);
                    
    g_InUse[client] = true;
                }
    То не помогло
     
    pokypka20 нравится это.
  15. R1KO

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

    Сообщения:
    5.970
    Симпатии:
    2.977
    Minus, работает)
    Но мне кажется
    PHP:
    if (IsPlayerAlive(client)) 
        { 
            static 
    bool:g_InUse[MAXPLAYERS+1]; 
            
    decl Float:fVelocity[3]; // постоянно создаем эту переменную ...
            
    GetEntDataVector(clientg_iVelocityfVelocity); // и это делаем постоянно хотя должны только когда нажата Е
            
    if(!g_InUse[client] && (buttons IN_USE) && !(GetEntityFlags(client) & FL_ONGROUND)) 
            { 
                if(
    fVelocity[2] < 0.0
                { 
                    
    fVelocity[2] = (fVelocity[2] >= -100.0) ? -100.0:(fVelocity[2] +50.0); 
                    
    TeleportEntity(clientNULL_VECTORNULL_VECTORfVelocity); 
                    
    SetEntDataVector(clientg_iVelocityfVelocity); 
                    
    SetEntityGravity(client0.1); 
                    
    g_InUse[client] = true
                } 
            } 
            else if (!(
    buttons IN_USE) && g_InUse[client]) 
            { 
                
    SetEntityGravity(client1.0); 
                
    g_InUse[client] = false
            } 
            else if(
    fVelocity[2] >= 0.0SetEntityGravity(client1.0); 
        }
     
    pokypka20 нравится это.
  16. Monroe

    Monroe

    Сообщения:
    25
    Симпатии:
    35
    PHP:
    #include <sourcemod>
    #include <sdktools>
    #pragma semicolon 1

    new g_iVelocity = -1;

    public 
    OnPluginStart() g_iVelocity FindSendPropOffs("CBasePlayer""m_vecVelocity[0]");

    public 
    Action:OnPlayerRunCmd(client, &buttons, &impulseFloat:vel[3], Float:angles[3], &weapon)
    {
        if (
    IsPlayerAlive(client))
        {
            static 
    bool:g_InUse[MAXPLAYERS+1], Float:fVelocity[MAXPLAYERS+1][3];
            
    GetEntDataVector(clientg_iVelocityfVelocity[client]); //Что в этом страшного? (сама функция передает Velocity столько же раз, только в другой плоскости)
            
    if(!g_InUse[client] && (buttons IN_USE) && !(GetEntityFlags(client) & FL_ONGROUND))
            {
                if(
    fVelocity[client][2] < 0.0)
                {
                    
    fVelocity[client][2] = (fVelocity[client][2] >= -100.0) ? -100.0:(fVelocity[client][2] +50.0);
                    
    TeleportEntity(clientNULL_VECTORNULL_VECTORfVelocity[client]);
                    
    SetEntDataVector(clientg_iVelocityfVelocity[client]);
                    
    SetEntityGravity(client0.1);
                    
    g_InUse[client] = true;
                }
            }
            else if (!(
    buttons IN_USE) && g_InUse[client])
            {
                
    SetEntityGravity(client1.0);
                
    g_InUse[client] = false;
            }
            else if(
    fVelocity[client][2] >= 0.0SetEntityGravity(client1.0);
        }
        return 
    Plugin_Continue;
    }
     
    R1KO нравится это.
  17. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    зачем так?

    достаточно объявлять new Float:fVelocity[3];
    тоже самое с bool:g_InUse;

    это же локальные переменные.
     
  18. Monroe

    Monroe

    Сообщения:
    25
    Симпатии:
    35
    static инициализируется только один раз. Если делать, как ты говоришь, то нужно объявлять переменные глобально, чтобы не объявлять ее, например, 66 раз в секунду, а зачем объявлять их глобально, если они больше не используются.
     
  19. R1KO

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

    Сообщения:
    5.970
    Симпатии:
    2.977
    Minus, для этого нужен static
     
    Последнее редактирование: 26 фев 2014
    pokypka20 нравится это.
  20. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    Minus, да, ссори, перепутал.