Jump to content
Sign in to follow this  
First

Скрипт ограничения скорости техники.

Recommended Posts

Скрипт ограничивает скорость техники до указанного вами лимита.

1. В init.sqf вписать:

execVM "Scripts\SpeedLimit.sqf";

2. Создать папку Scripts в папке с вашей миссией и создать в папке файл SpeedLimit.sqf.
(Папка нужна для вашего удобства и удобства тем людям, кто проверяет вашу миссию).

В SpeedLimit.sqf вписать код:

// Конфиг
_maxspeed = 40;		// Максимальная скорость техники.


while {alive player} do {
	_vehicle = (vehicle player);
	if (speed _vehicle > _maxspeed and player == driver (vehicle player)) then
	{
		// Тут лучше много не выставлять в _x. Если перекрутить или недокрутить, то техника будет откидываться назад (как при десинхронах), либо вообще улетит. (Рекомендуемо: 0.6 - 0.8).
		_vel		=	velocity _vehicle;
		_x		=	0.8;
		_velNew		=	[(_vel select 0) * _x, (_vel select 1) * _x, (_vel select 2) * _x];
		_vehicle SetVelocity _velNew;
	};
	sleep 0.1;	// Как часто крутим. (Рекомендуется: 0.1 - 0.3).
};




Разные модификации:
Если хотим ограничить скорость только для определенных классов техники:

Спойлер

// Конфиг
_maxspeed = 40;		// Максимальная скорость техники.

// Массив техники на которую будет работать ограничение скорости.
_convoy =
[
	"ID техники"
	,"ID техники 2"
	,"ID техники 3"
	// Продлевайте сколько надо!
];


while {alive player} do {
	_vehicle = (vehicle player);
	if (speed _vehicle > _maxspeed and (typeOf _vehicle in _convoy)) then
	{
		// Тут лучше много не выставлять в _x. Если перекрутить или недокрутить, то техника будет откидываться назад (как при десинхронах), либо вообще улетит. (Рекомендуемо: 0.6 - 0.8).
		_vel		=	velocity _vehicle;
		_x		=	0.8;
		_velNew		=	[(_vel select 0) * _x, (_vel select 1) * _x, (_vel select 2) * _x];
		_vehicle SetVelocity _velNew;
	};
	sleep 0.1;	// Как часто крутим. (Рекомендуется: 0.1 - 0.3).  
};

 




Если используется летная техника, то рекомендуется использовать проверку isKindOf "Air"; :

Спойлер

Найти строчку:


if (speed _vehicle > _maxspeed) then

И заменить на:


if (speed _vehicle > _maxspeed and !(_vehicle isKindOf "Air")) then

 



P.S. Если есть какие-то ошибки или пожелания к доработке - пишите, сделаю.

Edited by First

Share this post


Link to post
Share on other sites

А если используется плавательная техника? :yoba-arma:

Спойлер

А еще оператор in является cASe-seNsItiVE! :yoba-arma: Поэтому важно чтобы регистр класснеймов в массиве совпадал с тем, что выдает typeof :yoba-arma:

 

Edited by DAP

Share this post


Link to post
Share on other sites

execVM, while - говно.
Есть же EachFrame ивент хэндлер
https://community.bistudio.com/wiki/Arma_3:_Event_Handlers/addMissionEventHandler#EachFrame
и мы в сборке имеем CBA которым можно пользоваться вместо EachFrame (это по сути он же и есть)
https://cbateam.github.io/CBA_A3/docs/files/common/fnc_addPerFrameHandler-sqf.html
Главное не забывать удалять хэндлеры когда они уже не нужны.

Edited by Liquid

Share this post


Link to post
Share on other sites
6 минут назад, Kato сказал:

Давайте лучше придём к выводу, что скрипт, который каждый фрейм "одёргивает" технику во время движения сам по себе плохая идея.

На setVelocity построена ВСЯ арма с модами. ACE лимиттер вроде нормально работает.
Тут меня еще смущает, что скрипт по сути накладывает ограничение не на технику, а на игрока который потом будет рулить, а может и не будет.
Получается нужно на всех игроков применять?

Edited by Liquid

Share this post


Link to post
Share on other sites
1 минуту назад, Liquid сказал:

На setVelocity построена ВСЯ арма с модами.

Это понятно. Но ощущения от использования такого скрипта на быстрой технике очень неприятные.

Share this post


Link to post
Share on other sites
52 минуты назад, Liquid сказал:

execVM, while - говно.
Есть же EachFrame ивент хэндлер

То есть ты хочешь запускать скрипт, который будет корректировать velocity техники 15/30/60/120 раз в секунду? Оптимизация? Не, не слышал :yoba-arma:

Спойлер

Вот из-за таких как ты деятелей у вас постоянно первая миссия не взлетает :yoba-arma:

 

Edited by DAP

Share this post


Link to post
Share on other sites
30 минут назад, DAP сказал:

