Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 39 из 133 ПерваяПервая ... 29 37 38 39 40 41 49 89 ... ПоследняяПоследняя
Показано с 381 по 390 из 1325
  1. #381
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Profyan Посмотреть сообщение
    Макрос на существование игрока:
    PHP код:
    #define AvaliablePlayer(%0,%1) if(%1  == INVALID_PLAYER_ID || !IsPlayerConnected(%1)) \
        
    return SendClientMessage(%0COLOR_RED">> {FFFFFF}Не верный id!"); 
    Эмм, а какой смысл проверять значение переменной на совпадение с INVALID_PLAYER_ID, если IsPlayerConnected и так вернёт 0, если в неё попадёт любой ID, которого нет на сервере (в том числе и INVALID_PLAYER_ID). Никогда не понимал эту проверку.

    У меня есть один вариант - ты используешь sscanf со спецификатором "u". Хотя "INVALID_PLAYER_ID" sscanf вернёт только в том случае, когда игрок не найден на сервере (в спецификатор "u" вшита проверка на то, находится ли игрок на сервере). Других вариантов не знаю. Нужно смотреть конкретный код, где появляются данные проблемы. Бага такого в SA-MP замечено никем не было, а значит это кривой код
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  2. #382
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    548
    Репутация:
    158 ±
    Цитата Сообщение от Profyan Посмотреть сообщение
    А разница?И так и так должно работать, не?!
    Как вариант. Хотя если работало до этого, тогда, возможно, проблема в другом.
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

  3. #383
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Эмм, а какой смысл проверять значение переменной на совпадение с INVALID_PLAYER_ID, если IsPlayerConnected и так вернёт 0, если в неё попадёт любой ID, которого нет на сервере (в том числе и INVALID_PLAYER_ID). Никогда не понимал эту проверку.
    Да, смысла нет, лучше сделать такую проверку:
    PHP код:
    stock FIX_IsPlayerConnected(playerid)
    {
        return 
    <= playerid MAX_PLAYERS && IsPlayerConnected(playerid);
    }
    #if defined _ALS_IsPlayerConnected
        #undef IsPlayerConnected
    #else
        #define _ALS_IsPlayerConnected
    #endif

    #define IsPlayerConnected FIX_IsPlayerConnected 
    Ведь, как известно, IsPlayerConnected работает только с двумя младшими байтами переданного значения, что в ряде случаях (при числах больше, чем 2^16 - 1) может приводить к ложным результатам.

  4. 2 пользователя(ей) сказали cпасибо:
    DeimoS (24.08.2016) Profyan (24.08.2016)
  5. #384
    Аватар для Profyan
    Пользователь

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    У меня есть один вариант - ты используешь sscanf со спецификатором "u". Хотя "INVALID_PLAYER_ID" sscanf вернёт только в том случае, когда игрок не найден на сервере (в спецификатор "u" вшита проверка на то, находится ли игрок на сервере). Других вариантов не знаю. Нужно смотреть конкретный код, где появляются данные проблемы. Бага такого в SA-MP замечено никем не было, а значит это кривой код
    Да, использую u. Но вначале я думал,что sscanf сам все проверит, а как оказалось нет. Было очень много выходов за пределы массива, поэтому сделал такой костыль.

    Спасибо ziggi, воспользуюсь твоим решением!



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




  6. #385
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Да, смысла нет, лучше сделать такую проверку:
    PHP код:
    stock FIX_IsPlayerConnected(playerid)
    {
        return 
    <= playerid MAX_PLAYERS && IsPlayerConnected(playerid);
    }
    #if defined _ALS_IsPlayerConnected
        #undef IsPlayerConnected
    #else
        #define _ALS_IsPlayerConnected
    #endif

    #define IsPlayerConnected FIX_IsPlayerConnected 
    Ведь, как известно, IsPlayerConnected работает только с двумя младшими байтами переданного значения, что в ряде случаях (при числах больше, чем 2^16 - 1) может приводить к ложным результатам.
    А что он будет за числа возвращать в такой проверке, ID игроков? прежнею цифру 1?
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  7. #386
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    А что он будет за числа возвращать в такой проверке, ID игроков? прежнею цифру 1?
    1 если игрок на сервере и 0, если нет.

  8. #387
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    А что он будет за числа возвращать в такой проверке, ID игроков? прежнею цифру 1?
    Всё просто же:
    PHP код:
    return <= playerid MAX_PLAYERS && IsPlayerConnected(playerid); 
    Тут возвращается результат условия. Условия возвращают либо истину (1), либо ложь (0).
    Так как стоит оператор "&&", учитываются результаты обоих условий, то бишь, например, если представить, что возврат имеет такой вид:
    PHP код:
    return <= playerid 10 && IsPlayerConnected(playerid); 
    То:
    • Если в функцию попадёт значение 15 (и такой игрок будет на сервере), условие 0 <= playerid < 10 вернёт 0 (ибо 15 больше 10), но IsPlayerConnected вернёт 1. Но так как в условии имеется оператор "&&", срабатывает компьютерная логика, при которой, если хоть один из аргументов возвращает "ложь" (0/false), то возвращается "ложь".
      (для оператора "||" (или) это, например, звучит так: если хоть один из аргументов возвращает "истина" (1/true), то возвращается "истина". То бишь, совершенно противоположная логика. Это, кстати, должны на информатике в школе рассказывать)
    • Если в функцию попадёт значение 5 (но такого игрока не будет на сервере), условие 0 <= playerid < 10 вернёт 1, но функция IsPlayerConnected вернёт 0, из-за чего результат опять будет равен 0.
    • Если же в функцию попадёт значение, например, 3 (и такой игрок будет на сервере), и условие 0 <= playerid < 10, и функция IsPlayerConnected вернут 1, из-за чего результат уже будет равен 1.


    В этой строке (return ...) нет ничего сверхсложного. Это, фактически, то же самое, что и:
    PHP код:
    if((<= playerid MAX_PLAYERS && IsPlayerConnected(playerid)) == true) return 1;
    else  return 
    0
    Просто записано в более компактном виде.
    Последний раз редактировалось DeimoS; 25.08.2016 в 10:30.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  9. Пользователь сказал cпасибо:
    vovandolg (25.08.2016)
  10. #388
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    PHP код:
    new count 0,
        
    rand Iter_Random(Player);
    foreach(new 
    iPlayer)
    {
        if(
    team{i} == 1count ++;
        if(
    count == Iter_Count(Player)) SetupFG(rand);

    Знаю что этот отрывок делает, но хочу узнать как он работает, на английском переводил так и не понял,
    вопрос в общем: что делают/как работают Iter_Random и Iter_Count в данном коде?
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  11. #389
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Iter_Random возвращает рандомное значение из указанного в нём итератора (массива, в которое записаны ID игроков, в данном случае)
    Iter_Count возвращает количество записанных данных в итератор (количество заполненных ячеек в массиве-итераторе Player)
    Всё связано с foreach
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  12. #390
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Iter_Random возвращает рандомное значение из указанного в нём итератора (массива, в которое записаны ID игроков, в данном случае)
    Iter_Count возвращает количество записанных данных в итератор (количество заполненных ячеек в массиве-итераторе Player)
    Всё связано с foreach
    А в этом отрывке кода может быть такое что рандом выберет не зависимо состоял игрок в тиме 1 или состоял в другой любой?
    Во обще есть смысл такого перебора? или можно было просто вот так сделать как ниже:
    PHP код:
    SetupFG(Iter_Random(Player)); 
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

 

 
Страница 39 из 133 ПерваяПервая ... 29 37 38 39 40 41 49 89 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •