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

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

    VehicleParamsEx <Закрыто>

    Ситуация такова:
    Существует некая команда, которая запускает двигатель у автомобиля. Эта команда сначала берёт параметры автомобиля и, в зависимости от состояния параметра engine, запускает либо глушит двигатель. Я решил отследить этот параметр.
    PHP код:
        GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры
        
    printf("step 1 | engine - %d"engine);//вывожу в лог состояние параметра engine
        
    if(engine 1)//если двигатель заглушен
        
    {
            print(
    "start engine");//сообщаю в лог, что происходит запуск двигателя
            
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),1,lights,alarm,doors,bonnet,boot,objective);//запускаю двигатель
            
    return printf("step 2 | engine - %d"engine);//вывожу в лог новое состояние параметра engine
        
    }
           else
    //если двигатель запущен
        
    {
            print(
    "stop engine");//сообщаю в лог, что происходит остановка двигателя
            
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),0,lights,alarm,doors,bonnet,boot,objective);//глушу двигатель
            
    return printf("step 2 | engine - %d"engine);//вывожу в лог новое состояние параметра engine
        

    Всё прекрасно, двигатель действительно запускается и глушится тогда, когда это нужно. Компилируется тоже всё отлично. То есть, нареканий никаких нет. Но вот если открыть логи...
    PHP код:
    [08:23:13]
    //запуск двигателя
    step 1 engine //двигатель заглушен, лог говорит то же самое
    [08:23:13start engine //начинаем запуск
    [08:23:13step 2 engine //в игре двигатель запущен, но логи говорят, что по прежнему заглушен
    //теперь заглушу двигатель
    [08:23:25step 1 //двигатель запущен, лог говорит то же самое (непонятно, как так получилось, если на предыдущем шаге логи показывали нам engine = 0 после запуска двигателя. а сейчас на этом же автомобиле, через 12 секунд engine равен 1)
    [08:23:25stop engine //глушим двигатель
    [08:23:25step 2 //в игре двигатель заглушен, но логи говорят, что по прежнему запущен 
    Пойдём дальше. Я запилил ещё одну команду, которая будет возвращать состояние engine в консоль.
    PHP код:
    return printf("test command | engine - %d"engine); 
    И действительно, когда я использую команду запуска двигателя, в игре он запускается. Но при использовании второй команды логи показывают, что двигатель заглушен. Теперь мы получаем такую картину:
    PHP код:
    [08:23:13]
    //запуск двигателя
    step 1 engine //двигатель заглушен, лог говорит то же самое
    [08:23:13start engine //начинаем запуск
    [08:23:13step 2 engine //в игре двигатель запущен, но логи говорят, что по прежнему заглушен
    [08:23:14test command engine //в игре двигатель запущен, но логи говорят, что по прежнему заглушен
    [08:23:15test command engine //в игре двигатель запущен, но логи говорят, что по прежнему заглушен
    [08:23:16test command engine //в игре двигатель запущен, но логи говорят, что по прежнему заглушен 
    А теперь вопрос: Как всё это объяснить?

    P.S. Может у кого-то возникнет вопрос, для чего я вообще в этом копаюсь, ведь в игре всё работает.
    Ответ: пишу функцию, в которой нужно корректное отображение состояния engine.

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

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

    PHP код:
        GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры 
        
    printf("step 1 | engine - %d"engine);//вывожу в лог состояние параметра engine 
        
    if(engine 1)//если двигатель заглушен 
        

            
    engine 1;
            print(
    "start engine");//сообщаю в лог, что происходит запуск двигателя 
            
    SetVehicleParamsEx(GetPlayerVehicleID(playerid), engine,lights,alarm,doors,bonnet,boot,objective);//запускаю двигатель 
            
    return printf("step 2 | engine - %d"engine);//вывожу в лог новое состояние параметра engine 
        

           else
    //если двигатель запущен 
        

            
    engine 0;
            print(
    "stop engine");//сообщаю в лог, что происходит остановка двигателя 
            
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//глушу двигатель 
            
    return printf("step 2 | engine - %d"engine);//вывожу в лог новое состояние параметра engine 
        

    Последний раз редактировалось Fantom; 20.01.2016 в 10:20.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Эмм, хоть ответ выше и поможет, но он не раскрывает суть проблемы. А нужно было просто обновить данные в переменных...
    PHP код:
        GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры 
        
    printf("step 1 | engine - %d"engine);//вывожу в лог состояние параметра engine 
        
    if(engine 1)//если двигатель заглушен 
        

            print(
    "start engine");//сообщаю в лог, что происходит запуск двигателя 
            
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),1,lights,alarm,doors,bonnet,boot,objective);//запускаю двигатель 
            
    GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры 
            
    return printf("step 2 | engine - %d"engine);//вывожу в лог новое состояние параметра engine 
        

           else
    //если двигатель запущен 
        

            print(
    "stop engine");//сообщаю в лог, что происходит остановка двигателя 
            
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),0,lights,alarm,doors,bonnet,boot,objective);//глушу двигатель 
            
    GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры 
            
    return printf("step 2 | engine - %d"engine);//вывожу в лог новое состояние параметра engine 
        

    Ибо ты показываешь те данные, что были до изменения значения. И лучше ID авто тоже записать в переменную, а не вызывать GetPlayerVehicleID по несколько раз
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    30.11.2015
    Сообщений
    30
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Эмм, хоть ответ выше и поможет, но он не раскрывает суть проблемы. А нужно было просто обновить данные в переменных...
    Как всегда, невнимательность - лучшая подруга :) спасибо что подсказал.

    Цитата Сообщение от DeimoS Посмотреть сообщение
    И лучше ID авто тоже записать в переменную, а не вызывать GetPlayerVehicleID по несколько раз
    Почему?

    UPD: Странная чушь происходит. Заметил вот такую тему:
    Когда используешь эту команду, то она устанавливает engine = 1 не только для транспорта, в котором сидишь, но и для транспорта с ID = 0.

    PHP код:
    GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры 
        
    printf("step 1 | engine - %d"engine);//вывожу в лог состояние параметра engine 
        
    if(engine 1)//если двигатель заглушен 
        

            print(
    "start engine");//сообщаю в лог, что происходит запуск двигателя 
            
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),1,lights,alarm,doors,bonnet,boot,objective);//запускаю двигатель 
            
    GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры 
            
    printf("step 2 | vehicle - %d | engine - %d"GetPlayerVehicleID(playerid), engine);//вывожу в лог новое состояние параметра engine для своего транспорта 
            
    GetVehicleParamsEx(0,engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры транспорта с ID = 0
            
    printf("step 2 | engine - %d"engine);//вывожу в лог новое состояние параметра engine 
        

    PHP код:
    [12:44:37step 1 vehicle 65 engine 0
    [12:44:37step 1 vehicle engine 0
    [12:44:37start engine
    [12:44:37step 2 vehicle 65 engine 1
    [12:44:37step 2 vehicle engine 

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

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

    PHP код:
        GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры 
        
    printf("step 1 | engine - %d"engine);//вывожу в лог состояние параметра engine 
        
    if(engine 1)//если двигатель заглушен 
        

            
    engine 1;
            print(
    "start engine");//сообщаю в лог, что происходит запуск двигателя 
            
    SetVehicleParamsEx(GetPlayerVehicleID(playerid), engine,lights,alarm,doors,bonnet,boot,objective);//запускаю двигатель 
            
    return printf("step 2 | engine - %d"engine);//вывожу в лог новое состояние параметра engine 
        

           else
    //если двигатель запущен 
        

            
    engine 0;
            print(
    "stop engine");//сообщаю в лог, что происходит остановка двигателя 
            
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//глушу двигатель 
            
    return printf("step 2 | engine - %d"engine);//вывожу в лог новое состояние параметра engine 
        



    Мда.
     Цитаты великих критиков
    Цитата Сообщение от Fantom
    Скриптер не должен строить свою жизнь вокруг трафика с Яндекса. Это не должно быть вопросом жизни и смерти сервера.
    Цитата Сообщение от DeimoS Посмотреть сообщение
    А что мешало просто взять и попробовать? ;) Или обязательно нужно было услышать: "да, можно"?

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

    Статус
    Оффлайн
    Регистрация
    30.11.2015
    Сообщений
    30
    Репутация:
    0 ±
    Цитата Сообщение от Fantom Посмотреть сообщение
     открой меня

    PHP код:
        GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры 
        
    printf("step 1 | engine - %d"engine);//вывожу в лог состояние параметра engine 
        
    if(engine 1)//если двигатель заглушен 
        

            
    engine 1;
            print(
    "start engine");//сообщаю в лог, что происходит запуск двигателя 
            
    SetVehicleParamsEx(GetPlayerVehicleID(playerid), engine,lights,alarm,doors,bonnet,boot,objective);//запускаю двигатель 
            
    return printf("step 2 | engine - %d"engine);//вывожу в лог новое состояние параметра engine 
        

           else
    //если двигатель запущен 
        

            
    engine 0;
            print(
    "stop engine");//сообщаю в лог, что происходит остановка двигателя 
            
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//глушу двигатель 
            
    return printf("step 2 | engine - %d"engine);//вывожу в лог новое состояние параметра engine 
        



    Мда.
    Да я это видел... Этот вариант идентичен тому, только на одно действие больше.

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от gambit26 Посмотреть сообщение
    Почему?
    Ну а зачем сервер заставлять по несколько раз обращаться к игроку, нагружая тем самым канал связи, когда можно 1 раз узнать и потом уже работать с этой информацией?

    Цитата Сообщение от gambit26 Посмотреть сообщение
    Да я это видел... Этот вариант идентичен тому, только на одно действие больше.
    Его вариант, по-сути, оптимизированее, ибо функцию лишний раз не вызываем :) Я свой дал только для того, чтоб ты причину проблемы понял.

    Только тогда лучше так, раз уж краткость - сестра таланта
    PHP код:
    new vehicleid GetPlayerVehicleID(playerid);
    GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры
    printf("step 1 | engine - %d"engine);//вывожу в лог состояние параметра engine
    if(!engine)//если двигатель заглушен
    {
        
    engine 1;
        print(
    "start engine");//сообщаю в лог, что происходит запуск двигателя
        
    printf("step 2 | engine - %d"engine);//вывожу в лог новое состояние параметра engine
    }
    else
    //если двигатель запущен
    {
        
    engine 0;
        print(
    "stop engine");//сообщаю в лог, что происходит остановка двигателя
        
    printf("step 2 | engine - %d"engine);//вывожу в лог новое состояние параметра engine
    }
    SetVehicleParamsEx(vehicleidenginelightsalarmdoorsbonnetbootobjective); 
    Странная чушь происходит. Заметил вот такую тему:
    Когда используешь эту команду, то она устанавливает engine = 1 не только для транспорта, в котором сидишь, но и для транспорта с ID = 0.
    Если и в том варианте, что дан у меня, такое будет, скинь полностью весь код
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    30.11.2015
    Сообщений
    30
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Если и в том варианте, что дан у меня, такое будет, скинь полностью весь код
    так я же его и кинул

    Цитата Сообщение от gambit26 Посмотреть сообщение
    PHP код:
    GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры 
        
    printf("step 1 | engine - %d"engine);//вывожу в лог состояние параметра engine 
        
    if(engine 1)//если двигатель заглушен 
        

            print(
    "start engine");//сообщаю в лог, что происходит запуск двигателя 
            
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),1,lights,alarm,doors,bonnet,boot,objective);//запускаю двигатель 
            
    GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры 
            
    printf("step 2 | vehicle - %d | engine - %d"GetPlayerVehicleID(playerid), engine);//вывожу в лог новое состояние параметра engine для своего транспорта 
            
    GetVehicleParamsEx(0,engine,lights,alarm,doors,bonnet,boot,objective);//беру параметры транспорта с ID = 0
            
    printf("step 2 | engine - %d"engine);//вывожу в лог новое состояние параметра engine 
        

    PHP код:
    [12:44:37step 1 vehicle 65 engine 0
    [12:44:37step 1 vehicle engine 0
    [12:44:37start engine
    [12:44:37step 2 vehicle 65 engine 1
    [12:44:37step 2 vehicle engine 

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Ну а зачем сервер заставлять по несколько раз обращаться к игроку, нагружая тем самым канал связи, когда можно 1 раз узнать и потом уже работать с этой информацией?
    Функции SA:MP возвращают данные об игроке, которые сервер получил при последнем обновлении (т.е. перед последним вызовом OnPlayerUpdate). Никакой дополнительной нагрузки на канал связи от них нет.


    Цитата Сообщение от gambit26 Посмотреть сообщение
    Почему?
    Вызов нативной функции сам по себе занимает время из-за перехода из вирт. машины на нативный код и обратно, и из-за передачи параметров из ВМ.
    Если нативная функция при нескольких вызовах с одними и теми же параметрами возвращает одинаковые значения - есть смысл вызвать функцию только один раз и записать результат в переменную.

    Впрочем, если вам нравидся садо-мазохизм с религиозным отказом от использования переменных и нагрузкой сервера лишними вызовами нативок - ваше право.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  10. Пользователь сказал cпасибо:
    DeimoS (20.01.2016)
  11. #10
    Аватар для Fantom
    Пользователь

    Статус
    Оффлайн
    Регистрация
    20.01.2016
    Сообщений
    16
    Репутация:
    0 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Функции SA:MP возвращают данные об игроке, которые сервер получил при последнем обновлении (т.е. перед последним вызовом OnPlayerUpdate). Никакой дополнительной нагрузки на канал связи от них нет.



    Вызов нативной функции сам по себе занимает время из-за перехода из вирт. машины на нативный код и обратно, и из-за передачи параметров из ВМ.
    Если нативная функция при нескольких вызовах с одними и теми же параметрами возвращает одинаковые значения - есть смысл вызвать функцию только один раз и записать результат в переменную.

    Впрочем, если вам нравидся садо-мазохизм с религиозным отказом от использования переменных и нагрузкой сервера лишними вызовами нативок - ваше право.
    Хоть и оффтоп, но спрошу, как ты поставил картинку в подпись? :xd:
     Цитаты великих критиков
    Цитата Сообщение от Fantom
    Скриптер не должен строить свою жизнь вокруг трафика с Яндекса. Это не должно быть вопросом жизни и смерти сервера.
    Цитата Сообщение от DeimoS Посмотреть сообщение
    А что мешало просто взять и попробовать? ;) Или обязательно нужно было услышать: "да, можно"?

 

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

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

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

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

Ваши права

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