Здравствуйте! Как можно сделать проверку на существование объекта (Желательно без использования триггера)?
Пример: Игрок подходит к транспорту и нажимает на действие "Выгрузить боеприпасы", возле него спавнится ящик с припасами. При повторном нажатии на это действие высвечивается надпись, что ящик с данного транспорта уже выгружен.
Пробовал через alive и isNull , но выдаёт ошибку.

Проверка на существование объекта

Best Answer Schatten , 02 November 2020 - 14:12
Dispite , косяк твоего кода в том , что
isNull _BoxAmmoExport
всегда будет возвращать true, потому что после выполнения кода локальные переменные удаляются.
Тебе нужно сохранять, создан ящик или нет, в глобальной переменной, а ещё лучше -- в объекте, на который добавлено действие:
params ["_object"]; if (!(_object getVariable ["boxAmmoCreated", false])) then { "Land_PlasticCase_01_medium_gray_F" createVehicleLocal position player; _object setVariable ["boxAmmoCreated", true]; } else {hint format ["Ящик припасов уже выгружен"]};
P. S.
Команда format не нужна. Также советую сохранить содержимое SpawnBox.sqf в переменную.

#1
OFFLINE
Posted 01 November 2020 - 17:15
#2
OFFLINE
Posted 01 November 2020 - 17:31
Dispite , с помощью isNull. Но в твоём случае это вряд ли подойдёт, потому что используется нестандартное действие, и чтобы сделать то, что ты хочешь, нужно ковыряться в исходниках, с помощью которых добавляется это действие.
#3
OFFLINE
Posted 02 November 2020 - 12:28
Schatten
, Сам скрипт
if (isNull _BoxAmmoExport) then { _BoxAmmoExport = "Land_PlasticCase_01_medium_gray_F" createVehicleLocal position player } else {hint format ["Ящик припасов уже выгружен"]};
Действие добавлено через инициализацию
this addAction ["Export Ammo", "ExecVM 'SpawnBox.sqf'"];
#4
OFFLINE
Posted 02 November 2020 - 14:12 Best Answer
Dispite , косяк твоего кода в том , что
isNull _BoxAmmoExport
всегда будет возвращать true, потому что после выполнения кода локальные переменные удаляются.
Тебе нужно сохранять, создан ящик или нет, в глобальной переменной, а ещё лучше -- в объекте, на который добавлено действие:
params ["_object"]; if (!(_object getVariable ["boxAmmoCreated", false])) then { "Land_PlasticCase_01_medium_gray_F" createVehicleLocal position player; _object setVariable ["boxAmmoCreated", true]; } else {hint format ["Ящик припасов уже выгружен"]};
P. S.
Команда format не нужна. Также советую сохранить содержимое SpawnBox.sqf в переменную.
#5
OFFLINE
Posted 02 November 2020 - 14:49
Schatten , т.е сохранить в виде AmmoBox = {код}?
#6
OFFLINE
Posted 02 November 2020 - 15:29
Немного переделал код, т.к не понимал почему не работает.
/////AmmoBox _object = AmmoBox; _bool = _object getVariable "boxAmmoCreated"; if (!(_bool)) then { "Land_PlasticCase_01_medium_gray_F" createVehicleLocal position player; _object setVariable ["boxAmmoCreated", true]; } else {hint format ["Ящик припасов уже выгружен"]};
#7
OFFLINE
Posted 02 November 2020 - 15:47
Schatten , т.е сохранить в виде AmmoBox = {код}?
SpawnBox = compileFinal (preprocessFileLineNumbers "SpawnBox.sqf");
Но, так как ты действие добавляешь в редакторе, то к тому времени этот код не выполнится, поэтому надо использовать
.
#8
OFFLINE
Posted 03 November 2020 - 07:50
Schatten ,Появилась проблема в том, что я не могу получить значение через
_this getVariable
Я присваиваю значение через инициализацию, и через действие вызываю скрипт
[this] ExecVM "SpawnBox.sqf"
Но указывая объект через
_object = _this
Значение получить не удаётся. Я проверял тип передаваемой переменной (_this), она типа object. Так же не удаётся даже удалить объект ссылаясь на (_this), приходится прописывать через имя объекта
Edited by Dispite, 03 November 2020 - 09:10.
#10
OFFLINE
Posted 03 November 2020 - 13:40
Schatten , всё заработало, спасибо!
Edited by Dispite, 03 November 2020 - 13:45.