Написание плагинов. Жизненно ли?

Тема в разделе "Всякое", создана пользователем Danyas, 24 янв 2015.

  1. Danyas

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

    Сообщения:
    1.729
    Симпатии:
    461
    Сидишь такой, глаза слипаются, пытаешься понять то что сам и написал.
    Жмешь F9 а тебе - " error 029: invalid expression, assumed zero"
    [​IMG]
    Смотришь в код, минуту, пять минут, двадцать минут.
    И ПОНИМАЕШЬ ЧТО ТЫ ПРОСТО ЗАБЫЛ ПОСТАВИТЬ СКОБКУ :angry2:
    :sad:
     
    Chaos_Engine нравится это.
  2. AlmazON

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

    Сообщения:
    4.587
    Симпатии:
    1.995
    Может убрать? Спереди то явно лишняя из 2.
    А ты Notepad++ пробовал? Там "подсветка" для скобок есть.
    Оффтоп
     
    Chaos_Engine и Danyas нравится это.
  3. Danyas

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

    Сообщения:
    1.729
    Симпатии:
    461
    То есть можно писать так?
    PHP:
    if IsClientValid(client) && !IsFakeClient(cleint)
    {
         
    //some trash
    }
    Без него бы наверное час проблему искал :-D

    Все ошибки которые я знаю можно пересчитать на пальцах двух рук :(
     
  4. AlmazON

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

    Сообщения:
    4.587
    Симпатии:
    1.995
    Нет. Посмотри на свой же скриншот - у тебя там 2 скобки стоит, хотя должна быть 1. Вот и требует ещё одну лишнюю для закрытия.
     
  5. Danyas

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

    Сообщения:
    1.729
    Симпатии:
    461
    Дошло, говорю же - я сонный :acute:
     
  6. AlmazON

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

    Сообщения:
    4.587
    Симпатии:
    1.995
    Наконец-то. :-D
    Добавляй уже пальцы на ногах:
    /+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/
    Список ошибок компиляции:
    -----------------------------------------------------------------------------------------------------------------------------------------------------------------

    "warning 200: symbol "%s" is truncated to 31 characters"

    "Предупреждение 200: переменная "%s" ограничивается 31 символами"; при создании переменной введено больше 31 символа.

    new sssssssssssssssssssssssssssssss;

    Решение - сменить название или укоротить.

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------

    "warning 201: redefinition of constant/macro"

    "Предупреждение 201: переопределение константы/макро"; двойное определение одинаковой константы define.

    #define OnPlayerEnterRaceCheckpoint
    #define OnPlayerEnterRaceCheckpoint

    Решение - удалить одну любую строчку.

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------

    "warning 202: number of arguments does not match definition"

    "Предупреждение 202: количество аргументов не соответствует определению"; не совпадают аргументы.

    Create3DTextLabel("Текст.",0xFFA500FF,.0120,456.2717,35.1719,20.0);

    Решение:
    -2041.0120,456.2717,35.1719,20.0
    -2041.0120,456.2717,35.1719 <- это наша координата (она нас не интересует);
    20.0 <- вот наша ошибка (20 - это расстояние, с которого наш текст будет виден);
    А вот 0 <- это у нас testLOS - линия видимости.

    Нам 0 нужно заменить на 1:

    Create3DTextLabel("Текст.",0xFFA500FF,1111.1111,111.1111,11.1111,20.1);

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------

    "warning 203: symbol is never used: %s"

    "Предупреждение 203: данный символ нигде не используется: %s".

    new respon;

    (2378) warning 203: symbol is never used: "respon"
    Решение - найти эту переменную и удалить.

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------

    "warning 204: symbol is assigned a value that is never used %s"

    "Предупреждение 204: символу %s присваивается значение, которое нигде не использовалось"; создана переменная и массив, а она нигде не используется.

    new babai[15];

    Решение - просто удалить.

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------

    "warning 209: function "%s" should return a value"

    "Предупреждение 209: функция "%s" должна возвращать значение"; функция не возвращается (простыми словами: нет return 1; или return 0;).

    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if (newkeys == 1024)
    {
    OnPlayerCommandText(playerid,"/Blablabal");
    return 1; <--- вот наш return ДО.
    }
    }

    Решение:

    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if (newkeys == 1024)
    {
    OnPlayerCommandText(playerid,"/Blablabal");
    }
    return 1; <--- вот наш return ПОСЛЕ.
    }

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------

    "warning 213: tag mismatch"

    "Предупреждение 213: несоответствие тегов"; несовпадение аргументов.

    #define CreateObject CreateDynamicObject
    #define MoveObject MoveDynamicObject

    Решение:

    #define CreateObject, CreateDynamicObject
    #define MoveObject, MoveDynamicObject

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------

    "warning 216: nested comment"

    "Предупреждение 216: вложенные комментарии"; неправильная запись комментария.

    /*case 58: //Fire&lvl

    Решение:

    case 58: //Fire&lvl

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------

    "warning 217: loose indentation"

    "Предупреждение 217: свободный (неправильный) отступ"; невыровненная строка - код не табулирован (не построен лесенкой).

    Решение - выровнять всё вручную или поставить:

    #pragma tabsize 0

    pragma tabsize - просто маскирует warning и не более.

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------

    "warning 219: local variable "%s" shadows a variable at a preceding level"

    "Предупреждение 219: локальная переменная "%s" уже использована переменной на предыдущем уровне"; переменная дважды объявлена.

    new fast;
    new fast;

    Решение: одну из них удалить или изменить.

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------

    "warning 235: public function lacks forward declaration %s"

    "Предупреждение 235: public function не хватает forward декларации %s"; у функции нет forward.

    public lois()

    Решение - изменить на forward:

    forward lois()

    Если не хотите каждый раз писать forward, то можно сделать так:

    #define public:%1(%2) forward %1(%2);
    public %1(%2)

    Тогда новые паблики делать так:

    public:lois()

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------
     
    NiGaByte, Chaos_Engine, Hejter и ещё 1-му нравится это.
  7. Danyas

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

    Сообщения:
    1.729
    Симпатии:
    461
    "warning 213: tag mismatch" - это вроде исправить можно изменением типа данных.
    Изменить с String на Int например.

    "warning 217: loose indentation" - любимое занятие :-D

    "warning 209: function "%s" should return a value" - за эту отдельное спасибо, ибо недавно об нее споткнулся

    Добавлено через 1 минуту
    AlmazON, а какой ивент выполняется после каждой смены карты?
    только OnMapStart?
    а OnConfigsExecuted?

    Добавлено через 3 минуты
    туда же

    PHP:
    decl String:ip[16],String:name[96],String:country[96],String:from[128];
    Я по поводу выделенных байт не перебрал?)
     
    Последнее редактирование: 24 янв 2015
    Chaos_Engine нравится это.
  8. AlmazON

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

    Сообщения:
    4.587
    Симпатии:
    1.995
    С чего вдруг? Некоторые чужие скрипты или копирование с этого форума - это да... Одни пробелы. А в своём то вручную расставляешь.
    Кстати, это тоже бред. Похоже, ты ещё не достиг хорошего уровня скриптинга в мелочах.
    OnMapStart(), потом OnAutoConfigsBuffered() и после всех OnConfigsExecuted(). Первый применять, по-моему мнению, надо реже. Он и не нужен везде подряд.
     
  9. Danyas

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

    Сообщения:
    1.729
    Симпатии:
    461
    Не без этого конечно.
    Но чаще всего это
    PHP:
    #pragma tabsize 0
    PHP:
    stock bool:IsClientValid(client)
    {
        return ((
    client && client <= MaxClients) && IsClientInGame(client)) ? true false;
    }  
    Без этой проверки сервер еррорит
    PHP:
    [SMNative "IsFakeClient" reportedClient index 0 is invalid
     
  10. AlmazON

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

    Сообщения:
    4.587
    Симпатии:
    1.995
    new client = GetClientOfUserId(userid) - ставь после такого просто if(client) и удивишься. И никаких ошибок после.
    Первое - прямо таки вровень! А вот второе, если это никнейм игрока - сильный перебор, ровно в 3 раза.
    Тут уже на "твой вкус", ибо предела как бы нет - страны даже появляются новые, лучше переборщить уж. А последнее... это что, сообщение чата?
     
  11. Danyas

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

    Сообщения:
    1.729
    Симпатии:
    461
    Точно, это ж по сути и есть проверка на наличие клиента на сервере. :)

    Значит в никнейме может быть не более 32х символов латиницы или 16 кириллицы?
     
  12. AlmazON

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

    Сообщения:
    4.587
    Симпатии:
    1.995
    Правильнее писать константой include. Это у нас MAX_NAME_LENGTH.
    #define MAX_NAME_LENGTH 32 /**< Maximum buffer required to store a client name */
    Сдаётся мне, это сделано специально, чтобы ты потом не правил свой скрипт - у него всегда будет подставляться актуальная для данного времени/версии SM/игры величина.
     
  13. Danyas

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

    Сообщения:
    1.729
    Симпатии:
    461
    PHP:
            Format(from,sizeof(from)," [\x03%s]",country); //Adds [] and color
    Нужно было всю ф-ю постить)
    По сути это
    PHP:
    decl String:form [country+2]
    Добавлено через 2 минуты
    А где их всех взять?
    https://forums.alliedmods.net/showthread.php?t=57142 - тут нашел несколько
     
    Последнее редактирование: 24 янв 2015
  14. AlmazON

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

    Сообщения:
    4.587
    Симпатии:
    1.995
    Первоисточник SourceMod API. Вкладка "Constans" для каждой категории (include).
    А здесь лучше FormatEx.
     
    Danyas нравится это.
  15. Danyas

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

    Сообщения:
    1.729
    Симпатии:
    461
    Разница только в том что в Format используеться буффер а в FormatEx нет?
     
  16. AlmazON

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

    Сообщения:
    4.587
    Симпатии:
    1.995
    Format для сохранения в буффер, когда этот же буффер используется в нём для форматирования (для %s), а FormatEx - почти для всех прочих случаев, т.к. быстрее.
     
  17. Danyas

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

    Сообщения:
    1.729
    Симпатии:
    461
    Смысл понял.
    В случае KickCilentEx и HookEventEx всё так же?
     
  18. AlmazON

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

    Сообщения:
    4.587
    Симпатии:
    1.995
    Нет. Можешь спокойно хукать, как обычно - скорее, так даже будет быстрее, ибо Ex для "профита" с хуками... ("универсальных скриптов", так сказать).
    А первый просто переведи.
     
  19. Danyas

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

    Сообщения:
    1.729
    Симпатии:
    461
    Хм, спасибо, попробую.



    Погляди на код, может будет какая-либо заметка по поводу оптимизации или еще что-то...
    PHP:
    #include <sourcemod>
    #include <sdktools>
    #include <sdkhooks>
    #include <cstrike>

    new tracer_fx,explode_fx,light_fx;
    public 
    OnPluginStart()
    {
        
    HookEvent("weapon_fire"Event_OnWeaponFire);
    }

    public 
    OnMapStart()

        
    tracer_fx PrecacheModel("effects/gunshiptracer.vmt"); 
        
    explode_fx PrecacheModel("materials/sprites/sprite_fire01.vmt");
        
    light_fx PrecacheModel("sprites/lgtning.vmt");
    }

    public 
    Action:Event_OnWeaponFire(Handle:event, const String:name[], bool:silent)
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));
        
    decl String:weapon[25], Float:pos[3], Float:clientpos[3];
        
    GetEventString(event"weapon"weaponsizeof(weapon));
         if (
    strcmp(weapon"awp"false) == 0)
        {
            
    wS_GetLookPos(clientpos);
            
    GetClientEyePosition(clientclientpos);
            
    TE_SetupBeamPoints(clientpospostracer_fx,0,0,0,3.0,2.0,4.0,2,1.2,{125125125190},1);
            
    TE_SendToAll();
            
    TE_SetupBeamPoints(posclientpostracer_fx,0,0,0,4.0,3.0,5.0,4,0.1,{255255255190},6);
            
    TE_SendToAll();
        }
      
        if (
    strcmp(weapon"m3"false) == 0)
        {
            
    wS_GetLookPos(clientpos);
            new 
    tesla CreateEntityByName("point_tesla");
            
    DispatchKeyValue(tesla"m_flRadius""66.0");
            
    DispatchKeyValue(tesla"m_SoundName""DoSpark");
            
    DispatchKeyValue(tesla"beamcount_min""30");
            
    DispatchKeyValue(tesla"beamcount_max""60");
            
    DispatchKeyValue(tesla"texture""sprites/physbeam.vmt");
            
    DispatchKeyValue(tesla"m_Color""255 255 255");
            
    DispatchKeyValue(tesla"thick_min""10.0");  
            
    DispatchKeyValue(tesla"thick_max""11.0"); 
            
    DispatchKeyValue(tesla"lifetime_min""0.2");
            
    DispatchKeyValue(tesla"lifetime_max""0.6");
            
    DispatchKeyValue(tesla"interval_min""0.1"); 
            
    DispatchKeyValue(tesla"interval_max""0.5");        
            
    DispatchSpawn(tesla);
            
    TeleportEntity(teslaposNULL_VECTORNULL_VECTOR);
            
    AcceptEntityInput(tesla"TurnOn"); 
            
    AcceptEntityInput(tesla"DoSpark");
            
    TE_SetupExplosion(posexplode_fx10.010755000);
            
    TE_SendToAll();  
        }
        
        if (
    strcmp(weapon"scout"false) == 0)
        {
        
    wS_GetLookPos(clientpos);
        new 
    randomx GetRandomInt(-500500); 
        new 
    randomy GetRandomInt(-500500); 
        new 
    Float:startpos[3]; 
        
    startpos[0] = pos[0] + randomx
        
    startpos[1] = pos[1] + randomy
        
    startpos[2] = pos[2] + 800
        new 
    color[4] = {030240255}; 
        new 
    Float:dir[3] = {0.00.00.0}; 
        
    TE_SetupBeamPoints(startposposlight_fx0000.220.010.002.0color3); //Делаем лазер с амплитудой в 2 единицы
        
    TE_SendToAll();
        
    TE_SetupBeamPoints(startposposlight_fx0000.210.05.001.0, {255255255255}, 3);
        
    TE_SendToAll();
        
    TE_SetupSparks(posdir50001000);
        
    TE_SendToAll();
        
    TE_SetupEnergySplash(posdirfalse);
        
    TE_SendToAll();
        }
        return 
    Plugin_Handled;
    }





    //Ty wS for that
    public bool:wS_GetLookPos_Filter(entmaskany:client)

        return 
    client != ent
    }

    wS_GetLookPos(clientFloat:wS_Pos[3])
    {
    decl Float:EyePosition[3], Float:EyeAngles[3], Handle:h_trace
    GetClientEyePosition(clientEyePosition); 
    GetClientEyeAngles(clientEyeAngles); 
    h_trace TR_TraceRayFilterEx(EyePositionEyeAnglesMASK_SOLIDRayType_InfinitewS_GetLookPos_Filterclient); 
    TR_GetEndPosition(wS_Posh_trace); 
    CloseHandle(h_trace); 
    }
     
  20. AlmazON

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

    Сообщения:
    4.587
    Симпатии:
    1.995
    else if! И ниже то же. Элементарные ошибки, а так достаточно хорошо написано. Оффтоп
    Оффтоп