вопрос по валидности и оптимизации кода

Тема в разделе "Программирование / Скриптинг", создана пользователем Danyas, 11 июн 2015.

  1. Danyas

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

    Сообщения:
    1.715
    Симпатии:
    452
    PHP:
    #include <sdktools>
    public Plugin:myinfo = {name    "WeaponSpawn",author    "Danyas"};
    new 
    g_SteamSprite;
    public 
    OnPluginStart()
    {    
    decl String:map[16];GetCurrentMap(map,16);
        if (
    StrEqual(map"35hp_2_remake"))    {HookEvent("round_start"round_start);}
        else {
    SetFailState("Invalid Map. Unloading."); decl String:fn[256]; GetPluginFilename(INVALID_HANDLEfnsizeof(fn)); ServerCommand("sm plugins unload %s"fn);}
    }

    public 
    OnMapStart()
    {
        
    g_SteamSprite PrecacheModel("sprites/steam1.vmt");
    }

    public 
    round_start(Handle:event, const String:name[], bool:dontBroadcast)
    {
    new 
    weapon,randomint GetRandomInt(0,6);
    if (
    randomint == 0weapon CreateEntityByName("weapon_ak47");
    else if (
    randomint == 1weapon CreateEntityByName("weapon_m4a1");
    else if (
    randomint == 2weapon CreateEntityByName("weapon_deagle");
    else if (
    randomint == 3weapon CreateEntityByName("weapon_awp");
    else if (
    randomint == 4weapon CreateEntityByName("weapon_scout");
    else if (
    randomint == 5weapon CreateEntityByName("weapon_m249");
    else 
    weapon CreateEntityByName("weapon_m3");
    new 
    Float:pos[3]; pos[0] = -300.86pos[1] = 545.63pos[2] = 276.22;
    TeleportEntity(weaponposNULL_VECTORNULL_VECTOR);
    DispatchSpawn(weapon);SetEntityMoveType(weaponMOVETYPE_NONE);
    SetEntityRenderColor(weaponGetRandomInt(0,250), GetRandomInt(0,250), GetRandomInt(0,250), GetRandomInt(128,250));
    SetEntityRenderFx(weaponRENDERFX_DISTORT);
    CreateTimer(GetRandomFloat(0.110.0), weaponfx_TIMER_REPEAT);
    }
    public 
    Action:weaponfx (Handle:timer)
    {
    new 
    Float:pos[3]; pos[0] = -300.86pos[1] = 545.63pos[2] = GetRandomFloat(270.0,300.0);
    TE_SetupSparks(posposGetRandomInt(10,100), GetRandomInt(100,1000))
    TE_SetupSmoke(posg_SteamSpriteGetRandomFloat(3.0,7.0), GetRandomInt(5,15));
    TE_SetupDust(pos,pos,GetRandomFloat(50.0,500.0),GetRandomFloat(1.0,50.0));
    TE_SetupEnergySplash(pospostrue);
    TE_SendToAll();
    }

    Интересует больше всего часть с рандомным оружием
     
  2. Саша Шеин

    Саша Шеин

    Сообщения:
    1.259
    Симпатии:
    191
    Может лучше через switch?
     
    Danyas нравится это.
  3. artyrka94

    artyrka94

    Сообщения:
    182
    Симпатии:
    36
    я бы вот это
    PHP:
    public round_start(Handle:event, const String:name[], bool:dontBroadcast

    new 
    weapon,randomint GetRandomInt(0,6); 
    if (
    randomint == 0weapon CreateEntityByName("weapon_ak47"); 
    else if (
    randomint == 1weapon CreateEntityByName("weapon_m4a1"); 
    else if (
    randomint == 2weapon CreateEntityByName("weapon_deagle"); 
    else if (
    randomint == 3weapon CreateEntityByName("weapon_awp"); 
    else if (
    randomint == 4weapon CreateEntityByName("weapon_scout"); 
    else if (
    randomint == 5weapon CreateEntityByName("weapon_m249"); 
    else 
    weapon CreateEntityByName("weapon_m3"); 
    заменил на
    PHP:
    new String:wid[7][] = {"weapon_ak47","weapon_m4a1","weapon_deagle","weapon_awp","weapon_scout","weapon_m249""weapon_m3"};
    public 
    round_start(Handle:event, const String:name[], bool:dontBroadcast

        new 
    weapon CreateEntityByName(wid[GetRandomInt(0,6)]);
     
    Danyas нравится это.
  4. AlmazON

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

    Сообщения:
    4.511
    Симпатии:
    1.963
    Бесполезный код. После SetFailState плагин ставится на паузу и весь код ниже не выполняется.
    Тогда бы сразу:
    PHP:
    new Float:pos[3] = {-300.86545.63GetRandomFloat(270.0,300.0)};
    Но лучше через decl.
    Я бы немного не так сделал. Слишком много памяти требует. Особенно, если используются почти все виды оружия (и даже хранятся глобально).
     
    Danyas нравится это.
  5. gibs

    gibs Фитиль народного волненья

    Сообщения:
    536
    Симпатии:
    133
    Фейл стейт не ставь, если ты ставишь фейл стейт то плагин автоматом выгружается с ошибкой, и твой "sm plugins unload" все-равно не сработает. Проверку названия карты делай при старте карты, это как-то логичней. Используй свич. Если при объявлении не присваиваешь переменной значение, то используй decl. Оператор decl создает переменную в уже выделенной памяти, а не выделяет её для новой переменной в отличии от оператора new.
    А так в принципе делай ударение на читаемость, чтобы всё было красивенько. Делай отступы.
     
    Danyas нравится это.
  6. Danyas

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

    Сообщения:
    1.715
    Симпатии:
    452
    PHP:
    #include <sdktools>
    public Plugin:myinfo = {name    "WeaponSpawn",author    "Danyas"};
    new 
    g_SteamSprite;

    public 
    OnMapStart()
    {
        
    g_SteamSprite PrecacheModel("sprites/steam1.vmt");
        
    decl String:map[16];GetCurrentMap(map,16);
        if (
    StrEqual(map"35hp_2_remake"))
        {
            
    HookEvent("round_start"round_start);
        }
        else
        {
            
    decl String:fn[16];
            
    GetPluginFilename(INVALID_HANDLEfnsizeof(fn));
            
    ServerCommand("sm plugins unload %s"fn);
        }

    }

    public 
    round_start(Handle:event, const String:name[], bool:dontBroadcast)
    {
        
    decl Float:pos[3],weapon
        new 
    randomint GetRandomInt(0,6);
        
        switch (
    randomint)
        {
            case 
    0:{weapon CreateEntityByName("weapon_ak47");}
            case 
    1:{weapon CreateEntityByName("weapon_m4a1");}
            case 
    2:{weapon CreateEntityByName("weapon_deagle");}
            case 
    3:{weapon CreateEntityByName("weapon_awp");}
            case 
    4:{weapon CreateEntityByName("weapon_scout");}
            case 
    5:{weapon CreateEntityByName("weapon_m249");}
            case 
    6:{weapon CreateEntityByName("weapon_m3");}
        }

        
    pos[0] = -300.86pos[1] = 545.63pos[2] = 276.22;

        
    TeleportEntity(weaponposNULL_VECTORNULL_VECTOR);
        
    DispatchSpawn(weapon);
        
    SetEntityMoveType(weaponMOVETYPE_NONE);
        
    SetEntityRenderColor(weaponGetRandomInt(0,250), GetRandomInt(0,250), GetRandomInt(0,250), GetRandomInt(128,250));
        
    SetEntityRenderFx(weaponRENDERFX_DISTORT);
        
    CreateTimer(GetRandomFloat(0.110.0), weaponfx_TIMER_REPEAT);
    }
    public 
    Action:weaponfx (Handle:timer)
    {
        
    decl Float:pos[3];
        
    pos[0] = -300.86pos[1] = 545.63pos[2] = GetRandomFloat(270.0,300.0);
        
    TE_SetupSparks(posposGetRandomInt(10,100), GetRandomInt(100,1000))
        
    TE_SetupSmoke(posg_SteamSpriteGetRandomFloat(3.0,7.0), GetRandomInt(5,15));
        
    TE_SetupDust(pos,pos,GetRandomFloat(50.0,500.0),GetRandomFloat(1.0,50.0));
        
    TE_SetupEnergySplash(pospostrue);
        
    TE_SendToAll();
    }
    Тогда как-то так.

    А как с 45-й строки (таймер) передать pos[3] в таймер?
    Можно как-то без data-pack'a сделать?
     
  7. AlmazON

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

    Сообщения:
    4.511
    Симпатии:
    1.963
    Danyas, как полностью отключить плагин без выдачи ошибки SetFailState, использования лишь старые переменные (полная экономия памяти):
    PHP:
    public OnMapStart() 

        
    decl String:map[15];GetCurrentMap(map,15);
        if (
    strcmp(map"35hp_2_remake"))
        {
            if (
    g_SteamSprite)
            {
                
    UnhookEvent("round_start"round_startEventHookMode_PostNoCopy);
                
    g_SteamSprite 0;
            }
        }
        else
        {
            if (
    g_SteamSprite == 0HookEvent("round_start"round_startEventHookMode_PostNoCopy);
            
    g_SteamSprite PrecacheModel("sprites/steam1.vmt");
        }
    }
    Таймер будет бесконечный в данном случае (и с каждой картой - ещё один). Нужно хотя бы добавить флаг TIMER_FLAG_NO_MAPCHANGE.
    Хранить массив глобально. Для возможно столь частого таймера (0.1 сек в повторении) - это даже оптимальнее.
     
    Danyas нравится это.
  8. Danyas

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

    Сообщения:
    1.715
    Симпатии:
    452
    Будет ли от этого смысл при константах?
     
  9. AlmazON

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

    Сообщения:
    4.511
    Симпатии:
    1.963
    PHP:
    #define TIMER_POSITION {-300.86, 545.63, 276.22}
    То же самое в лучшем виде.
     
    Danyas нравится это.
  10. R1KO

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

    Сообщения:
    5.972
    Симпатии:
    2.978
    насколько я помню юзать нужно будет так:
    PHP:
    Float:TIMER_POSITION
    или
    PHP:
    #define TIMER_POSITION Float:{-300.86, 545.63, 276.22}
     
    Danyas и AlmazON нравится это.
  11. Danyas

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

    Сообщения:
    1.715
    Симпатии:
    452
    PHP:
    #define pos Float:{-300.86, 545.63, 276.22}  
    На данный момент код выглядит так
    PHP:
    #include <sdktools>
    public Plugin:myinfo = {name    "WeaponSpawn",author    "Danyas"};
    new 
    g_SteamSprite;
    #define pos Float:{-300.86, 545.63, 276.22}  
    public OnMapStart()
    {
        
    g_SteamSprite PrecacheModel("sprites/steam1.vmt");
        
    decl String:map[16];GetCurrentMap(map,16);
        if (
    StrEqual(map"35hp_2_remake"))
        {
            
    HookEvent("round_start"round_start);
        }
        else
        {
            
    decl String:fn[16];
            
    GetPluginFilename(INVALID_HANDLEfnsizeof(fn));
            
    ServerCommand("sm plugins unload %s"fn);
        }

    }

    public 
    round_start(Handle:event, const String:name[], bool:dontBroadcast)
    {
        
    decl weapon
        new 
    randomint GetRandomInt(0,6);
        
        switch (
    randomint)
        {
            case 
    0:{weapon CreateEntityByName("weapon_ak47");}
            case 
    1:{weapon CreateEntityByName("weapon_m4a1");}
            case 
    2:{weapon CreateEntityByName("weapon_deagle");}
            case 
    3:{weapon CreateEntityByName("weapon_awp");}
            case 
    4:{weapon CreateEntityByName("weapon_scout");}
            case 
    5:{weapon CreateEntityByName("weapon_m249");}
            case 
    6:{weapon CreateEntityByName("weapon_m3");}
        }


        
    TeleportEntity(weaponposNULL_VECTORNULL_VECTOR);
        
    DispatchSpawn(weapon);
        
    SetEntityMoveType(weaponMOVETYPE_NONE);
        
    SetEntityRenderColor(weaponGetRandomInt(0,250), GetRandomInt(0,250), GetRandomInt(0,250), GetRandomInt(128,250));
        
    SetEntityRenderFx(weaponRENDERFX_DISTORT);
        
    CreateTimer(GetRandomFloat(0.110.0), weaponfx_TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
    }
    public 
    Action:weaponfx (Handle:timer)
    {
        
    TE_SetupSparks(posposGetRandomInt(10,100), GetRandomInt(100,1000))
        
    TE_SetupSmoke(posg_SteamSpriteGetRandomFloat(3.0,7.0), GetRandomInt(5,15));
        
    TE_SetupDust(pos,pos,GetRandomFloat(50.0,500.0),GetRandomFloat(1.0,50.0));
        
    TE_SetupEnergySplash(pospostrue);
        
    TE_SendToAll();
    }

    Неа, не определил почему-то.
     
  12. R1KO

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

    Сообщения:
    5.972
    Симпатии:
    2.978
    А ты проверь))
    String: мы не ставим потому что компилятор уже подразумевает что то что в кавычках это строка:
    StringToInt("145");
    Тут же String: не пишем.
    А у массива тип не флоат, хотя внутри него как раз так. Поэтому нужно на сам массив присваивать тип.
     
  13. R1KO

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

    Сообщения:
    5.972
    Симпатии:
    2.978
    так сделай
     
  14. AlmazON

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

    Сообщения:
    4.511
    Симпатии:
    1.963
    Работает, но не так. Для PrintToServer, например, действует - отобразил первое Float значение.
     
  15. R1KO

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

    Сообщения:
    5.972
    Симпатии:
    2.978
    AlmazON, но при компиляции выдает несоответстиве тегов
     
  16. Danyas

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

    Сообщения:
    1.715
    Симпатии:
    452
    Я ж его специально в свич сделал, как посоветовали :(
     
  17. Александр Смирнов 8452246

    Александр Смирнов 8452246

    Сообщения:
    150
    Симпатии:
    28
    StrEqual старайся не использовать. Замени на strcmp.
     
  18. AlmazON

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

    Сообщения:
    4.511
    Симпатии:
    1.963
    Слишком много повторения кода, его нативов - это тоже плохо. Если жалко глобальную память, сделай хотя бы в decl:
    PHP:
    decl String:wid[][] = {"weapon_ak47","weapon_m4a1","weapon_deagle""weapon_awp","weapon_scout","weapon_m249","weapon_m3"};
    Оффтоп
     
  19. Danyas

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

    Сообщения:
    1.715
    Симпатии:
    452
    Сделал глобально.

    Оффтоп
     
  20. AlmazON

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

    Сообщения:
    4.511
    Симпатии:
    1.963
    Можно в массивах. Если значение явное, известно заранее (как бы константа):
    PHP:
    decl i[2] = {04}; //ВЕРНО.
    Присваивать переменную - нельзя:
    PHP:
    new ab;
    decl i[2] = {ab}; //НЕПРАВИЛЬНО.
     
    Последнее редактирование: 11 июн 2015
    Danyas нравится это.