Как сделать чтобы спидометр показывал больше скорость крмп

Опубликовано: 05.07.2024

archiboy6

Опубликовал archiboy6 P , 1 мая, 2019

  • crmp
  • samp
  • san andreas
  • criminal russia
  • криминальная россия
  • сан андреас
  • вопросы по скриптингу
  • скриптинг крмп
  • скриптинг самп
  • скриптинг crmp
  • скриптинг samp

Рекомендованные сообщения

DEST

В теме 21 сообщение

Последние посетители 0 пользователей онлайн

Ни одного зарегистрированного пользователя не просматривает данную страницу

🛠 Все здраствуйте чисто по приколу решил замутить CMD:prays🛠
🛠 работа не пригодилась!🛠
🛠 За что cmd отвечает: увидите тут не реклама. 🛠

🛠 Cама CAMANDA🛠

/*======================[ Исправили]==========================//
1. —--— [ Исправили систему боксов ] —--—
2. —--— [ Исправили все скины с лаунчера ] —--—
3. —--— [ Исправили систему пожертвований ] —--—
4. —--— [ Исправили систему крафта ] —----
5. —--— [ Исправили интеръер казино ] —----
6. —--— [ Исправили машины на цр с покупкой ] —----
7. —--— [ Исправили парковку для тс ] —--—
8. —--— [ Исправили разные языки для /fammenu ] —--—

/*======================[ Обновление]==========================//
- Обновили автосалоны
- Обновили видео карты для майнинг фермы
- Построили новый интеръер (copy Arizona RP)
- Добавили новые итеръеры для дома
- Обнолены 3dtext на выходе из дома и мусоркахм
- Оптимизировали и добавили скины в /donate
- Теперь в /vr можно писать англ символы
- В /payday происходит пополнение видео карт
- Теперь сундука с рулетками можно выбить платиновую рулетка
- Сделана система дополнение к VIP
- Добавлены новые 4 бизнеса - Секенд Хенд
- Добавили новые АЗС.

Приветствую всех кто наткнулся на данный урок.
Часто видел, что люди спрашивают как изменяют скорости отдельных машин, повышать максимальную и так далее.
В данном уроке я отвечу на этот вопрос, а так же подробно разжую код, чтобы даже совсем новички смогли понять это, приступим.

P.S Данный урок является примером написания системы изменения скорости машин, он не является примером написания идеально оптимизированного и красивого кода.

Хочу сказать, что в данном уроке я использовал Col_Andreas дабы реализовать проверку того, касается ли машина земли.

И так, для начала перейдём к паблику OnPlayerKeyStateChange который вызывается при нажатии игроком определённой клавиши, добавим туда эти строки

Разберём код по строчкам:

UPD: Почему-то была проблема, что когда игрок ехал и допустим нажимал пробел то после того как он отпуска его, проверка на key_sprint в newkeys срабатывала но после этого она срабатывала сразу же и в oldkeys не знаю с чем это связано, ведь по логике в момент того когда мы отпускаем пробел в old_keys должен быть key_handbrake. В общем, else if в oldkeys решил эту проблему, т.к в нашем случае если одна проверка проходит то вторую проверку можно и не делать(проверка на oldkeys)

С этой частью кода разобрались но, что за паблик SetSpeed? Сейчас разберём.


И так паблик который будет присваивать машине скорость каждые 0.5 секунд разобрали, теперь давайте разберёмся с этим GetVehicleRotation. На вики по сампу даже есть отдельная страница с данной функцией ссылка создана она IllidanS4 и суть её в том, что она находит наклон машины по осям x y z через кватернионы посредством нативной функции GetVehicleRotationQuat


Что на счет SetVehicleSpeed то вот этот сток

Подробно и понятно описать я его не смогу, но грубо говоря он просто получает начальную скорость по осям x y z складывает их с переданной ему скоростью, складывает с начальной скоростью машины по x и y дабы игрок не мог резко развернуться и мгновенно получить ускорение в сторону поворота, а после устанавливает ускорение машины по осям x y z

Тут мы просто проверяем вышел ли игрок из машины и есть ли у игрока в переменной id таймера если есть то удаляем таймер и переменную игрока(в том числе и переменную которая отвечает за зажатые кнопки s/space), данный код я уже разбирал выше просто в другом паблике.
Ну вот вроде бы и все. Пишите если где-то ошибся, ну а если кому-то помог, то не откажусь от +

UPD Вам никто не запрещает экспериментировать, меняйте промежуток вызова SetSpeed и скорость которая прибавляется, дабы достичь более плавных и реалистичных результатов

[ВАЖНО] UPD:Спустя 3 дня понял, что в данной системе слишком много исключений, например, как я выше писал зажатые кнопки s/space перед w так же игрок может сесть в машину с уже зажатым w и из-за этого проверка на newkeys не сработает. Да можно написать еще проверки и обработать даже это, но так код станет довольно большим, поэтому сейчас пришел к выводу, что нужно выдавать скорость не когда игрок нажал w а когда он начал двигаться на машине (например запускать таймер сразу когда игрок садится в машину, но выдавать ускорение только когда игрок разогнался до 10км/ч допустим) таким образом можно будет избежать множества не очень приятных моментов

Приветствую всех кто наткнулся на данный урок.
Часто видел, что люди спрашивают как изменяют скорости отдельных машин, повышать максимальную и так далее.
В данном уроке я отвечу на этот вопрос, а так же подробно разжую код, чтобы даже совсем новички смогли понять это, приступим.

P.S Данный урок является примером написания системы изменения скорости машин, он не является примером написания идеально оптимизированного и красивого кода.

Хочу сказать, что в данном уроке я использовал Col_Andreas дабы реализовать проверку того, касается ли машина земли.

И так, для начала перейдём к паблику OnPlayerKeyStateChange который вызывается при нажатии игроком определённой клавиши, добавим туда эти строки

Разберём код по строчкам:

if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER && (newkeys & KEY_HANDBRAKE || newkeys & KEY_JUMP))SetPVarInt(playerid, "Space_or_s_Pressed", 1) - Бывает ситуация когда игрок в машине и сначала нажимает допустим space или s а после w и получится так, что игрок стоя на пробеле или нажав s перед w будет всё равно получать ускорение, для этого мы и должны будем отслеживать нажатие этих кнопок, для этой цели будем использовать переменную игрока под именем 'Space_or_s_Pressed'
else if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER && (oldkeys & KEY_HANDBRAKE || oldkeys & KEY_JUMP))SetPVarInt(playerid, "Space_or_s_Pressed", 0) - Здесь мы просто ставим значение переменной 'Space_or_s_Pressed' на 0 для того чтобы знать, что игрок отпустил Space/S

if(newkeys & KEY_SPRINT && GetPlayerState(playerid) == PLAYER_STATE_DRIVER && !GetPVarInt(playerid, "SpeedTimer") && !GetPVarInt(playerid, "Space_or_s_Pressed")) - Проверка на то нажал ли игрок кнопку 'W', находится ли он в машине, проверка на то не работает ли таймер присвоения скорости для машины в момент нажатия кнопки и проверка на то не держит ли игрок space/s
new timerid - Создаем переменную timerid в которую запишем id таймера который будет вызываться каждую 0,5 секунду
timerid = SetTimerEx("SetSpeed", 500, true, "i", playerid) - Создание таймера который будет вызывать паблик SetSpeed(Разберем ниже) и присвоение id таймера в переменную timerid
SetPVarInt(playerid, "SpeedTimer", timerid) - Записываем id созданного таймера в переменную игрока 'SpeedTimer' для того что бы мы могли в будущем удалить этот таймер.

else if(oldkeys & KEY_SPRINT && GetPlayerState(playerid) == PLAYER_STATE_DRIVER) - Проверка на то отпустил ли игрок кнопку 'W' а так же проверка на то, находится ли игрок в машине.(Прекращаем выдачу ускорения если игрок игрок отпустил w в машине)
KillTimer(GetPVarInt(playerid, "SpeedTimer")) - Killtimer Удаляет таймер по id'у в данном случае id мы записали в переменную игрока 'SpeedTimer'
DeletePVar(playerid, "SpeedTimer") - удаляем переменную игрока 'SpeedTimer' так как id удаленного таймера нам не к чему

UPD: Почему-то была проблема, что когда игрок ехал и допустим нажимал пробел то после того как он отпуска его, проверка на key_sprint в newkeys срабатывала но после этого она срабатывала сразу же и в oldkeys не знаю с чем это связано, ведь по логике в момент того когда мы отпускаем пробел в old_keys должен быть key_handbrake. В общем, else if в oldkeys решил эту проблему, т.к в нашем случае если одна проверка проходит то вторую проверку можно и не делать(проверка на oldkeys)

С этой частью кода разобрались но, что за паблик SetSpeed? Сейчас разберём.

if(Speed < 170 && CA_IsPlayerOnSurface(playerid))SetVehicleSpeed(carid, 15) - Проверка на скорость транспорта, если больше 170 то ускорение не выдается(можно сделать switch (GetVehicleModel(carid)) и установить каждой машине свою максимальную скорость) а также проверка из Col_Andreas (CA_IsPlayerOnSurface) на то касается ли игрок земли(Дабы не выдавать ускорение машине когда она летит, падает со скалы допустим) если условие проходит то мы вызываем сток SetVehicleSpeed (опишу его ниже) который устанавливает машине скорость выше текущей на 15(Это много для промежутка в 0,5 секунд, но это лишь пример, сюда вы должны написать своё число)


И так паблик который будет присваивать машине скорость каждые 0.5 секунд разобрали, теперь давайте разберёмся с этим GetVehicleRotation. На вики по сампу даже есть отдельная страница с данной функцией

создана она IllidanS4 и суть её в том, что она находит наклон машины по осям x y z через кватернионы посредством нативной функции GetVehicleRotationQuat


Что на счет SetVehicleSpeed то вот этот сток

Подробно и понятно описать я его не смогу, но грубо говоря он просто получает начальную скорость по осям x y z складывает их с переданной ему скоростью, складывает с начальной скоростью машины по x и y дабы игрок не мог резко развернуться и мгновенно получить ускорение в сторону поворота, а после устанавливает ускорение машины по осям x y z

Осталось нам обработать лишь тот случай когда игрок может выпрыгнуть из машины не отпуская 'W' в данном случае нам поможет паблик OnPlayerStateChange

Тут мы просто проверяем вышел ли игрок из машины и есть ли у игрока в переменной id таймера если есть то удаляем таймер и переменную игрока(в том числе и переменную которая отвечает за зажатые кнопки s/space), данный код я уже разбирал выше просто в другом паблике.
Ну вот вроде бы и все. Пишите если где-то ошибся, ну а если кому-то помог, то не откажусь от +

UPD Вам никто не запрещает экспериментировать, меняйте промежуток вызова SetSpeed и скорость которая прибавляется, дабы достичь более плавных и реалистичных результатов

[ВАЖНО] UPD:Спустя 3 дня понял, что в данной системе слишком много исключений, например, как я выше писал зажатые кнопки s/space перед w так же игрок может сесть в машину с уже зажатым w и из-за этого проверка на newkeys не сработает. Да можно написать еще проверки и обработать даже это, но так код станет довольно большим, поэтому сейчас пришел к выводу, что нужно выдавать скорость не когда игрок нажал w а когда он начал двигаться на машине (например запускать таймер сразу когда игрок садится в машину, но выдавать ускорение только когда игрок разогнался до 10км/ч допустим) таким образом можно будет избежать множества не очень приятных моментов

Да все поняли, ну по логике вещей, если поставить такую проверку на обновлялку, то нагрузка должна сбавиться, правда незначительно, но все же

Просто мало у кого есть до отвала загруженные сервера
Или их вообще нет))

Эмм, если у вас обновление текстдравов даёт сильную нагрузку - у меня для вас плохие новости.

Подобная проверка создаст лишь дополнительное лишнее условие, которое будет 90% времени в холостую проверяться и оставшиеся 10% просто будут теряться, из-за чего профита будет крайне мало, если он будет вообще.
Это то же самое, что и проверять pVar на то, существует ли он, прежде чем его удалять.

От определения скорости авто будет гораздо больше нагрузки. Хотя и эта нагрузка не должна создавать каких-то проблем, ибо SA-MP не настолько плох, чтоб от элементарных вычислений загинаться. Оптимизируйте лучше алгоритмы, а не подобной фигнёй занимайтесь

Эмм, если у вас обновление текстдравов даёт сильную нагрузку - у меня для вас плохие новости.

Подобная проверка создаст лишь дополнительное лишнее условие, которое будет 90% времени в холостую проверяться и оставшиеся 10% просто будут теряться, из-за чего профита будет крайне мало, если он будет вообще.
Это то же самое, что и проверять pVar на то, существует ли он, прежде чем его удалять.

От определения скорости авто будет гораздо больше нагрузки. Хотя и эта нагрузка не должна создавать каких-то проблем, ибо SA-MP не настолько плох, чтоб от элементарных вычислений загинаться. Оптимизируйте лучше алгоритмы, а не подобной фигнёй занимайтесь

При определении скорости через GetVehicleVelocity нагрузки нету, а вот при частом обновлении текстдравов серв стабильно падает. От проверок же с JIT нагрузок также нет.
Если, вы считаете это охотой на ведьм, то запихните обновление спидометра в OnPlayerUpdate, как "ракнет" в своё время..

UPD: Тема не актуальна, можете удалить.

Причём тут GetVehicleVelocity, если речь шла о вычислении скорости по тем данным, что выдаёт GetVehicleVelocity? Именно математические вычисления чаще всего дают большую нагрузку. И чем сложнее эти вычисления, тем дольше сервер их будет производить

Пихал. И даже видел сервер, геймплей которого во многом зависел от текстдравов, которые так же в OnPlayerUpdate обновлялись (там имитировалась приборная панель самолёта, которая требовала моментального обновления данных).
Обновление текстдрава для сервера - это просто отправка пакета с инфой о текстдраве игроку и не более.

Вот, ради эксперимента, можно взять текстдрав даты и времени с паблика и вставить обновление в OnPlayerUpdate

new Text : Clock ;
new Text : Date ;

public OnGameModeInit ()
<
Clock = TextDrawCreate ( 547.000000 , 29.000000 , "00:00" ); //это создает тестдрайвер
TextDrawLetterSize ( Clock , 0.5 , 1.5 ); //размер шрифта
TextDrawFont ( Clock , 0 ); //стиль шрифта
TextDrawColor ( Clock , 0xffffffff ); //цвет
TextDrawSetOutline ( Clock , 1 );
//дата
Date = TextDrawCreate ( 547.000000 , 45.000000 , "26.06.2011" ); //это создает тестдрайвер
TextDrawLetterSize ( Clock , 0.5 , 1.5 ); //размер шрифта
TextDrawFont ( Date , 0 ); //стиль шрифта
TextDrawColor ( Date , 0xffffffff ); //цвет
TextDrawSetOutline ( Date , 1 );
return 1 ;
>

public OnPlayerConnect ( playerid )
<
TextDrawShowForPlayer ( playerid , Clock );
TextDrawShowForPlayer ( playerid , Date );
return 1 ;
>

gettime ( buff_1 , buff_2 , buff_3 );

SetWorldTime ( buff_1 );
format ( string , sizeof (string), "%02d:%02d:%02d" , buff_1 , buff_2 , buff_3 );
TextDrawSetString ( Clock , string );
TextDrawShowForPlayer ( playerid , Clock );
// date
getdate ( buff_1 , buff_2 , buff_3 );

format ( string , sizeof (string), "%02d.%02d.%d" , buff_3 , buff_2 , buff_1 );
TextDrawSetString ( Date , string );
TextDrawShowForPlayer ( playerid , Date );
return 1 ;
>

Современный автомобиль должен отвечать всем требованиям. Однако, в автомобилестроении есть и такие неполадки, которые не могут на 100% искоренить на протяжении долгих лет. Например, в период Советского Союза многие могли столкнуться с ситуацией, когда спидометр показывал неточные данные. Как правило, показатель был выше, чем на самом деле. Конечно, такое явление можно было бы списать на дефект, но оно встречалось почти в каждой марке и модели.

Почему на спидометре завышаются данные

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

Реальные причины. Для начала вспомним, какая обстановка сейчас наблюдается на дороге. Власти постоянно находятся в борьбе с авариями, которые с каждым годом увеличиваются в том же соотношении, что и машины. Пожалуй, первая и главная причина завышения данных в спидометре - обеспечение безопасности. К примеру, на дороге стоит знак, который разрешает двигаться со скоростью не более 90 км/ч. А у водителя на такой отметке будет показывать уже 95 км/ч. В итоге порядочный автомобилист немного сбавит скорость и тем самым обезопасит свою жизнь. Вероятно, об этой причине знали если не все, то многие. Однако, недопущение превышения скорости - это только одна причина в целом ряду.

Компенсация повышенного давления в шинах. На любой заводской наклейке указаны рекомендации по давлению в шинах. Однако, на любой шиномонтажке найдется умник, который скажет, что он знает наилучший способ и метод накачивания. В итоге выходит цифра, которая всегда на порядок выше нормы. Из курса физики мы знаем, что от радиуса окружности зависит число оборотов. Чем больше окружность, тем меньше оборотов нужно совершить для заданной скорости. Простыми словами, слишком накаченные колеса будут выдавать меньшую скорость на спидометре, которая компенсируется настройкой инженеров с завода.

Почему на спидометре завышаются данные 3

Компенсация колес увеличенного диаметра. Система точно такая же, как и в прошлом случае. С завода стояли колеса на 15 дюймов, а поставили на 18. Конечно, такую кардинальную разницу ни одна настройка не сможет компенсировать. Однако, превышение на 1-2 дюйма может вполне сгладиться за счет настройки на заводе. Заметим, что сегодня практически все спидометры выполнены электронными, их можно легко настраивать под особенности ходовой части.

Закон. Об этой причине не знает практически никто. Международные стандарты указывают на то, что все производители должны четко следовать документу ЕЭК ООН N 39 / ГОСТ Р 41.39-99. Здесь оговаривается, что реальная скорость автомобиля никогда не должна быть выше той, которая указана на спидометре. Чтобы привести такую систему, специалистам приходится высчитывать параметры при помощи формул.

Почему на спидометре завышаются данные 4

Итог. Многие автомобилисты сталкиваются с тем, что показания на спидометре больше реальной скорости. На самом деле, это объясняется целым рядом причин и даже законодательной базой.

Читайте также: