ColR_iT 171 Опубликовано 14 Февраля 2011 TRAMP14, тебе же выше писали, если ты хочешь сравнить объект по секции (тип данных string), то сравнивать нужно так: local obj = db.actor:item_in_slot(6) local obj_section = obj:section() if obj_section == "stalker_outfit" then , если ты напишешь так: obj = db.actor:item_in_slot(6) if obj_section then , то ты просто проверишь, есть ли вообще, что нибудь в слоте! И таким образом ты можешь делать все, что позволяет класс, к которому принадлежит этот объект. obj - это экземпляр класса. Например, Карась - это экзепляр класса Рыба, а Щука - это уже другой экземпляр, того же класса! Через экземпляр класса ты можешь получить его имя: local obj_name = obj:name() , уникальный идентификатор объекта: local obj_id = obj:id() , позицию: local obj_position = obj:position() , гейм вертекс: local obj_gv = obj:game_vertex_id() и так далее и тому подобное. Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 14 Февраля 2011 (изменено) TRAMP14, данная функция db.actor:object("skaner") - вернет экземпляр класса из инвентаря по секции skaner, и если его нет, то что-то можно будет сделать. Синтаксически это правильно, но работать будет, если это уместно применить! В теме "справочник по функциям и классам" вот, что написано по поводу этой функции: game_object* object(string) - возвращает объект из инвентаря по секции, т.е. ты получишь тоже самое, что и local obj = db.actor:item_in_slot(6), только разница в том, что первый раз ты получаешь объект из инвентаря, а во втором из слота. Изменено 14 Февраля 2011 пользователем Куфзук Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 14 Февраля 2011 TRAMP14, таким образом ты получишь позицию актора, но только координаты, левел и гейм вертексы нужно находить отдельно. Присваеваешь переменной: local actor_position = db.actor:position() и можешь манипулировать. Например так: local actor_position = db.actor:position() if actor_position.x > 100 then получаем условие, если позиция актора, по координате Х, больше 100, производим действия. Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 27 Февраля 2011 (изменено) amik, (да и для других тоже будет полезным) от себя могу добавить, что радиус смарта или, по другому, гулага - не на что не влияет, лично я его ставлю в две еденицы. Раньше, в более ранних билдах, гулаг "захватывал" НПС под свою логику и дальность "захвата" был именно радиус, сейчас же это делается иначе. Изменено 27 Февраля 2011 пользователем Куфзук Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 10 Марта 2011 @"StreloK", ну для начала скажу, что инфопоршни доступны только для actora. Ну а вообще, тебе как это сделать нужно, какая ситуация? Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 11 Марта 2011 =VENOM=, а почему в ЛС? Я думаю очень многим она будет по душе. Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 13 Марта 2011 (изменено) Knyaz, так же как в ЧН не выйдет. Этой фичи в ТЧ просто напросто нет. Можно что-то подобное смастерить, если очень точно и тчательно покопаться и настроить логику. AKKK1, Смарткаверы - это спаун объект, который управляет анимациями NPC. Используется для создания сценок со сложной анимацией.Определение ПЫСов. Изменено 13 Марта 2011 пользователем Куфзук Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 8 Августа 2011 (изменено) Для Prozone97 Капрал Хикс, позволь тебя поправить, хотя даже не поправить, а дополнить. Чтобы рестриктор больше не проверял наличие в нем актора, нужно поставить перед выдачей инфопоршна nil, вот так: [logic] active = sr_idle [sr_idle] on_actor_inside = nil %+if_actor_inside% вместо выдачи инфопоршна (%+if_actor_inside%), можно выполнить функцию: [sr_idle] on_actor_inside = nil %=if_actor_inside% функция if_actor_inside должна находиться в файле xr_effects.script. Можно конечно произвести проверку и скриптово, но это сложнее и проверка будет выполняться всегда (хотя действие выполнится один раз), поскольку вызов функции придется вешать на апдейт актора. Что касаеться выполнения функции при получении какого либо предмета. Приблизительно так: В файле bind_stalker.script найти вот такую функцию function actor_binder:on_item_take (obj) и дописать в нее проверку, по такому типу: if obj:section() == "obj_section" and db.actor:dont_has_info("condition_info") then -- action db.actor:give_info_portion("condition_info") end где: obj_section - имя секции проверяемого предмета (например для АК-74 это wpn_ak74. Имя секции смотрим в конфиге предмета). action - вызов твоей функции. condition_info - инфопоршень, который ограничевает проверку на один раз. Т.е. получается, что если инфопоршня нет, производим провеку и выдаем инфопоршень, чтобы более действие не выполнялося. Если необходимо, чтобы проверка происходила постоянно убери проверку на инофпоршень. Оговорочка: это будет происходить, если актор подберет предмет сам (с земли, с ящика и т.д.), при трансфере, другими словами, при передачи предмета от кого-то к актору - это не сработает. Чтобы впринципе проверить наличие предмета в инвенторе, можно сделать так: function check_actor_inventory () actor = db.actor if actor and actor:object("item_section") ~= nil then -- action end end здесь: item_section - имя секции проверяемого предмета action - действия если предмет есть. Изменено 9 Августа 2011 пользователем ColR_iT Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 9 Августа 2011 (изменено) Prozone97, да и всем кому интересно. Вот скриптовая функция для проверки нахождения ГГ в определенной области: function distance_to_point (lname, pos_x, pos_y, pos_z, dist) local actor = db.actor -- определим текущую локацию, дабы не определять гейм и левел вертексы, хотя можно и их local lev_name = level.name() -- зададим точке наши координаты local point = vector:set(pos_x, pos_y, pos_z) -- проверим существует ли актор и находится ли он на нужной локации if actor and lev_name == lname then -- определим координаты актора local actor_pos = actor:position() -- чтобы сэконимить ресурсы ПК проверим квадрат расстояния между ГГ и точкой if point:distance_to_sqr(actor_pos) <= dist*dist then return true end return false end end Вызов функции следующий if distance_to_point ("l01_escape", -210.632614135742, -20.050708770752, -142.461120605469, 10) then l01_escape - имя уровня на котором нужно проверить вхождение ГГ в область координаты ставим свои, я поставил координаты места спавна Волка 10 - расстояние до нужной точки. Поскольку вероятность того, что ГГ пройдет именно через точку - очень низкая, то используем область, радиус которой и определяет параметр dist P.S. Если где-то ошибся поправьте пожалуйста. Спасибо Charsi за указаные ошибки. Изменено 9 Августа 2011 пользователем ColR_iT Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 17 Августа 2011 Виталкер, возможно ты и прописал логику как у Лиса, но ты не прописал параметры как у Лиса, а именно здоровье. В секции спавна твоего НПС пропиши ему здоровье ниже порогового значения в логике, например, как у Лиса:health = 0.280000001192093 Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 25 Августа 2011 Spezer, чтобы твои НПС реагировали на тебя как на врага при стрельбе по ним, тебе нужно делать для них гулаг или изменить логику вот так: Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 3 Сентября 2011 (изменено) desert, боюся тебя огорчить, но это скрипт самого ремонта и тут совершенно непонятно где, как и самое главное сколько раз используеться этот код. antreg, что у тебя не получается? Почитай вот эту статью: combat_ignore Изменено 3 Сентября 2011 пользователем ColR_iT Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 3 Сентября 2011 (изменено) Tris, panzyuza, Artos. Вы знаете - [known_info], действительно очень хорошо справляеться с тем, чтобы выдавать актору инфопоршни, непонятно почему, но это факт... Хотя почему не понятно: function loadInfo(npc, char_ini) -- Загрузка из кастом даты if char_ini:section_exist("known_info") then local n = char_ini:line_count("known_info") local result, id, value = 0,"","" for i=0,n-1 do result, id, value = char_ini:r_line("known_info",i,"","") give_npc_info(npc, id) end end -- Загрузка из генератора. local community_info = info_by_community[npc:character_community()] if community_info == nil then return end local rank = ranks.get_obj_rank_name(npc) local rank_info = info_by_rank[rank] if rank_info == nil then return end local tt = {} -- оставляем инфопоршны, которые есть и там и там. for k,v in pairs(community_info) do for kk,vv in pairs(rank_info) do if v == vv then -- Добавляем в список доступных знаний table.insert(tt, v) break end end end local size = table.getn(tt) for k = 1,math.min(size,3) do if math.random(100) >= 60 then local ii = tt[math.random(size)] give_npc_info(npc, ii) end end end function give_npc_info(npc, info) -- Даем НПС инфопоршны npc:give_info_portion(info) -- Проверяем есть ли озвученная история на этот инфопоршн, и если есть -- добавляем ее тоже if sound_theme.theme[info] ~= nil then if db.story_by_id[npc:id()] == nil then db.story_by_id[npc:id()] = {} end table.insert(db.story_by_id[npc:id()], info) end end Функция give_npc_info, выдает параметру npc инфопоршень, по всей видимости, если НПС не жив, в качестве этого параметра выступает actor. Есть еще один вариант - это секция on_use: on_use = use [use] on_info = %+infoportion% но инфопоршень будет выдан даже если вы соберетесь поговорить с этим НПС. Изменено 3 Сентября 2011 пользователем ColR_iT 1 Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 28 Сентября 2011 Строгое предупреждение от модератора ColR_iT abramcumner, если ты считаешь себя сильно взрослым и тебе кажется, что все вокруг ниже тебя, то будь любезен не будь выскочкой. Твоя цитата: Без проблем, сынок. Чем бы дитя не тешилосьне делает тебе чести - это раз, а во вторых - это нарушение правил (пункт 2.1 действующих правил форума). Что касается твоих, как ты утверждаешь, цитирую: "дополнений/исправлений" - является далеко не дополнением и, уж тем более, не исправлением. Вставлять свои "пять копеек" в ответ другого пользователя - не есть правила хорошего тона (о правилах форума речь не идет), поэтому если в чем-то не согласен - приводи факты и доказательства, а не поверхностные домыслы о том, как тебе это кажется. Потому как, судя из твоих слов, цитирую: В ЗП story_id из нет-пакета вообще не используется...можно сделать вывод, что ты не очень-то и понимаешь о чем идет речь, следовательно твои ответы трактуются как ... правильно - ложные, а как следствие - бесполезные убеждения, которые расцениваются как флуд. И исходя из всего этого, позволь мне тебя поздравить и наградить! Вот и награда: режим Reed Only на срок до трех суток. Спасибо за внимание. P.S. Все эти "дополнения" и остальные посты связанные с этим - потерты. Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 5 Октября 2011 (изменено) amik. 1. Радио. Я сталкивался с подобным вопросом и решение его существует... Дело в том, что для подобной логики, объект должен быть physic_destroyable_object, почему так - я не знаю, но это так. Еще один нюанс: вот это: snd = $no_sound вероятнее всего выдаст тебе ошибку, поскольку сюда необходимо писать не сами файлы, а звуковую схему из файла sound_theme.script, тебя должно интересовать ph_snd_themes. Если ты заглянешь туда, тебе сразу станет все предельно ясно, как и что в таком случае писать... Хорошим вариантом будет добавить свою звуковую тему, которая бы включала в себя звук какого-нибудь "шипения", мол после выстрела радио поломалось и зашипело Готовая схема будет выглядеть так: [logic] active = ph_sound on_hit = hit [hit] on_info = %+mil_priemnik_off% [ph_sound] snd = radio_music looped = true on_info = {+mil_priemnik_off}| ph_sound@end [ph_sound@end] snd = silence on_signal = sound_end| nil где silence - твоя звуковая сехма. 2. Охранник. Здесь не до конца ясно, что значит "не слушает команду path_walk"? Чего ты ждешь от этой схемы? Подозреваю, что она работает так, как нужно, смотри:[logic] ;ты ставишь активную схему walker1 active = walker1 ;задаешь реакцию на опасность danger = danger_ignore ;meet = meet [danger_ignore] ignore_distance = 0 ;активная схема [walker1] ;задаешь точки в которых будет стоять и куда смотреть path_walk = walk_soldier_bodyguard1 path_look = look_soldier_bodyguard ;игнорируем бой, причем всегда. combat_ignore_cond = always ;по истечении 50 секунд переходим на схему remark1 on_game_timer = 50 | remark1 ;перешли на схему [remark1] ;path_walk = walk_soldier_bodyguard1 ;path_look = look_soldier_bodyguard ;anim = guard ;куда смотрим - не понятно, вычисляется автоматически target = nil ;как встречаем ГГ meet = meet ;секция реакции на гг [meet] ;анимация в зависимости от расстояния до актора (если ближе 5 метров отыгрываем guard) (актор без оружия) meet_state = 5|guard ;тоже самое, только если актор с оружием в руках meet_state_wpn = 5|threat_fire ;на кого смотрим (ближе 5 метров - на актора)(актор без оружия) victim = 5|actor ;тоже самое, только ГГ с оружием в руках victim_wpn = 5|actor ;возможно ли заюзать персонажа use = true use_wpn = true Получается, что НПС стоит на точке walk_soldier_bodyguard1, после 50 секунд, он переходит на схему remark1, после срабатывает какой-нибудь денжер, а дальше все... перехода на схему walker1 ведь нету, после универсального комбата, НПС вернется к последней активной схеме, а это будет remark1. Так что все так, как ты сделал... Самым простейшим вариантом возврата НПС на свое место, является следующая схема: [logic] active = walker1 [walker1] path_walk = walk_soldier_bodyguard1 path_look = look_soldier_bodyguard По идее этого должно быть достаточно. Спустя некоторое время... У тебя точки path_look и path_walk не синхронизированы. Т.е. для того чтобы НПС понимал куда ему нужно смотреть в какой-то конкретной точке, нужна их синхронизация, которая осуществляется при помощи flags. У тебя выходит, что точка look_soldier_bodyguard не привязана не к какой точке пути. А еще у тебя сами точки пути не связаны. Поэтому сделай так: [look_soldier_bodyguard] points = p0 p0:name = wp00 p0:flags = 0x1 p0:position = -138.841918945313,-25.439302444458,-355.694732666016 p0:game_vertex_id = 19 p0:level_vertex_id = 116593 [walk_soldier_bodyguard1] points = p0,p1 p0:name = wp00 p0:flags = 0x1 p0:position = -135.914733886719,-25.439302444458,-359.351440429688 p0:game_vertex_id = 19 p0:level_vertex_id = 116591 p1:links = p1(1) p1:name = wp01 p1:position = -136.714736938477,-25.439302444458,-359.351440429688 p1:game_vertex_id = 319 p1:level_vertex_id = 102988 p1:links = p0(1) таким образом, когда НПС будет в первой точке wp00 пути walk_soldier_bodyguard1 он с вероятностью 100%, в течении 5 секунд бедет смотреть в эту точку, дальше перейдет на на точку wp01, после развернется и пойдет назад в точку wp00 и так далее по кругу. По поводу combat. Нет, этого не произойдет... Секция [combat] задает параметры боя, например можно выдать инфопоршень или запустить какую-либо функцию (но только из файла xr_effects.script). Также можно задать режим боя, таковых три: - движковый бой (стоит по умолчанию); - combat_type = {возможны условия перехода на данный режим боя} camper - по камперски; - - по монолитовски. Ах, да! Забыл про четвертый: - combat_type = {также возможны условия} zombied - как зомби (анимации здесь не при чем). Как ведет себя та или иная схема, я не проверял. Изменено 5 Октября 2011 пользователем ColR_iT дополнил... Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 5 Октября 2011 amik, да, я понял, что ты имеешь ввиду. К сожалению мне не встречались случаи, чтобы в секции [combat] было переключение на другую схему. Повторюсь, что данная схема лишь задает тип боя (см. выше), также можно сделать выдачу инфопорции или вызов функции когда НПС срывается в бой, например так: [logic] on_combat = combat [combat] on_info = %+infoportion% . Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 25 Октября 2011 FLIKER, а у тебя смарт с одной работой? Если нет, то для работы "пожарника" в файле gulag_xxx.script в функцию load_job нужно писать условие приёма на данную работу. Вот на примере работы Шустрого:t = { section = "logic@esc_lager_kamp1", idle = 0, prior = 16, state = {2}, online = true, in_rest = "", out_rest = "", predicate = function(obj_info) return obj_info.profile_name == "esc_shustryi" end } table.insert(sj, t) Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 25 Октября 2011 (изменено) FLIKER, постой, ты хочешь сказать, что в смарте три работы часовых и ты хочешь, чтобы они сидели у костра? По моему ты переоценил возможности движка Сталкера... Логику kamp, что ты написал в custom_data твоего НПС, он будет использоваться лишь в том случае, если не попадет под гулаг по тем или иным причинам. Добавлено спустя некоторое время... В нем три работы guard...Ты бы определился 3 или 4... В общем из предоставленной тобой информации, могу посоветовать изменить логику одному НПС так: [smart_terrains] none = true [logic] active = kamp [kamp] center_point = ds_lager_kamp_1 radius = 3 Изменено 25 Октября 2011 пользователем ColR_iT Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 12 Ноября 2011 Строгое предупреждение от модератора ColR_iT Вечер добрый, Дамы и Господа! Я смотрю меня тут ждали... Ну что же, дядяСаша... Опишу еще раз то, что тебе все хором сказали: Если ты чего-то не понимаешь - это не значит, что это бред! Можно было бы и задуматься над тем, что для других статьи на Wiki, почему-то не кажутся "рисовкой", как ты сумел выразиться, а для тебя это оказалось пустой писаниной. Ответ на этот вопрос прост - ты пытаешься прыгнуть выше своей головы! Многие собственноручно заползали на эту высоту и никому не показалось, что статьи от создателей игры, как то вяло реализуют их идеи. То что там написано это всего лишь инструмент для реализации твоих идей, если конечно ты сумеешь воспользоваться данным инструментом... По поводу твоего варианта массовки: если ты считаешь эти "танцы с бубном" "примитивным" вариантом, то ты в принципе не умеешь задаваться целью ставить вопрос, а следовательно и задачу, - правильно! Вот исходя из этого делай выводы, если, опять же таки, ты их правильно сделаешь... Правда делать это тебе придется наедине... надеюсь дней пяти будет достаточно. Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 12 Ноября 2011 Лёха_тц, в принципе так же как и остальные, вот только наличие 20 и более таких массивных объектов на одной локации, может привести к заметным лагам. При всём этом, есть большие минусы, один из которых - пользование этих объектов НПС, они не будут на них заходить (в случае с вышкой), поскольку на них отсутствует АИ сетка. Также, обязательным условием спавна, является наличие в модели хотя бы одной кости (подозреваю, что ты используешь сталкер_контент для СДК). Поделиться этим сообщением Ссылка на сообщение