То есть ты хочешь запускать скрипт, который будет корректировать velocity техники 15/30/60/120 раз в секунду? Оптимизация? Не, не слышал :yoba-arma:

 

Не раз в секунду, а каждый кадр симуляции.
Любые действия с движущимися объектами должны проводиться каждый кадр. Скачки скорости 150 - 40 - 150 каждую секунду и соответствующие телепорты - это неприемлемо, а значит решение с EachFrame - оптимальное.

проверка простого if и setVelocity занимает МИКРОсекунды. (не мили)
Оптимизировать тут можно вычисление вектора. vectorMultiply должен быть быстрее.

Ах да. Еще про оптимизацию. Будто spawn с проверкой while будет не каждый кадр пытаться исполниться. :mini-happy:

Edited by Liquid

Share this post


Link to post
Share on other sites
1 час назад, Liquid сказал:

Не раз в секунду, а каждый кадр симуляции.

Каждый фрейм рендера, ага :yoba-arma: Читай спецификацию команды :yoba-arma:

1 час назад, Liquid сказал:

Любые действия с движущимися объектами должны проводиться каждый кадр. 

 Сильное утверждение. Проверять я его, конечно, не буду :yoba-arma:

1 час назад, Liquid сказал:

Скачки скорости 150 - 40 - 150 каждую секунду и соответствующие телепорты - это неприемлемо, а значит решение с EachFrame - оптимальное.

Если у тебя топовый комп и ты не играешь в арму 3, то...  может быть :yoba-arma:

1 час назад, Liquid сказал:

проверка простого if и setVelocity занимает МИКРОсекунды. (не мили)
Оптимизировать тут можно вычисление вектора. vectorMultiply должен быть быстрее.

Можно сделать вообще быстро, запустив просчет в "незапланированной среде" :yoba-arma: Но тогда игра у тебя просто встанет "колом" :yoba-arma:

1 час назад, Liquid сказал:

Ах да. Еще про оптимизацию. Будто spawn с проверкой while будет не каждый кадр пытаться исполниться. :mini-happy:

Представь себе нет :yoba-arma: Изучай что именно делает команда sleep :yoba-arma:

Спойлер

А если еще и учесть, что @First "немного" накосячил с алгоритмом, то проверка на каждый фрейм вам капитально так даст прикурить от ваших ПК :yoba-arma: 

Спойлер

Собственно, я уже не удивляюсь тому, что у вас на игорах регулярно миссии не взлетают :yoba-arma: Я бы удивился, если бы было иначе :yoba-arma:

 

 

Edited by DAP

Share this post


Link to post
Share on other sites

@DAP Специально для тебя надо бы ограничить Йобу, больно глаза мозолят на форуме.

5 минут назад, DAP сказал:

В редакторе?

И не только. Учитывая личные мои умения я ковыряю и смотрю как могу что и где переделать. Не исключено что после всего тут прочитанного я постараюсь переделать его на более адекватное... Хотя основу я брал у другого и смотрел что можно сделать лучше.

Edited by First

Share this post


Link to post
Share on other sites
4 минуты назад, First сказал:

@DAP Специально для тебя надо бы ограничить Йобу, больно глаза мозолят на форуме.

:yoba-arma:

5 минут назад, First сказал:

И не только. Учитывая личные мои умения я ковыряю и смотрю как могу что и где переделать. Не исключено что после всего тут прочитанного я постараюсь переделать его на более адекватное...

Сразу дам небольшую подсказку: сколько игроков едет в машине? :yoba-arma:

Share this post


Link to post
Share on other sites

Даю подсказку, я ничего не писал о содержимом цикла, и даже высказал сомнения относительно привязки к игроку. Применение eachFrame всё ещё лучше spawn sleep

Share this post


Link to post
Share on other sites
10 минут назад, Liquid сказал:

Применение eachFrame всё ещё лучше spawn sleep

Чем? :yoba-arma: Тем что нагружает твой процессор лишней работой, отбирая ресурсы у других процессов? :yoba-arma:

Share this post


Link to post
Share on other sites

Тем что твой транспорт не лагает от изменения скорости с негарантированным шансом и негарантированным интервалом.

Если есть ярое желание пропускать исполнение кода. То CBA_fnc_addPerFrameHandler с желаемым интервалом.

Просто оставлю это тут.
http://sqf.ovh/ite/2018/01/21/ITE-the-scheduler.html

Edited by Liquid

Share this post


Link to post
Share on other sites

@Liquid писал какой-то балбес. uisleep как раз и отличается от sleep тем, что работает не во времени симуляции движка, а в системном времени. Именно поэтому когда ты ставишь симуляцию на паузу sleep останавливается, а uisleep продолжает "тикать".

Спойлер

Именно поэтому sleep откровенно врет при низком ФПС :yoba-arma: Потому что скорость выполнения симуляции замедляется :yoba-arma:

 

