Kirgudu 1 179 Опубликовано 3 Июня 2013 (изменено) Wo1fRam, метод запуска звука play_no_feedback не даёт обратной связи (что явно следует из его названия, кстати). Ты просто дал команду проиграть звук и далее этот процесс не может быть подвержен твоим запросам (например, попытке проверить статус проигрывания).Чтобы иметь возможность обращаться к запущенному процессу, следует использовать методы play или play_at_pos, примерно так: local snd_obj = sound_object("affects\\tinnitus3a") snd_obj:play(db.actor, 0, sound_object.s2d) ... if snd_obj:playing() then snd_obj:stop() end Изменено 3 Июня 2013 пользователем Kirgudu 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 3 Июня 2013 (изменено) Нет, это задержка перед началом проигрывания звука. А громкость в данном случае можно перед проигрыванием установить так: snd_obj.volume = 2 Правда, лично я не проверял, работает ли это.Ну или, как вариант, по-прежнему пользоваться методом play_no_feedback, но без проверок на статус проигрывания. Изменено 3 Июня 2013 пользователем Kirgudu Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 2 Июля 2014 , я не совсем понял, ты хочешь, чтобы НПС в первой фразе актор диалога выдал нужные тебе слова вместо автогенерируемых?Можно сделать небольшой финт ушами: <dialog id="actor_dialog_1"> <phrase id="0"> <!-- Текст пустой, поэтому первая фраза актора в этом диалоге пропускается --> <text></text> <next>1</next> </phrase> <phrase id="1"> <!-- А вот тут выдаём нужную фразу НПС, например, вопрос: --> <text>Ну что, согласен на моё предложение?</text> <next>11</next> <next>12</next> </phrase> <phrase id="11"> <text>Да.</text> </phrase> <phrase id="12"> <text>Нет.</text> </phrase> </dialog> Таким образом, при старте диалога ты получишь 2 фразы НПС: «Привет! Ну что, согласен на моё предложение?». Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 3 Июля 2014 @STRELOK-stalker, возможно, это из-за длины строки. Если это так, аналогичная ошибка будет на фразе 10. Попробуй длинные фразы (>256 символов) не прямо в диалоге прописывать, а перенести их в xml с текстами. 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 17 Июля 2014 (изменено) @AndreySol, on_info = {+val_escort_scene_end} | patrol@val_escort_npc2_leave следует писать так: on_info = {+val_escort_scene_end} patrol@val_escort_npc2_leave Разделитель «|» лишний. Аналогично в остальных случаях использования on_info. Пример правильного использования, кстати, есть у тебя же в логике второго ведомого. Изменено 17 Июля 2014 пользователем Kirgudu Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 12 Августа 2014 (изменено) @AndrewMor, не надо путать рюкзак как предмет инвентаря, и рюкзак как некий ящик, в который можно что-то складывать - это разные вещи. При использовании инвентарного рюкзака необходимо спавнить скриптом рюкзак-ящик по текущим координатам (функцию спавна повесить на коллбек, например, use_object, правда, не в курсе, есть ли такой в ТЧ - в ЧН есть). В свою очередь, секция рюкзака-ящика в его конфиге должна наследовать секцию inventory_box и, кроме того, иметь кастом дату, которая в ЧН берётся из файла «treasure_inventory_box.ltx». Если в ТЧ есть аналогичные ресурсы, в принципе, в поисках по Солянке можно отталкиваться от них.Точнее подсказать не могу, так как работаю с ЧН. Может быть, кто-то меня дополнит или поправит. Изменено 12 Августа 2014 пользователем Kirgudu Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 13 Августа 2014 (изменено) @AndrewMor, примерно так: local obj = alife():create(...) --/ твой спавн рюкзака-ящика level.map_add_object_spot_ser(obj.id, "my_treasure", "%c[255,255,255,255]Мой тайник")где "my_treasure" - название элемента метки в конфиге меток (в ЧН это gamedata\configs\ui\map_spots.xml, в ТЧ должно быть что-то аналогичное), которое можно заменить на название любой из существующих меток. Но советую добавить свою, чтобы её легко можно было обнаружить на карте. Изменено 13 Августа 2014 пользователем Kirgudu Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 15 Августа 2014 Проще так: on_info = {+info1} walker@next, {+info2} walker@next 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 4 Сентября 2014 @stalk9r, и не должна работать.text = "..obj.." - это присвоение именно той строки, которая указана между кавычками. Никакой отсылки к полученному объекту тут нет. Надо так: local obj = alife():story_object(12345) if obj then text = obj:name() end 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 14 Октября 2014 @Romann, не занимайся ерундой. Если ты для того, чтобы проделать какие-то действия с единственным НПС, будешь каждый раз перебирать все игровые объекты, да ещё и размножишь потом такой перебор в сотне мест (а что, по-другому ведь не получилось, а так работает) - мод будет тормозить постоянно. Это крайне плохая практика.Лучше сделай так, как тебе советовали выше - добавь в xr_effects.script функцию, а её вызов в логику НПС. Например, в ремарк с анимацией: [remark@suicide] anim = suicide on_signal = anim_end | nil %=npc_suicide% Сама же функция будет примерно такая, как написал @_Val_: function npc_suicide(actor, npc, p) npc:kill(npc) -- плюс любые другие действия end 1 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 16 Октября 2014 @nego, это прибавка к максимальному весу, после которого игрок не сможет не только бегать, но и сдвинуться с места. Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 1 Декабря 2014 (изменено) @Хемуль36рус, для амёбы надо задавать свойства idle_animation и attack_animation. Например, если спавнишь скриптом и используешь модуль нетпакетов Артоса (я выкладывал недавно ссылку на модуль с исправлением найденных ошибок в Скриптовании), это может выглядеть так: local sobj = alife():create('zone_ameba', pos, lvid, gvid) local pk = get_netpk(sobj,1) if pk:isOk() then local data = pk:get() data.shapes:addSphere(5, vector():set(0,0,0)) data.idle_animation = 'idle' data.attack_animation = 'blast' pk:set(data) end Изменено 1 Декабря 2014 пользователем Kirgudu Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 25 Декабря 2014 Кроме того, проверкой во внешнем скрипте if (mobile_binder.initialized) == true then ищется переменная initialized в модуле mobile_binder.script (может не быть модуля, либо переменной в нём - отсюда и ссылка на nil), в то время как здесь function mobile_binder:__init( obj ) super( obj ) self.object = obj self.initialized = false значение присваивается свойству экземпляра класса mobile_binder, а не переменной скриптового модуля. Для правильной проверки надо во внешнем скрипте сначала получить доступ к этому экземпляру класса, а затем уже читать его свойства. 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 25 Декабря 2014 @makdm, не всё так однозначно. Этот пример годится только в том случае, если биндер один и инициализируется один раз. А если много и если один экземпляр может быть в данный момент времени инициализирован, а другой - нет? Яркий пример - биндеры любых множественных объектов в игре, таких как НПС, монстры, аномалии и т. д. Файлов ТЧ под рукой нет, но подозреваю, что mobile_binder относится как раз к такому типу. В таком случае надо начинать плясать от конкретного объекта. Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 27 Февраля 2015 (изменено) @NL-Vincenz, если нужен только эффект опьянения, то как-нибудь так: level.add_pp_effector("alcohol.ppe", 20081020, false) А если надо ещё и озвучить, то можно заспавнить объект "vodka" в инвентаре актора и тут же его употребить. Что же касается второго вопроса, запрет выхода из диалога нужно прописывать в настройках схемы meet логики того персонажа, диалог с которым нельзя прерывать: [meet] allow_break = false Если этот диалог не единственный, причём остальные прерывать можно, в логике может присутствовать несколько секций настройки схемы meet с отличающимися настройками диалогов, например: [meet] meet_dialog = {условия} dialog_1, {другие условия} dialog_2 allow_break = true [meet@no_break] meet_dialog = dialog_3 allow_break = false Использование той или иной схемы следует назначить в логике в зависимости от требований. Поправка: похоже, с allow_break я погорячился, спутав платформу с ЧН/ЗП. Если в ТЧ данной опции нет, тогда такой способ не пойдёт. Написанное в спойлере прошу считать недействительным для ТЧ. Изменено 27 Февраля 2015 пользователем Kirgudu 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 20 Марта 2015 (изменено) @UnLoaded, для переноса строки в назначаемой скриптом кастом дате следует использовать "\n". Да, ты уже и сам догадался. Для изменения story_id необходимо поработать с абстрактной частью нет-пакета, которая доступна только в момент выхода объекта в онлайн или при сохранении. За инструкцией лучше всего обратиться к руководству от автора: Про специальный нет-пакет 'abstract': Библиотека может работать с абстрактной частью пакета, которая доступна ТОЛЬКО в момент выхода объекта в онлайн или сохранении.Поэтому напрямую (методами set и get) прочитать и записать такие данные нельзя.Для чтения и/или изменения используется специальный пакет 'net_abstract'.Хотя принцип работы отличается от работы остальных классов, но все же очень похож. Исключение составляет то, как изменять данные в пакете.Рассмотрим сразу на примере:а) создаем объект в игре: local obj = alife():create("exo_outfit", pos, lv, gv) б) получаем служебный пакет, которым будем менять свойства: local pk = m_netpk.get(obj,0) -- или m_netpk.net_cse_abstract(obj) в) вариант-1: используем функцию: pk:setCallback( function(data) data.direction = vector():set(1,1,1) end ) вариант-2: задаем желаемые изменения таблицей: pk:setCallback( {direction = vector():set(1,1,1)} ) Здесь мы создали объект и захотели изменить его абстрактную часть.Мы указали пакету коллбек, который будет передан основному коллбэку, будучи вызванам как только станет доступна абстрактная часть объекта.В колбек передается таблица с параметрами пакета, мы можем смело их менять, в примере мы наклонили объект по всем осям на 1 радиану.При спавне нового игрового объекта:изменения вступят в силу, как только мы выйдем из текущей скриптовой работы и управление вернется движку - он создаст объект и начнет записывать в него параметры.Для уже существующих объектов в игре:требуется после задания изменений свойст объекта, перевести объект в оффлайн и обратно в онлайн, что модулем делается автоматически.Изменения вступят в силу в момент выхода объекта в онлайн.Как получить возможность менять абстрактную часть пакетов?1) этот тип объектов должен иметь класс, который представляет такой тип объектов в игре (можно назвать биндером, а можно никак не называть)(то есть то, что будет вызвано, когда объект появится в игре)Завязка из class_registrator.script: cs_register (object_factory, "CStalkerOutfit", "se_item.se_outfit", "E_STLK", "equ_stalker_s") 2) обязательно добавить (если таковой отсутствует) метод биндера 'STATE_Write' (см. скрипты типа: 'se_XXX.script')Для примера с костюмом: function se_outfit:STATE_Write(packet) cse_alife_item_custom_outfit.STATE_Write(self, packet) end 3) В метод STATE_Write (см. выше) добавить строку: function se_outfit:STATE_Write(packet) if self.cb_netpk then self.cb_netpk(self, packet) end -- коллбэк для изменения свойств пакета cse_alife_item_custom_outfit.STATE_Write(self, packet) end Выполнение этих действий ОБЯЗАТЕЛЬНО. Зачем это нужно? Ну, например, можно поменять дирекшн или позишн, так как это read_only свойства объектов.А позишн при спавне смещается так, чтобы объект находился на ИИ сетке.То есть, можем спавнить всякие там лампочки, физические объкты так, чтоб они оказывались повернутыми в пространстве.Так же можно менять те свойства, которые, обычно, только для чтения. Например story_id, или position. Но такие вопросы больше относятся к теме «Скриптование». Изменено 20 Марта 2015 пользователем Kirgudu Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 19 Мая 2015 @RafMadMan, очевидно, что отсутствует функция «on_item_drop», вызываемая в строке 236 модуля «bind_stalker».Что делать? Запускать сравнение файлов «до» и «после» и проверять как и что совмещалось в скриптах. Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 22 Мая 2015 @NL-Vincenz, <has_info>nl_dialog_bar_voronin</has_info> <dont_has_info>nl_dialog_bar_voronin</dont_has_info> Взаимоисключающие условия. То же самое во втором диалоге. 1 1 Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 22 Мая 2015 @NL-Vincenz, почему-то мне кажется, что данный вопрос относится не к ТЧ, а всё-таки к ЧН. Если это так, прошу подтвердить - перенесу посты в соответствующую тему. Ну а если речь действительно о ЧН, то необходимо не только установить группировку ГГ, но и в свойствах самой группировки обозначить, что она - группировка игрока. Делается это комплексным методом симуляции sim_board:set_actor_community() примерно так: sim_board.get_sim_board():set_actor_community("dolg") Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 179 Опубликовано 22 Мая 2015 @NL-Vincenz, а действительно, проверь наличие закрывающих скобок. Вполне возможно, что из диалога вылета не будет, но и функция не запустится. 1 Инструмент Поделиться этим сообщением Ссылка на сообщение