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

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±

    Неверный алгоритм работы кода

    Уже вторые сутки не могу разобраться с ситуацией. При первичном входе на сервер, когда я сажусь в автомобиль и нажимаю "2", то выполняются функции garage и vehicle одновременно, хотя по идее должна выполниться только одна из них и вероятнее всего это garage (т.к. выполнение ее стоит впереди выполнения vehicle).
    Я грешил сначала на неверный возврат одной из функций (думал что возвращает где-то false), но при повторном вызове OnPlayerKeyStateChange - все работает как нужно, а именно, выполняется функция garage, а vehicle уже не выполняется.

    Это код вызова функций:
      Открыть/закрыть
    Код:
    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
            if (garage_OnPlayerKeyStateChange(playerid, newkeys)) {
     		return 1;
     	}
    	if (vehicle_OnPlayerKeyStateChange(playerid, newkeys)) {
    		return 1;
    	}
            //etc
    	return 1;
    }


    Это код функции vehicle_OnPlayerKeyStateChange:
      Открыть/закрыть
    Код:
    vehicle_OnPlayerKeyStateChange(playerid, newkeys)
    {
    	if(newkeys == KEY_SUBMISSION && GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
    	{
    		return callcmd::engine(playerid);
    	}
    	return 0;
    }


    Это код выполнения функции garage_OnPlayerKeyStateChange:
      Открыть/закрыть
    Код:
    garage_OnPlayerKeyStateChange(playerid, newkeys)
    {
    	if(newkeys == KEY_SUBMISSION && GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
    	{
    		if(true)
    		{
    			for(new i; i < MAX_VEHICLE_PLAYER; i++)
    			{
    				if(true)
    				{
    					if(true)
    					{
    						printf("выполнено");
    						return 1;
    					}
    					else
    					{
    						printf("не выполнено");
    						return 1;
    					}
    				}
    			}
    		}
    	}
    	return 0;
    }


    Попробовал сделать без создания отдельных функций, а впихнул код в колбэк - все работает как нужно (в том числе и с первичного входа).
    Код:
      Открыть/закрыть
    Код:
    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    	if(newkeys == KEY_SUBMISSION && GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
    	{
    		if(true)
    		{
    			for(new i; i < MAX_VEHICLE_PLAYER; i++)
    			{
    				if(true)
    				{
    					if(true)
    					{
    						printf("выполнено");
    						return 1;
    					}
    					else
    					{
    						printf("не выполнено");
    						return 1;
    					}
    				}
    			}
    		}
    	}
    	if(newkeys == KEY_SUBMISSION && GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
    	{
    		return callcmd::engine(playerid);
    	}
     	//etc
    	return 1;
    }

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

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    В команде "engine" есть возврат единицы? Есть предположение, что обе функции всегда возвращают ноль. Первое условие не сработало, и начала выполняться следующая проверка.
    Последний раз редактировалось L0ndl3m; 06.02.2020 в 10:54.

  3. #3
    Аватар для Pa4enka
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.04.2016
    Адрес
    Украина
    Сообщений
    157
    Репутация:
    35 ±
    1. if (0 == garage_OnPlayerKeyStateChange(playerid, newkeys)) {
    2. return 1;
    3. }
    4. if (0 == vehicle_OnPlayerKeyStateChange(playerid, newkeys)) {
    5. return 1;
    6. }

  4. #4
    Аватар для L0ndl3m
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Pa4enka, смысл тогда проверять возвращаемое значений функций, если оно всегда возвращает 0?

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

    Статус
    Оффлайн
    Регистрация
    22.04.2016
    Адрес
    Украина
    Сообщений
    157
    Репутация:
    35 ±
    Цитата Сообщение от L0ndl3m Посмотреть сообщение
    Pa4enka, смысл тогда проверять возвращаемое значений функций, если оно всегда возвращает 0?
    0 будет возвращён, если проверка в стоке не пройдет. В ином случае, функция возвратит 1, исходя из его кода.

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

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Цитата Сообщение от Pa4enka Посмотреть сообщение
    0 будет возвращён, если проверка в стоке не пройдет. В ином случае, функция возвратит 1, исходя из его кода.
    Не факт, что
    1. return callcmd::engine(playerid);

    вернёт 1. Если команда возвращает нуль, то при любом раскладе "сток" вернёт 0, независимо от проверок.
    Поэтому я и спросил у ТС:
    Цитата Сообщение от L0ndl3m Посмотреть сообщение
    В команде "engine" есть возврат единицы?

  7. #7
    Аватар для Pa4enka
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.04.2016
    Адрес
    Украина
    Сообщений
    157
    Репутация:
    35 ±
    Цитата Сообщение от L0ndl3m Посмотреть сообщение
    Если команда возвращает нуль, то при любом раскладе "сток" вернёт 0, независимо от проверок.
    Если команда возвращает 0, то она, как минимум, не сработает, разве нет?)
    А кто-то в наше время возвращает 0? Ниразу такого не видел.
    Последний раз редактировалось Pa4enka; 06.02.2020 в 14:26.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Pa4enka Посмотреть сообщение
    Если команда возвращает 0, то она, как минимум, не сработает, разве нет?)
    А кто-то в наше время возвращает 0? Ниразу такого не видел.
    Ты и нормальной работы с MySQL не увидишь в паблик-работах :)

    А возврат нуля нужен для того, чтоб плагин не прекращал поиск команды. Например, это может быть полезно в FS, делая своеобразный перехват команды из мода (сначала будет срабатывать команды из скриптов, а потом уже из мода).

    Так же возвращаемое значение передаётся в OnPlayerCommandPerformed, в параметр "result". При том, это не обязательно может быть 0 или 1. И это может быть полезно для создания различных сообщений об ошибке. То бишь, чтоб не плодить в каждой команде свой текст ошибки, сделать так:
    1. CMD:pay(playerid, params[])
    2. {
    3. new giveplayerid, money;
    4. if(sscanf(params, "ri", giveplayerid, money))
    5. return SendClientMessage(playerid, 0x888888FF, "Использование: /pay [ID игрока] [Сумма]");
    6. if(giveplayerid == INVALID_PLAYER_ID)
    7. return 2;
    8. if(money < 1)
    9. return 3;
    10. GivePlayerMoney(playerid, money);
    11. return 1;
    12. }
    13.  
    14.  
    15.  
    16. CMD:tpto(playerid, params[])
    17. {
    18. new giveplayerid;
    19. if(sscanf(params, "r", giveplayerid))
    20. return SendClientMessage(playerid, 0x888888FF, "Использование: /tpto [ID игрока]");
    21. if(giveplayerid == INVALID_PLAYER_ID)
    22. return 2;
    23. new Float:x, Float:y, Float:z;
    24. GetPlayerPos(giveplayerid, x, y, z);
    25. SetPlayerPos(playerid, x, y, z);
    26. return 1;
    27. }
    28.  
    29. public OnPlayerCommandPerformed(playerid, cmd[], params[], result, flags)
    30. {
    31. switch(result)
    32. {
    33. case 1:// Если команда найдена и успешно выполнена (в команде возвращена единица)
    34. return 1;// Прекращаем поиск команды в других скриптах
    35.  
    36. case 2:// Если в команде возвращена двойка
    37. {
    38. SendClientMessage(playerid, 0x888888FF, "Ошибка: Указанный игрок не найден!");// Показываем сообщение
    39. return 1;// Прекращаем поиск команды в других скриптах
    40. }
    41. case 3:// Если тройка
    42. {
    43. SendClientMessage(playerid, 0x888888FF, "Ошибка: Введено невалидное значение!");// Сообщение
    44. return 1;// Прекращаем поиск команды в других скриптах
    45. }
    46. }
    47. return 0;// Иначе "говорим" плагину продолжать поиск в других скриптах
    48. }

    В идеале, конечно, код ошибок обёртывать в именные константы, например, через enum, и уже использовать их, чтоб не запоминать ворох чисел. Я числа указал лишь для наглядности :)


    Ну а касаемо случая автора - 0 может возвращаться просто по незнанию (автор для красоты влепил "return false;" при сообщении об ошибке, например, что можно встретить во всяких паблик-модах).
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±
    Цитата Сообщение от L0ndl3m Посмотреть сообщение
    В команде "engine" есть возврат единицы? Есть предположение, что обе функции всегда возвращают ноль. Первое условие не сработало, и начала выполняться следующая проверка.
    Без разницы что возвращает "engine", сама конструкция return callcmd::engine(playerid); вернет 1, как не крути. В engine есть возврат единицы, но это никак не повлияет на возврат значения из сток.


    Цитата Сообщение от DeimoS Посмотреть сообщение
    Ну а касаемо случая автора - 0 может возвращаться просто по незнанию (автор для красоты влепил "return false;" при сообщении об ошибке, например, что можно встретить во всяких паблик-модах).
    Не увидел у себя в коде "return false". Единицу сток возвращает в случае успешного выполнения, иначе 0. В случае с проверкой, проверяется именно значение true (1), и если (false(0)), то переходим к следующему условию.
    Пример конечно хороший, спасибо, но он никак не отвечает моему запросу.

    Я не могу понять почему после авторизации, при вызове колбека KeyStateChange (нажатии на 2), обе функции vehicle и garage выполняются. По идее должно быть так, когда нажал на "2" - идет выполнение garage, если garage вернул 1, то vehicle уже не выполняется, так как колбэк вернул значение больше 0 (то бишь остановил дальнейшую работу). Но в моем случае после авторизации срабатываю обе функции.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от punkochel Посмотреть сообщение
    Без разницы что возвращает "engine", сама конструкция return callcmd::engine(playerid); вернет 1, как не крути. В engine есть возврат единицы, но это никак не повлияет на возврат значения из сток.




    Не увидел у себя в коде "return false". Единицу сток возвращает в случае успешного выполнения, иначе 0. В случае с проверкой, проверяется именно значение true (1), и если (false(0)), то переходим к следующему условию.
    Пример конечно хороший, спасибо, но он никак не отвечает моему запросу.

    Я не могу понять почему после авторизации, при вызове колбека KeyStateChange (нажатии на 2), обе функции vehicle и garage выполняются. По идее должно быть так, когда нажал на "2" - идет выполнение garage, если garage вернул 1, то vehicle уже не выполняется, так как колбэк вернул значение больше 0 (то бишь остановил дальнейшую работу). Но в моем случае после авторизации срабатываю обе функции.
    Скинь весь код, связанный с проблемой, целиком: начиная с команды и заканчивая функциями.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

 

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

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

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

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

Ваши права

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