volazar 9 Опубликовано 12 Мая 2012 (изменено) Всем доброй ночи Имеется функция. В ней проверяется наличие 2 разных предметов в слотах. Если предметы присутствуют, то идет вызов следующей функции. Если какого то одного предмета нет - то выводится сообщение на худ. И вот с последним загвоздка - сообщение выводится постоянно. Можно ли его сделать одноразовым? Вот сам код функции: function nano_speed() local nano_speed = db.actor:item_in_slot(1) local nano_suit = db.actor:item_in_slot(6) local gg = db.actor if nano_speed and nano_speed:section() == "nano_speed" and nano_suit and nano_suit:section() == "nano_suit" then news_manager.send_tip(gg, "%c[10,241,129,129]".."Сообщение центрального процессора:".."\\n".."%c[10,241,129,129]Инициализирован модуль "Скорость". Модуль готов к использованию.".."\n") this.nano_speed_1() -- Какой молодец. И модуль нацепил и костюм не забыл одеть. else news_manager.send_tip(gg, "%c[10,241,129,129]".."ERROR:".."\\n".."%c[10,241,129,129]Ошибка инициализации. Отсутствует подключение к центральному процессору!".."\n", nil, nil, 30000) -- А костюм где? Дубина! end end Изменено 12 Мая 2012 пользователем volazar Поделиться этим сообщением Ссылка на сообщение
volazar 9 Опубликовано 13 Мая 2012 (изменено) Artos, Дык это и не нужно Если одет просто костюм - сообщение не нужно выводить. Однако если костюма нету, но nano_speed вставляется в слот, тогда вывод сообщения об ошибке. ЗЫ: Функция Zander_driver у меня вылетает с ошибкой по синтаксису. Ф-ия Gun12 работает, однако не вызывается this.nano_speed_1() (если поставить ее вызов после сообщения, что все ок). Ф-ию Artos пока еще не пробовал. Изменено 13 Мая 2012 пользователем volazar Поделиться этим сообщением Ссылка на сообщение
volazar 9 Опубликовано 13 Мая 2012 (изменено) Еще 1 вопрос Взял ф-ию Gun12. Ее немножко изменил, получилось так: local old_suit_name local msg_vse_ok = тут текст сообщения local msg_vse_ne_ok = тут текст сообщения function nano_speed() local gg = db.actor local nano_speed = gg:item_in_slot(1) local suit = gg:item_in_slot(6) if nano_speed and nano_speed:section() == "nano_speed" then local current_suit_name = suit and suit:section() if current_suit_name == old_suit_name then return end if current_suit_name == "nano_suit" then news_manager.send_tip(gg, msg_vse_ok) this.nano_speed_1() else news_manager.send_tip(gg, msg_vse_ne_ok) end old_suit_name = current_suit_name end end Как уже писал выше, сообщения работают, однако нет вызова this.nano_speed_1() Если брать мой старый вариант (проверка на то, что nano_speed находится в слоте) то все работает. Изменено 13 Мая 2012 пользователем volazar Поделиться этим сообщением Ссылка на сообщение
volazar 9 Опубликовано 13 Мая 2012 (изменено) Да вроде все уже воплотил. Есть функция, которая висит в апдейте. Функция проверяет наличие предмета и костюма в слотах. Если предмет находится в слоте, а костюм по каким то причинам не одет на ГГ, то выводится сообщение с ошибкой. Если же и предмет и костюм находятся в слотах, то выводится сообщение, что все ок и вызывается следующая функция (которая при условии, что в инвентаре есть нужный предмет и соблюдено условие (if gg.power > 0.4 then), юзает этот самый предмет, что приводит к восстановлению сил ГГ). Вот эта вторая вызываемая ф-ия: local fl = false local fl_1 = false local msg_sp_1 = тут текст local msg_sp_2 = тут текст function nano_speed_1() local gg = db.actor if gg.power > 0.4 then fl = false fl_1 = false return end if not fl then news_manager.send_tip(gg, msg_sp_1) end fl = true local speed = gg:object("nanobot_pow") if speed then gg:eat(speed) fl = false fl_1 = false return elseif not fl_1 then news_manager.send_tip(gg, msg_sp_2) fl_1 = true end end Вчера, я использовал ф-ию, просто проверяющую, что предмет в слоте и вызывающую след. function nano_speed() local nano_speed = db.actor:item_in_slot(1) if nano_speed and nano_speed:section() == "nano_speed" then this.nano_speed_1() end end Все работает, все прекрасно. Однако решил убрать это, дабы без костюма, ГГ не мог юзать предмет nano_speed. Затем был вчера мой пост тут, получил ответы (за что большое спасибо всем), сегодня попробовал предложенные ф-ии, остановился на ф-ии Gun12 и встретился с проблемой, которую описал выше (не работает вызов this.nano_speed_1()) Вроде бы все обьяснил... Извиняюсь за тавтологию. Используй, плз, для кодов тэг <code>, дабы сохранялось форматирование/отступы. --/Artos Изменено 13 Мая 2012 пользователем Artos Поделиться этим сообщением Ссылка на сообщение
volazar 9 Опубликовано 3 Июня 2012 (изменено) Всем привет. Возникла нужда по сокращению кол-ва if-ов в функции. А именно: Спавню телепорты, пример ф-ии: function spawn_nano_tel_lim_24() local se_obj = alife():create("nano_tel_119",vector():set(-23.000,20.283,-121.000),13608,2996) xr_logic.pstor_store(db.actor, "nano_tel_119", se_obj.id) end И спавнов происходит иногда до 2-3 х десятков. Удаляю все созданные телепорты в конце, пример ф-ии: function del_nano_tel_lim(story_id) local aa = alife() local bb = xr_logic.pstor_retrieve local gg = db.actor local obj_1 = bb(gg, "nano_tel_84", -1) -- тут куча переменных для каждого ТП local tel_1 = aa : object(obj_1) if tel_1 then -- а тут иногда огромные лесенки из if-ов aa:release(tel_1, true) end end Решил упросить себе, да и игре жизнь. Появилась идея создать табличку, сделал ее, пример: local tbl_nano_tel = { -- Пишем глобальную табличку телепортов ["nano_tel_war"] = { -- подтабличка для 1 локации "nano_tel_1", "nano_tel_2", ........, ........ }, ["nano_tel_x16"] = { -- подтабличка для 2 локации "nano_tel_1", "nano_tel_2", ........, ........ }, .......... } Однако встала проблема, теперь телепорты не удаляются. Раньше я писал секцию телепорта, сейчас делаю так: function del_nano_tel_war(story_id) -- удаляем ТП с Варлаба local war = tbl_nano_tel["nano_tel_war"] -- объявим подтаблицу с нужными ТП local obj = xr_logic.pstor_retrieve(db.actor, war, -1) local tel = alife():object(obj) if tel then alife():release(tel, true) end end Что я сделал не так? Заранее спасибо. Изменено 3 Июня 2012 пользователем volazar Поделиться этим сообщением Ссылка на сообщение
volazar 9 Опубликовано 3 Июня 2012 (изменено) Zander_driver, Да я уже разобрался, Charsi подсказал. Только вот пост уже не смог отредактировать( Все оказалось просто, надо было добавить строку: for _, teleport_name in pairs (war) do Где war это объявленная ранее нужная подтаблица. И добавить end в конце. Проверил - все отлично удаляется. function del_nano_tel_war(story_id) local war = tbl_nano_tel["tel_war"]() for _, teleport_name in pairs (war) do local obj = xr_logic.pstor_retrieve(db.actor, teleport_name , -1) local tel = alife():object(obj) if tel then alife():release(tel, true) end end end ЗЫ: Я тут немного переделал (local war = tbl_nano_tel["tel_war"]()) - таблица хранится в отдельном файле, а не вместе с ф-ями удаления. А ф-ию спавна мне и надо по строковому. Так как телепорты спавнятся не все сразу, а друг за другом и из логики рестриктора. А вот с удалением и встал вопрос, чтобы упростить ф-ию. В общем всем спасибо. Пост на усмотрение модератора. Собственно вопрос не имеет никакой информативной ценности, т.к. допущена банальная ошибка/путаница с аргументом для вызываемой функции. Однако есть другой нюанс, о котором см. ниже. --/Artos Изменено 3 Июня 2012 пользователем Artos Поделиться этим сообщением Ссылка на сообщение
volazar 9 Опубликовано 3 Июня 2012 Artos, Извиняюсь за глупый вопрос, а как можно очистить pstor? Так как действительно, телепортов уже 112 штук. Поделиться этим сообщением Ссылка на сообщение
volazar 9 Опубликовано 7 Октября 2012 (изменено) Все доброго дня! Возможно ли проверить наличие у актора нескольких предметов, обращаясь к таблице? Т.е по такому типу: local check_list = { [1] = { i = {"item1", "item2"}}, [2] = { i = {"item3", "item4"}}, ....... } function check(p) local list = check_list[p] for _, v in pairs (list.i) do local item = db.actor:object(v) if item then ... end end end Однако проверяется только 1 предмет - item1. Чувствую, что нужно "грызть" for _, v in pairs (list.i) do, однако мозгов не хватает. Изменено 7 Октября 2012 пользователем volazar Поделиться этим сообщением Ссылка на сообщение
volazar 9 Опубликовано 7 Октября 2012 (изменено) Shredder, не совсем то получилось. Попробую объяснить подробнее: Если у актора есть 2 итема в рюкзаке (по первому полю таблицы), то совершаем какое то действие. Для проверки, поставил вызов на постоянный апдейт и добавил выдачу СМС при условии, что все ок. Что имеем: спавним 1 итем - сразу приходит СМС. Убираем его и спавним 2 итем - СМС приходит. Спавним 1 и 2 итем, СМС есть. Выкидываем 1 или 2 итем - СМС есть. Выкидываем все итемы - СМС нету. Подбираем 1 любой итем - СМС есть. Т.е если в рюкзаке есть какой то любой из этих 2 итемов - тогда действие. //////////////////////////// А нужно так: если мы имеем в рюкзаке именно 2 итема (а не 1 какой то из них), то только тогда действие. Изменено 7 Октября 2012 пользователем volazar Поделиться этим сообщением Ссылка на сообщение
volazar 9 Опубликовано 7 Октября 2012 *Shoker*, хм, действительно. Как всегда невнимательность... Спасибо! Поделиться этим сообщением Ссылка на сообщение
volazar 9 Опубликовано 10 Мая 2013 (изменено) следовательно - надо поставить его в sr_psy_antenna.script, Зачем его туда подставлять? У пси антенны уже прописан свой урон. Точно такое же влияние на пси здоровье, как и у контролера. Разве что оно постоянное, а не во время атаки. Вспоминайте Янтарь и Радар. Вам остается только заюзать схему sr_psy_antenna! Ну и по нужде прописать вывод всяких постэффектов как описал выше malandrinus. И получится не хуже атаки контролера, если не лучше. ЗЫ: Это хит wound. Подробнее описано в том же самом sr_psy_antenna.script. Изменено 10 Мая 2013 пользователем volazar Поделиться этим сообщением Ссылка на сообщение