Перейти к содержимому


Фотография

Пару вопросов по скриптам


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 73

#21 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 13 August 2015 - 21:00

Schatten, если почитаешь внимательно, то там написано, что только при посадке на крышу у некоторых вертолетов и всегда у лодок. Автору же не лодку сажать или на крышу! Да и я сам использовал в своих миссиях и ни разу не подвело (Работает даже для игрока)
  • 0

#22 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 13 August 2015 - 21:21

vlad333000, OK, проверю как улучшили её работу.
  • 0

#23 OFFLINE   dimaS1k

dimaS1k

    Ефрейтор

  • Пользователи
  • 68 сообщений
  • Откуда:Moscow

Отправлено 13 August 2015 - 23:42

vlad333000, OK, проверю как улучшили её работу.

Нашел вот такой код

_magazines = getArray(configFile >> "CfgVehicles" >> _type >> "magazines");

if (count _magazines > 0) then {
	_removed = [];
	{
		if (!(_x in _removed)) then {
			_object removeMagazines _x;
			_removed = _removed + [_x];
		};
	} forEach _magazines;
	{
		_object vehicleChat format ["Reloading %1", _x];
		sleep 4;
		if (!alive _object) exitWith {};
		_object addMagazine _x;
	} forEach _magazines;
};

_count = count (configFile >> "CfgVehicles" >> _type >> "Turrets");

if (_count > 0) then {
	for "_i" from 0 to (_count - 1) do {
		scopeName "xx_reload2_xx";
		_config = (configFile >> "CfgVehicles" >> _type >> "Turrets") select _i;
		_magazines = getArray(_config >> "magazines");
		_removed = [];
		{
			if (!(_x in _removed)) then {
				_object removeMagazines _x;
				_removed = _removed + [_x];
			};
		} forEach _magazines;
		{
			_object vehicleChat format ["Reloading %1", _x];
			sleep 4;
			if (!alive _object) then {breakOut "xx_reload2_xx"};
			_object addMagazine _x;
			sleep 4;
			if (!alive _object) then {breakOut "xx_reload2_xx"};
		} forEach _magazines;
		// check if the main turret has other turrets
		_count_other = count (_config >> "Turrets");

		if (_count_other > 0) then {
			for "_i" from 0 to (_count_other - 1) do {
				_config2 = (_config >> "Turrets") select _i;
				_magazines = getArray(_config2 >> "magazines");
				_removed = [];
				{
					if (!(_x in _removed)) then {
						_object removeMagazines _x;
						_removed = _removed + [_x];
					};
				} forEach _magazines;
				{
					_object vehicleChat format ["Reloading %1", _x]; 
					sleep 4;
					if (!alive _object) then {breakOut "xx_reload2_xx"};
					_object addMagazine _x;
					sleep 4;
					if (!alive _object) then {breakOut "xx_reload2_xx"};
				} forEach _magazines;
			};
		};
	};
};
_object setVehicleAmmo 1;	// Reload turrets / drivers magazine

но не получается его адаптировать под тот триггер


  • 0

#24 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 14 August 2015 - 20:30

dimaS1k, в начале кода добавляешь
_type = typeOf _this;
заменяешь _object на _this, в конце дописываешь true, ограничиваешь область видимости всех локальных переменных с помощью команды private и закидываешь код в файл. Далее этот файл предварительно обрабатываешь, компилируешь и присваиваешь переменной (например, reloadVehicle) и вызываешь код так:
_helicopter call reloadVehicle;

Сообщение отредактировал Schatten: 14 August 2015 - 20:33

  • 0

#25 OFFLINE   Dimon UA

Dimon UA

    Ст.сержант

  • Пользователи
  • 304 сообщений
  • Откуда:Севастополь

Отправлено 14 August 2015 - 21:39

с какой целью нужно присваивать true в конец функции?


  • 0

#26 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 14 August 2015 - 21:48

с какой целью нужно присваивать true в конец функции?

В данном случае, для формальности: функция должна возвращать результат. Вот она и возвратит true.

Сообщение отредактировал Schatten: 14 August 2015 - 21:49

  • 0

#27 OFFLINE   dimaS1k

dimaS1k

    Ефрейтор

  • Пользователи
  • 68 сообщений
  • Откуда:Moscow

Отправлено 14 August 2015 - 21:52

 

с какой целью нужно присваивать true в конец функции?

В данном случае, для формальности: функция должна возвращать результат. Вот она и возвратит true.

 

а можно его упростить и встроить как с ремонтом, в твоих предыдущих постах?


  • 0

#28 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 14 August 2015 - 22:08

а можно его упростить и встроить как с ремонтом, в твоих предыдущих постах?

Думаю, для этого код нужно полностью переписать, но я пока не хочу этим заниматься.
Вообще, я думал написать функцию vehicleAmmo, принцип действия которой совпадает с, например, fuel, - определение доли текущего боезапаса от полного.

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

_vehicle setVehicleAmmo ((_vehicle call vehicleAmmo) + 0.1);

Можешь попробовать сам написать.


Сообщение отредактировал Schatten: 14 August 2015 - 22:09

  • 0

#29 OFFLINE   dimaS1k

dimaS1k

    Ефрейтор

  • Пользователи
  • 68 сообщений
  • Откуда:Moscow

Отправлено 14 August 2015 - 22:15

 

а можно его упростить и встроить как с ремонтом, в твоих предыдущих постах?

Думаю, для этого код нужно полностью переписать, но я пока не хочу этим заниматься.
Вообще, я думал написать функцию vehicleAmmo, принцип действия которой совпадает с, например, fuel, - определение доли текущего боезапаса от полного.

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

_vehicle setVehicleAmmo ((_vehicle call vehicleAmmo) + 0.1);

Можешь попробовать сам написать.

 

Для меня это пока запредельное :)
я убрал из кода все задержки (sleep 4;) и сообщения в чат (_object vehicleChat format), вроде работает нормально, но очень напрягает что боезапас мигает. Даже когда оторвешься от земли он типо продолжает перезаряжать. Не подскажешь что еще из него можно вырезать, дабы убрать эту проблему?

private ["_type","_this","_removed","_config","_count_other","_config2"];

_type = typeOf _this;

_magazines = getArray(configFile >> "CfgVehicles" >> _type >> "magazines");

if (count _magazines > 0) then {
	_removed = [];
	{
		if (!(_x in _removed)) then {
			_this removeMagazines _x;
			_removed = _removed + [_x];
		};
	} forEach _magazines;
	{
		if (!alive _this) exitWith {};
		_this addMagazine _x;
	} forEach _magazines;
};

_count = count (configFile >> "CfgVehicles" >> _type >> "Turrets");

if (_count > 0) then {
	for "_i" from 0 to (_count - 1) do {
		scopeName "xx_reload2_xx";
		_config = (configFile >> "CfgVehicles" >> _type >> "Turrets") select _i;
		_magazines = getArray(_config >> "magazines");
		_removed = [];
		{
			if (!(_x in _removed)) then {
				_this removeMagazines _x;
				_removed = _removed + [_x];
			};
		} forEach _magazines;
		{
			if (!alive _this) then {breakOut "xx_reload2_xx"};
			_this addMagazine _x;
			if (!alive _this) then {breakOut "xx_reload2_xx"};
		} forEach _magazines;
		// check if the main turret has other turrets
		_count_other = count (_config >> "Turrets");

		if (_count_other > 0) then {
			for "_i" from 0 to (_count_other - 1) do {
				_config2 = (_config >> "Turrets") select _i;
				_magazines = getArray(_config2 >> "magazines");
				_removed = [];
				{
					if (!(_x in _removed)) then {
						_this removeMagazines _x;
						_removed = _removed + [_x];
					};
				} forEach _magazines;
				{
					if (!alive _this) then {breakOut "xx_reload2_xx"};
					_this addMagazine _x;
					if (!alive _this) then {breakOut "xx_reload2_xx"};
				} forEach _magazines;
			};
		};
	};
};
_this setVehicleAmmo 1;

true

  • 0

#30 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 14 August 2015 - 22:22

я убрал из кода все задержки (sleep 4;) и сообщения в чат (_object vehicleChat format), вроде работает нормально, но очень напрягает что боезапас мигает. Даже когда оторвешься от земли он типо продолжает перезаряжать. Не подскажешь что еще из него можно вырезать, дабы убрать эту проблему?

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

Сообщение отредактировал Schatten: 14 August 2015 - 22:24

  • 0

#31 OFFLINE   dimaS1k

dimaS1k

    Ефрейтор

  • Пользователи
  • 68 сообщений
  • Откуда:Moscow

Отправлено 14 August 2015 - 22:42

 

я убрал из кода все задержки (sleep 4;) и сообщения в чат (_object vehicleChat format), вроде работает нормально, но очень напрягает что боезапас мигает. Даже когда оторвешься от земли он типо продолжает перезаряжать. Не подскажешь что еще из него можно вырезать, дабы убрать эту проблему?

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

 

да ты прав, поставил его запуск под уведомлением и все заработало нормально


  • 0

#32 OFFLINE   dimaS1k

dimaS1k

    Ефрейтор

  • Пользователи
  • 68 сообщений
  • Откуда:Moscow

Отправлено 14 August 2015 - 23:11

А как можно завершить миссию по истечению какого нибудь таймера?
Например 20 мин и миссия заканчивается. Нет случаем примера?


  • 0

#33 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 14 August 2015 - 23:40

А как можно завершить миссию по истечению какого нибудь таймера?
Например 20 мин и миссия заканчивается. Нет случаем примера?

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание


  • 0

#34 OFFLINE   dimaS1k

dimaS1k

    Ефрейтор

  • Пользователи
  • 68 сообщений
  • Откуда:Moscow

Отправлено 15 August 2015 - 20:37

Ну про завершение я знаю, у меня проблема с таймером, как его создать, дабы он выполнялся только на сервере и по истечению времени завершал миссию.
  • 0

#35 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 15 August 2015 - 21:06

[] spawn {
	sleep (5 * 60);

	["LOSER", "endMission"] call BIS_fnc_MP;
};

  • 0

#36 OFFLINE   Dimon UA

Dimon UA

    Ст.сержант

  • Пользователи
  • 304 сообщений
  • Откуда:Севастополь

Отправлено 16 August 2015 - 11:33

[] spawn {
	sleep (5 * 60);

	["LOSER", "endMission"] call BIS_fnc_MP;
};

sleep. time за большой промежуток может показать очень неточный результат в следствии различных факторов.

 

так будет точно


[] spawn {
    _time=diag_tickTime;
    waituntil { sleep 1;(diag_tickTime - _time) >= 5*60};

    ["LOSER", "endMission"] call BIS_fnc_MP;
};

Сообщение отредактировал Dimon UA: 16 August 2015 - 13:29

  • 0

#37 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 16 August 2015 - 19:25

Dimon UA, мы, например, не измеряем время исполнения кода, так что ни к чему тут такая точность.


  • 0

#38 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 16 August 2015 - 19:30

Dimon UA, мы, например, не измеряем время исполнения кода, так что ни к чему тут такая точность.

[] spawn {
	sleep (5 * 60);

	["LOSER", "endMission"] call BIS_fnc_MP;
};

Код вызываемый методом spawn, воспринимается движком как планируемая среда исполнения, и у движка есть полное право приостановить исполнение кода для исполнения более важной задачи.


  • 0

#39 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 16 August 2015 - 19:44

Код вызываемый методом spawn, воспринимается движком как планируемая среда исполнения, и у движка есть полное право приостановить исполнение кода для исполнения более важной задачи.

Для кого этот таймер? Для машины? Нет, для человека. Человек заметит разницу между 300 с и 302 с? Нет. Тогда я спрашиваю ещё раз: зачем здесь такая точность? Мы что, считаем время исполнения анимации?
А на счёт приостановки исполнения движком, так нужно позаботиться об этом, рационально нагружая сервер.
Дело, конечно, за автором темы, но из опубликованного им запроса я не считаю это критической ко времени задачей.


Сообщение отредактировал Schatten: 17 August 2015 - 00:37

  • 0

#40 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 16 August 2015 - 20:58

Итак, функция для определения доли текущего боекомплекта магазина турели относительно полного боекомплекта:
private ["_fullMagazineAmmoNumber", "_magazine", "_magazineAmmoNumber"];

params ["_vehicle", "_turretPath"];

_magazine = _vehicle currentMagazineTurret _turretPath;

_magazineAmmoNumber = _vehicle magazineTurretAmmo [_magazine, _turretPath];

_fullMagazineAmmoNumber = getNumber (configFile >> "CfgMagazines" >> _magazine >> "count");

if (_fullMagazineAmmoNumber != 0) then {_magazineAmmoNumber / _fullMagazineAmmoNumber} else {0};
Использование:
vehicleAmmo = compileFinal (preprocessFileLineNumbers "vehicleAmmo.sqf");

_helicopter setVehicleAmmoDef (([_helicopter, if (((assignedVehicleRole player) select 0) == "Driver") then {[-1]} else {(assignedVehicleRole player) select 1}] call vehicleAmmo) + 0.1);
Однако в данном случае, поскольку путь к турели не меняется, можно функцию вызывать так:
[_helicopter, [-1]] call vehicleAmmo;

Сообщение отредактировал Schatten: 16 August 2015 - 21:43

  • 0




Яндекс.Метрика