Balavnik 118 Опубликовано 26 Октября Поделиться Опубликовано 26 Октября (изменено) @UriZzz А у тебя obj вне функции существует? Если нет, то при вызове obj:section() произойдёт вылет, т.к. obj не инициализирован(равен nil). Занеси uSect в тело main , если вылет прекратился, то причина вылета выше. Изменено 26 Октября пользователем Balavnik 1 Осенний каламбур. Сентябрь - лето. Ссылка на комментарий
rost2000 0 Опубликовано 26 Октября Поделиться Опубликовано 26 Октября 1 час назад, Norman Eisenherz сказал: 1. Нужны скобки вокруг проверок имени: объект И (имя ИЛИ имя …) 2. При таком количестве проверок можно переделать код на сверку по списку: local names = { name_1 = true, name_2 = true, … } … if sobj and names[ sobj:section_name() ] then … Вылет пропал, но метка так и не появилась. Предполагаю, что нужно id не серверного, а клиентского объекта получить? Ссылка на комментарий
Norman Eisenherz 313 Опубликовано 26 Октября Поделиться Опубликовано 26 Октября Простой id не отличается для серверного и клиентского объекта – проблема в чем-то еще. Может, в названиях смартов очепятки? В крайнем случае, можно буквально встать в смарт и проверить if объект_смарта_по_имени:inside( db.actor:position() ). 1 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
gam 117 Опубликовано 27 Октября Поделиться Опубликовано 27 Октября @Norman Eisenherz Тут вероятно нужно Росту записать иначе. function yan_storyline_spot_add() for i = 1, 65534 do local sim = alife() if sim then local sobj = sim:object(i) if sobj and sobj:section_name() == "yan_storyline_ecolog_spot1" and sobj:section_name() == "yan_storyline_ecolog_spot2" and sobj:section_name() == "yan_storyline_ecolog_spot3" and sobj:section_name() == "yan_storyline_ecolog_spot4" then -- printf("level has sobj", sobj) level.map_add_object_spot(sobj.id, "crlc_big", "storyline_yan_spot") end end end end Имхо конечно. 1 Ссылка на комментарий
Norman Eisenherz 313 Опубликовано 27 Октября Поделиться Опубликовано 27 Октября Это несколько смартов со сходными именами – зачем ставить все условия через AND? @WinCapМопед не мой. 1 1 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
WinCap 316 Опубликовано 27 Октября Поделиться Опубликовано 27 Октября @Norman Eisenherz, попробуй вместо "sobj:section_name()" использовать "sobj:name()". 1 S.T.A.L.K.E.R. CoP Objects (upd 15.11.24) Ссылка на комментарий
rost2000 0 Опубликовано 28 Октября Поделиться Опубликовано 28 Октября Возможно ли повесить коллбэк на обыск трупа НПС? Ссылка на комментарий
mole venomous 3 404 Опубликовано 28 Октября Поделиться Опубликовано 28 Октября xr_motivator.use_callback Юзнуть НПС, там же и проверка, а не труп ли он. 1 Здесь могла быть ваша реклама. Ссылка на комментарий
rost2000 0 Опубликовано 28 Октября Поделиться Опубликовано 28 Октября А интересное кино получается, отметки на карте исчезают после загрузки сохранения. Их нужно обновлять после каждого load'а? Ссылка на комментарий
Это популярное сообщение. Купер 2 875 Опубликовано 28 Октября Это популярное сообщение. Поделиться Опубликовано 28 Октября @rost2000 , вместо level.map_add_object_spot(sobj.id, "crlc_big", "storyline_yan_spot") Использовать level.map_add_object_spot_ser(sobj.id, "crlc_big", "storyline_yan_spot") В чём разница и нюансы: здесь. 2 2 1 1 Ссылка на комментарий
gam 117 Опубликовано 29 Октября Поделиться Опубликовано 29 Октября 15 часов назад, rost2000 сказал: Возможно ли повесить коллбэк на обыск трупа НПС? Конечно. Но для чего? Ссылка на комментарий
rost2000 0 Опубликовано 29 Октября Поделиться Опубликовано 29 Октября 7 часов назад, gam сказал: Конечно. Но для чего? Чтобы сделать проверку, когда ГГ обыскивает любого НПС из группы. Ссылка на комментарий
Kirgudu 1 217 Опубликовано 29 Октября Поделиться Опубликовано 29 Октября (изменено) 27.10.2024 в 16:39, gam сказал: Имхо конечно Вы извините, товарищи, но это тихий ужас. Неужели никто ничего не заметил? Или тут всеобщий стёб пошёл, который я не понял? function yan_storyline_spot_add() for i = 1, 65534 do local sim = alife() -- зачем определять переменную sim внутри цикла? Чтобы функция alife() выполнилась 65534 раз? Но это ещё полбеды. if sim then local sobj = sim:object(i) if sobj and sobj:section_name() == "yan_storyline_ecolog_spot1" and sobj:section_name() == "yan_storyline_ecolog_spot2" and sobj:section_name() == "yan_storyline_ecolog_spot3" and sobj:section_name() == "yan_storyline_ecolog_spot4" then -- Согласно условию, секция объекта должна быть равна одновременно и "yan_storyline_ecolog_spot1" и "yan_storyline_ecolog_spot2" -- и "yan_storyline_ecolog_spot3" и "yan_storyline_ecolog_spot4", поскольку использовано AND. -- Такое условие никогда не выполнится. -- printf("level has sobj", sobj) level.map_add_object_spot(sobj.id, "crlc_big", "storyline_yan_spot") end end end end @abramcumner а это уже я не заметил. Изменено 29 Октября пользователем Kirgudu 3 Инструмент Ссылка на комментарий
abramcumner 1 157 Опубликовано 29 Октября Поделиться Опубликовано 29 Октября 19 минут назад, Kirgudu сказал: Неужели никто ничего не заметил? @Norman Eisenherz сразу и заметил. Ссылка на комментарий
DimoNULL 0 Опубликовано 4 Ноября Поделиться Опубликовано 4 Ноября (изменено) Короче, есть динамический объект. Он состоит из его основы, и четырех его длинных частей. Подскажите пожалуйста как мне сделать проверку на то, касаются ли те самые 4 статического объекта на карте. Предупрежу сразу: я в скриптах не разбираюсь вообще, и мой предел это заспавнить физический объект и удалить. Даже с физикой работать не умею, там зафиксировать, пинка ему дать Изменено 4 Ноября пользователем DimoNULL Ссылка на комментарий
Ghilli 0 Опубликовано 4 Ноября Поделиться Опубликовано 4 Ноября Всем привет. Хотелось бы обратиться с вопросом касаемо данного кода. Суть задумки: вместо стандартных ПНВ, сразу вызывающих PPE из posteffects.ltx, сделать включение этих PPE скриптом (+ вывод небольшого статика-худа ПНВ-очков). По сути, каприз чисто ради визуального удовольствия, так как при выключении такого скриптового PPE он выключается не мгновенно, а как бы с постепенным высветлением. + к тому еще и маска ПНВ появляптся одновременно с PPE, без задержки. Однако случилась проблема. Если в случае с ПНВ, которое можно считать непосредственно из секции предмета, косяков нет нет, то с ПНВ, поставленными на шлем/броню в результате грейда, имеются траблы. Так, если поставить грейд на ПНВ 1-го поколения на Стальной шлем, то выводится худ-маска без постэффекта, при этом маска зависает и ее больше нельзя убрать, сколько не включай/выключай ПНВ. Со снятием шлема/брони также не пропадает. Стоит отметить, что функция "check_upgrade_sect" сама по себе работает корректно, не раз протестирована. Я подозреваю, накосячил прежде всего в проверке на поколение ПНВ, однако на всякий случай докидываю и реализацию вывода худ-маски и PPE. Помогите найти, в чем косяк заключается. Скрытый текст function check_nv_class() local outfit = db.actor:item_in_slot(7) local helmet = db.actor:item_in_slot(12) if outfit ~= nil then if system_ini():line_exist(outfit:section(), "nightvision_sect") then if system_ini():r_string(outfit:section(), "nightvision_sect") == "effector_nightvision_1" then local nv_class1 = system_ini():r_string(outfit:section(), "nightvision_sect") return nv_class1 end if system_ini():r_string(outfit:section(), "nightvision_sect") == "effector_nightvision_2" then local nv_class2 = system_ini():r_string(outfit:section(), "nightvision_sect") return nv_class2 end if system_ini():r_string(outfit:section(), "nightvision_sect") == "effector_nightvision_3" then local nv_class3 = system_ini():r_string(outfit:section(), "nightvision_sect") return nv_class3 end end if check_upgrade_sect(outfit, "nightvision_sect") == "effector_nightvision_1" then local nv_class1 = check_upgrade_sect(outfit, "nightvision_sect") return nv_class1 end if check_upgrade_sect(outfit, "nightvision_sect") == "effector_nightvision_2" then local nv_class2 = check_upgrade_sect(outfit, "nightvision_sect") return nv_class2 end if check_upgrade_sect(outfit, "nightvision_sect") == "effector_nightvision_3" then local nv_class3 = check_upgrade_sect(outfit, "nightvision_sect") return nv_class3 end end if helmet ~= nil then if system_ini():line_exist(helmet:section(), "nightvision_sect") then if system_ini():r_string(helmet:section(), "nightvision_sect") == "effector_nightvision_1" then local nv_class1 = system_ini():r_string(helmet:section(), "nightvision_sect") return nv_class1 end if system_ini():r_string(helmet:section(), "nightvision_sect") == "effector_nightvision_2" then local nv_class2 = system_ini():r_string(helmet:section(), "nightvision_sect") return nv_class2 end if system_ini():r_string(helmet:section(), "nightvision_sect") == "effector_nightvision_3" then local nv_class3 = system_ini():r_string(helmet:section(), "nightvision_sect") return nv_class3 end end if check_upgrade_sect(helmet, "nightvision_sect") == "effector_nightvision_1" then local nv_class1 = check_upgrade_sect(helmet, "nightvision_sect") return nv_class1 end if check_upgrade_sect(helmet, "nightvision_sect") == "effector_nightvision_2" then local nv_class2 = check_upgrade_sect(helmet, "nightvision_sect") return nv_class2 end if check_upgrade_sect(helmet, "nightvision_sect") == "effector_nightvision_3" then local nv_class3 = check_upgrade_sect(helmet, "nightvision_sect") return nv_class3 end end end Скрытый текст function nvg_rework() local nightvision = db.actor:object("device_torch") local nv_signal --отвечает за отрисовку худа при юзании ночника и звук самого ПНВ if nightvision and nightvision:night_vision_enabled() == true and nv_signal == true then nv_signal = false hud:AddCustomStatic("hud_nvg_2") if check_nv_class() == "effector_nightvision_1" then level.add_pp_effector("nightvision_1.ppe", 1, true) elseif check_nv_class() == "effector_nightvision_2" then level.add_pp_effector("nightvision_2.ppe", 1, true) elseif check_nv_class() == "effector_nightvision_3" then level.add_pp_effector("nightvision_3.ppe", 1, true) end elseif (not nightvision or nightvision:night_vision_enabled() == false) and nv_signal == false then nv_signal = true hud:RemoveCustomStatic("hud_nvg_2") level.remove_pp_effector(1) end Ссылка на комментарий
Norman Eisenherz 313 Опубликовано 5 Ноября Поделиться Опубликовано 5 Ноября 1. "What a terrible day to have eyes…" "Есть переменная, которая может быть равна 1, 2 или 3. Если переменная равна 1, присвоить ее значение новой переменной и выдать его, аналогично для 2 и 3, аналогично для варианта проверки той же переменной в списке апгрейдов." Голландский штурвал, нет? После проверки "параметр существует" достаточно выполнить действие return system_ini():r_string(item:section(), "nightvision_sect") То же для проверки в апгрейдах. Аналогично с номером эффекта: отсечь последний знак через check_nv_class():sub(-1) и подставить его в level.add_pp_effector("nightvision_номер.ppe", 1, true) вместо трех проверок "если 1, то 1". Примечание: проверка класса ПНВ должна возвращать только строку, в противном случае x:sub(-1) надо указать в полном виде: string.sub(x, -1). 2. При двух вариантах условий достаточно описать первое и сказать else. 2.1. Если флаг указан внутри функции, как в коде выше, он будет каждый раз сбрасываться на false – статик вообще не будет выведен. 2.2. Во избежание путаницы с частями условия лучше переоформить код: local static_on function nvg_rework() if nightvision and nightvision:night_vision_enabled() then if not static_on then static_on = true -- вывести статик end else if static_on then static_on = false -- удалить статик end end end 1 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
rost2000 0 Опубликовано 5 Ноября Поделиться Опубликовано 5 Ноября Написал скрипт на проверку нахождения в спейс рестрикторе НПС, чтобы ГГ зачистил указанную зону, кроме НПС с группировкой "stalker". Вылетает с таким логом. Как я понимаю, методы применяются ко всем объектам, а нужно, чтобы только к НПС. Искал проверку, что объект является НПС, но не нашел. function storyline_complex_clear() local sim = alife() if sim then local zone = sim:story_object(904) for id = 1, 65534 do sobj = sim:object(id) return sobj and zone and zone:inside(sobj:position()) and not sobj:community() == "stalker" end end end Скрытый текст FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: No such operator defined stack trace: Ссылка на комментарий
Kirgudu 1 217 Опубликовано 5 Ноября Поделиться Опубликовано 5 Ноября 2 часа назад, rost2000 сказал: а нужно, чтобы только к НПС Можно воспользоваться функциями из _g.script return sobj and zone and (IsStalker(sobj) or IsMonster(sobj)) and zone:inside(sobj:position()) and not sobj:community() == "stalker" а можно пойти с другой стороны и перебрать только те объекты, в свойствах которых есть функция community(): return sobj and zone and sobj.community and sobj:community() ~= "stalker" and zone:inside(sobj:position()) 1 Инструмент Ссылка на комментарий
Norman Eisenherz 313 Опубликовано 7 Ноября Поделиться Опубликовано 7 Ноября (изменено) Наличие определенных методов в обычных классах можно проверять через if obj.fx and type( obj.fx ) == "function" Существует ли аналогичная проверка для общих функций языка Lua? В частности, в таблице db.storage[id].mob_trader Сидоровича есть несколько значений, которые дают вылет "no such operator defined" при проверке type(v). Значения можно исключить просто по заголовкам (actions, anim_head, anim_global), но хочется более универсального решения. Изменено 7 Ноября пользователем Norman Eisenherz Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти