
Пару вопросов по скриптам
#21
OFFLINE
Отправлено 13 August 2015 - 21:00
#22
OFFLINE
#23
OFFLINE
Отправлено 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
но не получается его адаптировать под тот триггер
#24
OFFLINE
Отправлено 14 August 2015 - 20:30
_type = typeOf _this;заменяешь _object на _this, в конце дописываешь true, ограничиваешь область видимости всех локальных переменных с помощью команды private и закидываешь код в файл. Далее этот файл предварительно обрабатываешь, компилируешь и присваиваешь переменной (например, reloadVehicle) и вызываешь код так:
_helicopter call reloadVehicle;
Сообщение отредактировал Schatten: 14 August 2015 - 20:33
#25
OFFLINE
Отправлено 14 August 2015 - 21:39
с какой целью нужно присваивать true в конец функции?
#26
OFFLINE
Отправлено 14 August 2015 - 21:48
В данном случае, для формальности: функция должна возвращать результат. Вот она и возвратит true.с какой целью нужно присваивать true в конец функции?
Сообщение отредактировал Schatten: 14 August 2015 - 21:49
#27
OFFLINE
Отправлено 14 August 2015 - 21:52
В данном случае, для формальности: функция должна возвращать результат. Вот она и возвратит true.с какой целью нужно присваивать true в конец функции?
а можно его упростить и встроить как с ремонтом, в твоих предыдущих постах?
#28
OFFLINE
Отправлено 14 August 2015 - 22:08
а можно его упростить и встроить как с ремонтом, в твоих предыдущих постах?
Думаю, для этого код нужно полностью переписать, но я пока не хочу этим заниматься.
Вообще, я думал написать функцию vehicleAmmo, принцип действия которой совпадает с, например, fuel, - определение доли текущего боезапаса от полного.
Для этого нужно пройтись по всем турелям техники и определить полный боекомплект и текущий. Потом разделить сумму текущих боекомплектов на сумму полных и вывести этот результат. Далее пользоваться этим так:
_vehicle setVehicleAmmo ((_vehicle call vehicleAmmo) + 0.1);
Можешь попробовать сам написать.
Сообщение отредактировал Schatten: 14 August 2015 - 22:09
#29
OFFLINE
Отправлено 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
#30
OFFLINE
Отправлено 14 August 2015 - 22:22
Это скорее всего из-за того, что ты код много раз запускаешь вместе с ремонтом и заправкой, а он предназначен для однократного запуска, после чего с помощью задержек имитируется процесс пополнения боекомплекта.я убрал из кода все задержки (sleep 4;) и сообщения в чат (_object vehicleChat format), вроде работает нормально, но очень напрягает что боезапас мигает. Даже когда оторвешься от земли он типо продолжает перезаряжать. Не подскажешь что еще из него можно вырезать, дабы убрать эту проблему?
Сообщение отредактировал Schatten: 14 August 2015 - 22:24
#31
OFFLINE
Отправлено 14 August 2015 - 22:42
Это скорее всего из-за того, что ты код много раз запускаешь вместе с ремонтом и заправкой, а он предназначен для однократного запуска, после чего с помощью задержек имитируется процесс пополнения боекомплекта.я убрал из кода все задержки (sleep 4;) и сообщения в чат (_object vehicleChat format), вроде работает нормально, но очень напрягает что боезапас мигает. Даже когда оторвешься от земли он типо продолжает перезаряжать. Не подскажешь что еще из него можно вырезать, дабы убрать эту проблему?
да ты прав, поставил его запуск под уведомлением и все заработало нормально
#32
OFFLINE
Отправлено 14 August 2015 - 23:11
А как можно завершить миссию по истечению какого нибудь таймера?
Например 20 мин и миссия заканчивается. Нет случаем примера?
#33
OFFLINE
Отправлено 14 August 2015 - 23:40
А как можно завершить миссию по истечению какого нибудь таймера?
Например 20 мин и миссия заканчивается. Нет случаем примера?
#34
OFFLINE
Отправлено 15 August 2015 - 20:37
#35
OFFLINE
Отправлено 15 August 2015 - 21:06
[] spawn { sleep (5 * 60); ["LOSER", "endMission"] call BIS_fnc_MP; };
#36
OFFLINE
Отправлено 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
#38
OFFLINE
Отправлено 16 August 2015 - 19:30
Dimon UA, мы, например, не измеряем время исполнения кода, так что ни к чему тут такая точность.
[] spawn { sleep (5 * 60); ["LOSER", "endMission"] call BIS_fnc_MP; };
Код вызываемый методом spawn, воспринимается движком как планируемая среда исполнения, и у движка есть полное право приостановить исполнение кода для исполнения более важной задачи.
#39
OFFLINE
Отправлено 16 August 2015 - 19:44
Код вызываемый методом spawn, воспринимается движком как планируемая среда исполнения, и у движка есть полное право приостановить исполнение кода для исполнения более важной задачи.
Для кого этот таймер? Для машины? Нет, для человека. Человек заметит разницу между 300 с и 302 с? Нет. Тогда я спрашиваю ещё раз: зачем здесь такая точность? Мы что, считаем время исполнения анимации?
А на счёт приостановки исполнения движком, так нужно позаботиться об этом, рационально нагружая сервер.
Дело, конечно, за автором темы, но из опубликованного им запроса я не считаю это критической ко времени задачей.
Сообщение отредактировал Schatten: 17 August 2015 - 00:37
#40
OFFLINE
Отправлено 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