Спойлер

А избежать лагов от изменения скорости ты все равно не сможешь, даже вообще не используя приведенный @First скрипт, потому что это арма, а в арме техника ВСЕГДА локальна только водителю, и на всех остальных ей наплевать :yoba-arma:

 

Спойлер

И CBA свой выкинь на помойку :yoba-arma: Игра уже давно содержит собственную библиотеку функций, а так же кучу интегрированных команд (которые выполняются напрямую движком, без всяких скриптовых костылей), что делает CBA не нужным от слова совсем :yoba-arma: Это натуральное пятое колесо телеги :yoba-arma:

 

Edited by DAP

Share this post


Link to post
Share on other sites
4 часа назад, DAP сказал:

что делает CBA не нужным от слова совсем :yoba-arma: Это натуральное пятое колесо телеги :yoba-arma:

только в ВТНе до сих пор юзеркнопки через жепу сделаны, а не как в удобных модах с помощью cba, что же ты сделать через армафункции не можешь то а? :pryatki:

Share this post


Link to post
Share on other sites
10 минут назад, neVALYAshka сказал:

только в ВТНе до сих пор юзеркнопки через жепу сделаны, а не как в удобных модах с помощью cba, что же ты сделать через армафункции не можешь то а? :pryatki:

Не не могу, а не хочу :yoba-arma: Мне просто лень и это в корне меняет все :yoba-arma:

Спойлер

А вот для своего сурвивала я радиальное меню написал за полчаса :yoba-arma: Ага, то самое, которое от меня тут множество всяких личностей аж прям требовало для ВТН :yoba-arma: Ну это так, к слову :yoba-arma:

 

Edited by DAP

Share this post


Link to post
Share on other sites

@DAP ну так покажи хотя бы видосик сего творения, а ещё настройку юзер кнопок, если смог, то мы похлопаем, если не смог, то посмеёмся. 

Хотя надо учитывать, что даже если смог, то от некоторых вариантов реализации мы тоже посмеёмся. :pekas:

Share this post


Link to post
Share on other sites
В 31.05.2019 в 14:22, DAP сказал:

@Liquid писал какой-то балбес. uisleep как раз и отличается от sleep тем, что работает не во времени симуляции движка, а в системном времени. Именно поэтому когда ты ставишь симуляцию на паузу sleep останавливается, а uisleep продолжает "тикать".

  Показать контент

Именно поэтому sleep откровенно врет при низком ФПС :yoba-arma: Потому что скорость выполнения симуляции замедляется :yoba-arma:

 

  Показать контент

А избежать лагов от изменения скорости ты все равно не сможешь, даже вообще не используя приведенный @First скрипт, потому что это арма, а в арме техника ВСЕГДА локальна только водителю, и на всех остальных ей наплевать :yoba-arma:

 

  Показать контент

И CBA свой выкинь на помойку :yoba-arma: Игра уже давно содержит собственную библиотеку функций, а так же кучу интегрированных команд (которые выполняются напрямую движком, без всяких скриптовых костылей), что делает CBA не нужным от слова совсем :yoba-arma: Это натуральное пятое колесо телеги :yoba-arma:

 

Ахахахахха

1) повторю ещё раз. Про код внутри цикла я ничего не говорил. Корректный код исполняемый на машине водителя будет нормально ограничивать скорость без лагов и телепортов даже в мультиплеере.

2) По секрету сообщаю, CBA постоянно обновляется и функции имплементированные в движке регулярно объявляются deprecated в CBA с соответствующим уведомлением в rpt и возможным удалением в будущем. Дружественная система ивентхэндлеров позволяющая удобно выполнять код unscheduled в движке не имплементирована.

Героям создающим велосипеды с негарантированным проворотом педалей - слава!

Share this post


Link to post
Share on other sites
15 часов назад, Liquid сказал:

1) повторю ещё раз. Про код внутри цикла я ничего не говорил. Корректный код исполняемый на машине водителя будет нормально ограничивать скорость без лагов и телепортов даже в мультиплеере.

Тогда какой смысл использовать eachFrame, да еще и через CBA, когда  в арме уже есть такой эвентхандлер, да нагружать движок вычислениями каждый кадр, когда можно делать то же самое, но меньше нагружая движок? :yoba-arma: Где логика, Карл? :yoba-arma:

15 часов назад, Liquid сказал:

Дружественная система ивентхэндлеров позволяющая удобно выполнять код unscheduled в движке не имплементирована.

Не знаю где ты набрался этой чуши, но армовские эвентхандлеры выполняются как раз в незапланированной среде :yoba-arma:

Спойлер

И еще по поводу CBA :yoba-arma: Зачем запускать две функции (CBA > ARMA), когда можно запустить всего одну (ARMA)? :yoba-arma:

Так что...

15 часов назад, Liquid сказал:

Ахахахахха

:yoba-arma:

Edited by DAP

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.