Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 12
  1. #1
    Аватар для DmitriyVasilev
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.01.2019
    Сообщений
    86
    Репутация:
    0 ±

    Вопрос при INVALID_PLAYER_ID

    Здравствуйте, вижу во многих местах данную проверка на валидность.
    Для чего она нужна , и еще смотрел разные мода в некоторых одних и тех же командах стоит эта проверка а в другом моде нет например
    1. else if(strcmp(x_job,"repair",true) == 0)
    2. {
    3. if(RepairOffer[playerid] != INVALID_PLAYER_ID)
    4. {
    5. if(PlayerInfo[playerid][pCash] > RepairPrice[playerid])
    6. {
    7. if(IsPlayerInAnyVehicle(playerid))
    8. {
    9. if(IsPlayerConnected(RepairOffer[playerid]))
    10. {
    11. RepairCar[playerid] = GetPlayerVehicleID(playerid);
    12. SetVehicleHealth(RepairCar[playerid], 1000.0);
    13. AnRepairVehicle(GetPlayerVehicleID(playerid));
    14. format(stringer, sizeof(stringer), "Механик %s починил вашу машину за %d вирт",PlayerInfo[RepairOffer[playerid]][pNames], RepairPrice[playerid]);
    15. SendClientMessage(playerid, 0x6ab1ffaa, stringer);
    16. format(stringer, sizeof(stringer), "Вы починили атомобиль %s за %d вирт",PlayerInfo[playerid][pNames],RepairPrice[playerid]);
    17. SendClientMessage(RepairOffer[playerid], 0x6ab1ffaa, stringer);
    18. PlayerInfo[playerid][pCash] -=RepairPrice[playerid];
    19. PlayerInfo[RepairOffer[playerid]][pCash] +=RepairPrice[playerid];
    20. RepairOffer[playerid] = INVALID_PLAYER_ID;
    21. RepairPrice[playerid] = 0;
    22. return true;
    23. }
    24. return true;
    25. }
    26. return true;
    27. }
    28. else { SendClientMessage(playerid, COLOR_GREY, "У вас не хватает денег!"); return true; }
    29. }
    30. else { SendClientMessage(playerid, COLOR_GREY, "Вам не предлагали чинить машину!"); return true; }
    31. }

    а вот тут нема этой проверки
    1. else if(strcmp(x_job, "repair",true) == 0)
    2. {
    3. if(RepairOffer[playerid] < 999)
    4. {
    5. if(User[playerid][pCash] > RepairPrice[playerid])
    6. {
    7. if(IsPlayerInAnyVehicle(playerid))
    8. {
    9. if(IsPlayerConnected(RepairOffer[playerid]))
    10. {
    11. GetPlayerName(RepairOffer[playerid], giveplayer, sizeof(giveplayer));
    12. GetPlayerName(playerid, sendername, sizeof(sendername));
    13. RepairCar[playerid] = GetPlayerVehicleID(playerid);
    14. SetVehicleHealth(RepairCar[playerid], 1000.0);
    15. AnRepairVehicle(GetPlayerVehicleID(playerid));
    16. format(string, 128, "Âàøó ìàøèíó îòðåìîíòèðîâàë(à) çà %i âèðò, Ìåõàíèê %s", RepairPrice[playerid], giveplayer);
    17. SendClientMessage(playerid, 0x6495EDFF, string);
    18. format(string, 128, "Âû ïî÷èíèëè àòîìîáèëü %s çà %i âèðò",sendername,RepairPrice[playerid]);
    19. SendClientMessage(RepairOffer[playerid], 0x6495EDFF, string);
    20. SendClientMessage(RepairOffer[playerid], 0x6495EDFF, !"Äåíüãè ïîñòóïÿò ê âàì íà áàíêîâñêèé ñ÷åò âî âðåìÿ çàðïëàòû");
    21. User[playerid][pCash] -= RepairPrice[playerid];
    22. User[RepairOffer[playerid]][pPayCheck] += RepairPrice[playerid];
    23. RepairOffer[playerid] = 999;
    24. RepairPrice[playerid] = 0;
    25. return 1;
    26. }
    27. return 1;
    28. }
    29. return 1;
    30. }
    31. else return SCM(playerid, COLOR_GREY, !"Ó âàñ íå õâàòàåò äåíåã!");
    32. }
    33. else return SCM(playerid, COLOR_GREY, !"Âàì íå ïðåäëàãàëè ÷èíèòü ìàøèíó!");
    34. }

    все таки когда ее надо ставить и зачем?

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

    Статус
    Оффлайн
    Регистрация
    08.06.2015
    Адрес
    Запорожье
    Сообщений
    117
    Репутация:
    1 ±
    В RepairOffer записывает ид игрока, которому в данной команде будут ремонтировать авто, то есть и проверка естественно на это, если ли ид игрока. (если же он ровняется INVALID_PLAYER_ID, значит игрока нет, команда не будет выполнена).
    И во второй команде которую ты дал, там баг, 999 ид может быть в игре, что есть не хорошо, тогда уж либо ставить 1000, но а лучше нечего не придумывать и писать INVALID_PLAYER_ID, для этого оно и есть собственно.
    Да и вообще, эти команды все по хорошему переписать стоило бы, код там конечно..
    Последний раз редактировалось Paradox; 20.04.2019 в 22:11.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Немного дополню.

    INVALID_PLAYER_ID - это просто макрос, который преобразуется в число 65535. Это не какая-то особая штука, которую нужно использовать только в определённых случаях. Это просто стандартный макрос, который используется в некоторых стандартных функциях, обозначающий невалидный (несуществующий) ID игрока.

    Соответственно, использовать этот макрос нужно либо со стандартными функциями, которые возвращают данное значение (65535 aka INVALID_PLAYER_ID), либо когда определённая функция/переменная должна хранить ID игрока, тем самым помечая, что в конкретный момент времени эта самая функция/переменная никакой ID не хранит.
    И, опять же, использовать такой макрос нужно не потому что он какой-то особенный и использование чего-то ещё приведёт к багам (хотя если указать значение в районе "0-999", то баг, как выше заметили, всё же появится),. Нет, ты можешь хоть 143242 записывать, сверять с этим значением, и всё будет работать. Но так не делают, ибо использование стандартного макроса более стандартизирует код (ну когда ты увидишь, что, например, переменная сравнивается с INVALID_PLAYER_ID, ты сразу поймёшь, что переменная должна хранить ID игрока), что упростит его понимание при последующем чтении этого же кода тобой.

    Собственно, как выше заметили, во втором случае лучше 999 заменить на INVALID_PLAYER_ID.
    Последний раз редактировалось DeimoS; 20.04.2019 в 23:00.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  4. #4
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    хотя если указать значение в районе "0-999", то баг, как выше заметили, всё же появится
    Пожалуй, тоже подключусь к дополнению.
    Даже если указать значение "1000" (или любое другое больше 999), это всё равно может привести к багам - не сейчас, так в будущем, если выйдет сервер с количеством игроков больше 1000. А с появлением open.mp и отговорки в стиле "больше 1000 игроков никогда не будет, SA-MP мёртв" теряют актуальность.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. #5
    Аватар для DmitriyVasilev
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.01.2019
    Сообщений
    86
    Репутация:
    0 ±
    а что будет например если я с этой команды уберу этот макрос?
    1. CMD:cput(playerid, params[])
    2. {
    3. if(User[playerid][pRank] >= 1 && (User[playerid][pMember] == 1 || User[playerid][pMember] == 2 || User[playerid][pMember] == 10 ||User[playerid][pMember] == 21))
    4. {
    5. if(GetVehicleModel(GetPlayerVehicleID(playerid)) != 596 && GetVehicleModel(GetPlayerVehicleID(playerid)) != 490 && GetVehicleModel(GetPlayerVehicleID(playerid)) != 597 && GetVehicleModel(GetPlayerVehicleID(playerid)) != 598) return SCM(playerid, COLOR_GRAD1, "[Ошибка] Вы не в патрульной машине");
    6. if(sscanf(params, "u",params[0])) return SCM(playerid, -1, !"Введите: /cput [playerid]");
    7. if(!IsPlayerConnected(params[0])) return 1;
    8. if(params[0] == INVALID_PLAYER_ID) return SCM(playerid, COLOR_GRAD1, !"[Ошибка] Человек небыл найден");
    9. if (!ProxDetectorS(5.0, playerid, params[0])) return SCM(playerid, COLOR_GRAD1, !"[Ошибка] Человек далеко от вас");
    10. if(params[0] == playerid) return SCM(playerid, COLOR_GRAD1, !"[Ошибка] Вы не можете затащить в машину самого себя");
    11. if(!User[params[0]][pWantedLevel]) return SCM(playerid, COLOR_GRAD1, !"[Ошибка] Человек не является преступником");
    12. if(GetPlayerState(params[0]) != PLAYER_STATE_ONFOOT) return SCM(playerid, COLOR_GRAD1, !"[Ошибка] Человек в автомобиле");
    13. new mesto2,vehicle=GetPlayerVehicleID(playerid);
    14. foreach(new i : Player)
    15. {
    16. if(IsPlayerInVehicle(i,vehicle))
    17. {
    18. mesto2 = GetPlayerVehicleSeat(i);
    19. if(mesto2==2) return SendClientMessage(playerid, COLOR_GRAD1, !"[Ошибка] Место в машине уже занято");
    20. }
    21. }
    22. PutPlayerInVehicleEx(params[0],vehicle,1);
    23. SetPlayerArmedWeapon(params[0],0);
    24. format(YCMDstr,sizeof(YCMDstr), "Вы были затащены в машину %s",Name(playerid));
    25. SendClientMessage(params[0],0x64E96EDFF,YCMDstr);
    26. format(YCMDstr,sizeof(YCMDstr), "Вы затащили в машину %s",Name(params[0]));
    27. SendClientMessage(playerid,0x64E96EDFF,YCMDstr);
    28. }
    29. return 1;
    30. }

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

    Статус
    Оффлайн
    Регистрация
    08.06.2015
    Адрес
    Запорожье
    Сообщений
    117
    Репутация:
    1 ±
    Цитата Сообщение от DmitriyVasilev Посмотреть сообщение
    а что будет например если я с этой команды уберу этот макрос?
    1. CMD:cput(playerid, params[])
    2. {
    3. if(User[playerid][pRank] >= 1 && (User[playerid][pMember] == 1 || User[playerid][pMember] == 2 || User[playerid][pMember] == 10 ||User[playerid][pMember] == 21))
    4. {
    5. if(GetVehicleModel(GetPlayerVehicleID(playerid)) != 596 && GetVehicleModel(GetPlayerVehicleID(playerid)) != 490 && GetVehicleModel(GetPlayerVehicleID(playerid)) != 597 && GetVehicleModel(GetPlayerVehicleID(playerid)) != 598) return SCM(playerid, COLOR_GRAD1, "[Ошибка] Вы не в патрульной машине");
    6. if(sscanf(params, "u",params[0])) return SCM(playerid, -1, !"Введите: /cput [playerid]");
    7. if(!IsPlayerConnected(params[0])) return 1;
    8. if(params[0] == INVALID_PLAYER_ID) return SCM(playerid, COLOR_GRAD1, !"[Ошибка] Человек небыл найден");
    9. if (!ProxDetectorS(5.0, playerid, params[0])) return SCM(playerid, COLOR_GRAD1, !"[Ошибка] Человек далеко от вас");
    10. if(params[0] == playerid) return SCM(playerid, COLOR_GRAD1, !"[Ошибка] Вы не можете затащить в машину самого себя");
    11. if(!User[params[0]][pWantedLevel]) return SCM(playerid, COLOR_GRAD1, !"[Ошибка] Человек не является преступником");
    12. if(GetPlayerState(params[0]) != PLAYER_STATE_ONFOOT) return SCM(playerid, COLOR_GRAD1, !"[Ошибка] Человек в автомобиле");
    13. new mesto2,vehicle=GetPlayerVehicleID(playerid);
    14. foreach(new i : Player)
    15. {
    16. if(IsPlayerInVehicle(i,vehicle))
    17. {
    18. mesto2 = GetPlayerVehicleSeat(i);
    19. if(mesto2==2) return SendClientMessage(playerid, COLOR_GRAD1, !"[Ошибка] Место в машине уже занято");
    20. }
    21. }
    22. PutPlayerInVehicleEx(params[0],vehicle,1);
    23. SetPlayerArmedWeapon(params[0],0);
    24. format(YCMDstr,sizeof(YCMDstr), "Вы были затащены в машину %s",Name(playerid));
    25. SendClientMessage(params[0],0x64E96EDFF,YCMDstr);
    26. format(YCMDstr,sizeof(YCMDstr), "Вы затащили в машину %s",Name(params[0]));
    27. SendClientMessage(playerid,0x64E96EDFF,YCMDstr);
    28. }
    29. return 1;
    30. }
    Убери и глянь :D
    P.S а вообще команда будет выполняться на ид игрока которого ты ввел.
    Потом это значение может подгрузить левый игрок, который зайдет на этот ид.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    В данной команде не нужна проверка
    1. if(!IsPlayerConnected(params[0])) return 1;

    Ибо в sscanf указан спецификатор "u", который сам проверяет, онлайн ли игрок и если не онлайн, то присваивает переменной значение INVALID_PLAYER_ID.

    В общем, достаточно будет лишь:
    1. if(sscanf(params, "u",params[0])) return SCM(playerid, -1, !"Введите: /cput [playerid]");
    2. if(params[0] == INVALID_PLAYER_ID) return SCM(playerid, COLOR_GRAD1, !"[Ошибка] Человек небыл найден");
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  8. #8
    Аватар для DmitriyVasilev
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.01.2019
    Сообщений
    86
    Репутация:
    0 ±
    Убрал, но все работает так же как обычно

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Так ничего и не должно измениться. Эта проверка просто была бессмысленна и лишь время на её обработку затрачивалось лишнее.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  10. #10
    Аватар для DmitriyVasilev
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.01.2019
    Сообщений
    86
    Репутация:
    0 ±
    если автоматически присвается инволид плеер ид то зачем проверку делать?

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

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

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

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

Ваши права

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