Artos 99 Опубликовано 19 Декабря 2011 Поделиться Опубликовано 19 Декабря 2011 (изменено) losiara, если нет явных ляпов (например в ЗП номера слотов смещены на единицу), то скрипт должен работать. Но его неоптимальность не выдерживает критики ... Попробуй вот это: local idOutfit = nil --/ ID надетого костюма function prov_npc() local oActor = db.actor --/ кешируем объект актора local oOutfit = oActor and oActor:get_current_outfit() --/ объект костюма на акторе local sCommunity = "actor" --/ для 'голого' актора if oOutfit then --/ костюм надет if oOutfit:id() == idOutfit then --/ костюм не сменился? return --/> костюм прежний else --/ сменялся - определяем группировку idOutfit = oOutfit:id() --/ запоминаем ID надетого костюма --/ таблица соответствий группировок костюмам (секциям) local tCommunityByOutfit = { ["bandit_outfit"] = "bandit", ["specops_outfit"] = "military", ["dolg_outfit"] = "dolg" } --/ определяем группировку соответвующую текущему костюму sCommunity = tCommunityByOutfit[oOutfit:section()] or sCommunity end elseif idOutfit then --/ а был ли костюм? idOutfit = nil --/ костюм снят - чистим else --/ уже 'голенький' return --/> end if sCommunity ~= oActor:character_community() then --/ если еще не в группировке oActor:set_character_community(sCommunity, 0, 0) end end Если и это не будет работать - ищи сторонние причины. P.S. Еще чуток подправил, дабы и 'голенького' обрабатывать ... Табличку можно из функции вытащить, если нет иных причин ее внутри держать. Изменено 19 Декабря 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
losiara 13 Опубликовано 19 Декабря 2011 Поделиться Опубликовано 19 Декабря 2011 Artos Благодарю за подсказку, поскольку опыт работы недостаточный, скрипты также выходят неоптимальные. Ну пока учимся. Да, использоваться будет на ТЧ, поэтому номер слота правильный. Попробую ваш вариант! Ваш вариант работает. Но я перепроверю и первый, наверняка где то что то упустил, хотя синтаксис и правильный. Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
Nazgool 250 Опубликовано 19 Декабря 2011 Поделиться Опубликовано 19 Декабря 2011 Artos Если бы я знал что это должно быть критично, то может быть написал бы так (как вариант) : function repair_precond_s2() local item_in_slot_2 = db.actor:item_in_slot(2) local item = item_in_slot_2 and item_in_slot_2:section() return t[item] and 1 > item_in_slot_2:condition() + 0.01 or false end Ссылка на комментарий
Artos 99 Опубликовано 19 Декабря 2011 Поделиться Опубликовано 19 Декабря 2011 Gun12 (пояснение не только для тебя) Из названия функции 'repair_precond_s2' (и исходного кода iDreD) можно предположить что она может быть использована в диалогах, экшенах квестов или подобных местах, т.е. вызываться не из скриптов, а непосредственно движком. Условие использования для подобых precondition довольно жестки и часто требуют только два варианта ответа: true или false. Любые другие возвраты от функций могут привоить к фатальным ошибкам, в том числе и безлоговым вылетам (файл лога пуст). Хотя ... само предназначение данной функции не располагает использовать в прекондишенах, а вероятно где-то в апдейте актора или коллбэке взятия, но в любом случае такая организация возврата не помешает (ИМХО). "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
TASTAN 1 Опубликовано 20 Декабря 2011 Поделиться Опубликовано 20 Декабря 2011 Подскажите как можно решить такую проблему: НПС смотрят не в центр костра(точка задана верно), а куда попало! Ссылка на комментарий
temakonkin 0 Опубликовано 21 Декабря 2011 Поделиться Опубликовано 21 Декабря 2011 Artos Просто возникла идея сделать "Сталкер браузер"..... За помошь с записью в переменную спасибо)))) Окно редактирование текста для ссылки ясделал, но окно для открытия интернет страниц так и не нашёл...... Сталкер в душе - сталкер по жизни! Ссылка на комментарий
_Призрак_ 11 Опубликовано 21 Декабря 2011 Поделиться Опубликовано 21 Декабря 2011 Нет, такое не получится. У тебя есть только два варианта реализации твоей задумки 1. Написать на ассемблере функцию позволяющую скачивать интернет страницы. На практике это практически невозможно 2. Написать dll, которая при помощи перехватчика от alpet/отредактированных длл будет выходить в интернет и скачивать страницу. Оба варианта сложны и мало кто это может сделать Freedom Ссылка на комментарий
Полтергейст 38 Опубликовано 21 Декабря 2011 Поделиться Опубликовано 21 Декабря 2011 (изменено) Сегодня пытался сделать обход аномалий с помощью отслеживания звуков, но по какой-то причине аномалии не добавляются в рестрикторы... Почти весь код реализован в одной функции. Формат таблицы self.anomaly: self.anomaly[anom_id] = name anom_id - id аномалии, name - её имя. function motivation_binder:hear_callback(npc, who, sound_type, sound_position, sound_power) if npc == nil or obj == nil then return end local who_id = who:id() if who_id == npc:id() or sound_position == nil then return end local cls = who:clsid() if cls == clsid.zone_mbald_s or cls == clsid.zone_mincer_s or cls == clsid.zone_galant_s then local who_name = who:name() local dist = sound_position:distance_to(npc:position()) if dist <= 45 and self.anomaly[who_id] == nil then --' Аномалия уже близко, но ещё не добавлена в рестрикторы - добавляем. self.anomaly[who_id] = who_name self.object:add_restrictions("", who_name) elseif dist > 55 and self.anomaly[who_id] ~= nil then --' Аномалия была добавлена в рестрикторы, но уже далеко - удаляем self.object:remove_restrictions("", who_name) self.anomaly[who_id] = nil end end end При вызове net_destroy или death_callback все аномалии удаляются из рестрикторов и таблица очищается. Коллбек hear_callback ставится где надо и вызывается (проверено). Никак не пойму, что здесь неправильно. Изменено 22 Декабря 2011 пользователем ColR_iT Ссылка на комментарий
Artos 99 Опубликовано 21 Декабря 2011 Поделиться Опубликовано 21 Декабря 2011 Полтергейст, все банально просто: в первой же проверке по необъявленной obj ты прерываешь функцию. Вероятно ошибся и должно использоваться who из входных аргументов. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
student91122 1 Опубликовано 22 Декабря 2011 Поделиться Опубликовано 22 Декабря 2011 (изменено) Помоги изменить скрипт "Ограбление ГГ во время сна".Надо сделать так, когда ГГ спит на базе то его не грабят.И ище,как сделать чтоб и на других локах происходило ограбление function robbery() local chance = 0.4 if math.random() < chance and db.actor:money() >= 1000 and level.name()=="zaton" then robbery_scheme.rob_enemies() end end function rob_enemies() if (not has_alife_info("kingpin_gained") and not has_alife_info("sim_stalker_help_harder")) then robbery_scheme.stealing_money() end if (has_alife_info("kingpin_gained") and not has_alife_info("sim_stalker_help_harder")) then return end if (not has_alife_info("kingpin_gained") and has_alife_info("sim_stalker_help_harder")) then return end end function stealing_money() local money = db.actor:money() local money_robbed = money*(math.random(1,4)/10) db.actor:give_money(-money_robbed) robbery_scheme.message_robbery() end function message_robbery() local texture = "ui_iconsTotal_lost_money" local text = "st_you_robbed" db.actor:give_game_news(game.translate_string("st_tip"), text, texture, 1000, 5000) local snd=sound_object([[device\pda\pda_tip]]) snd:play_no_feedback(db.actor,sound_object.s2d, 0, vector():set(0, 0, 0), 2.0) end Изменено 22 Декабря 2011 пользователем ColR_iT Ссылка на комментарий
alkogolik 43 Опубликовано 22 Декабря 2011 Поделиться Опубликовано 22 Декабря 2011 (изменено) Добрый день! Подскажите камрады. Как мне повесить на железную дверь с конкретной логикой хит, чтобы после стрельбы по ней, вызвать поршн либо функцию. Из оригинального ТЧ скрипта ph_door.script есть значение hit_on_bone, но не пойму чет, как работает? Если в самом скрипте ph_door.script правку сделать? st.hit_on_bone = utils.parse_data_1v(npc, utils.cfg_get_string(ini, section, "hit_on_bone", npc, false, "")) end Изменено 22 Декабря 2011 пользователем alkogolik Ссылка на комментарий
Tris 9 Опубликовано 22 Декабря 2011 Поделиться Опубликовано 22 Декабря 2011 student91122 Чтобы грабили на других локациях убери это: and level.name()=="zaton" • Dead Forgetting Zone • Мои работы. Обновление: 24.08.2012 Ссылка на комментарий
Полтергейст 38 Опубликовано 22 Декабря 2011 Поделиться Опубликовано 22 Декабря 2011 Вероятно ошибся и должно использоваться who из входных аргументов. Исправил - всё равно не работает. Судя по тому, что выводилось в лог, коллбек "воспринимает" только сталкеров, монстров и (почему-то) детектор игрока. Поэтому такой способ определения аномалий, к сожалению, не годится. Ссылка на комментарий
ColR_iT 171 Опубликовано 22 Декабря 2011 Поделиться Опубликовано 22 Декабря 2011 (изменено) alkogolik, выдать инфопоршен или выполнить функцию можно, но только при стрельбе не по любой точке двери. hit_on_bone, работает с костями (в названии это видно), в скрипте написано следующее: if self.st.hit_on_bone[bone_index] ~= nil then таким образом, нужно попасть в кость с индексом, который указан в схеме. Сама схема выглядит примерно так: hit_on_bone = 1|{+infoportion =function} это вставляешь в активную схему на момент стрельбы и получаешь, что при стрельбе по кости (вероятно это место, где должен быть замок) ты получаешь инфопоршен или выполняется указанная функция. Для bone_index лично я нашел всего два значения, которые использовали ПЫС - это 1 и 2. Изменено 22 Декабря 2011 пользователем ColR_iT Ссылка на комментарий
alkogolik 43 Опубликовано 22 Декабря 2011 Поделиться Опубликовано 22 Декабря 2011 ColR_iT, спс! А если hit_on_bone = 2 , то получается 2 части, т.е. 2 индекса? Не помню точно, но видел. Я решил таким способом: Переделал двери из physic_object в physic_destroyable_object Хит работает по всей двери. Делал по принципу мегафонов. По индексу даже интересней для сюжета, только не понял сразу, о каких костях идёт речь. Ещё раз спасибо! Ссылка на комментарий
Wik 0 Опубликовано 23 Декабря 2011 Поделиться Опубликовано 23 Декабря 2011 Всем привет, у меня к вам несколько вопросов: 1. Что нужно писать в логике, чтобы несколько анимации проигрывались одна за другой. 1-я, 2-я, и опять 1-я, 2-я, короче по кругу 2. Можно ли заставить НПС смотреть в ту сторону, в которую я захочу (direction в all.spawn), если спавниш его через скрипт, или это возможно только через all.spawn. 3. Может это вопрос не по теме, хотя он может, связан с логикой НПС, суть вот в чем можно ли сделать костюм с параметром скрытность или маскировка, чтобы ГГ в таком костюмчике был менее заметен для НПС. Ссылка на комментарий
Полтергейст 38 Опубликовано 23 Декабря 2011 Поделиться Опубликовано 23 Декабря 2011 Можно ли заставить НПС смотреть в ту сторону, в которую я захочу (direction в all.spawn), если спавниш его через скрипт Это только начальное направление взгляда при спавне. Как-то можно это сделать через net_packet'ы, но проще воспользоваться функцией set_desited_direction(вектор_направления_взгляда). Вот только не знаю, относительно чего этот вектор задаётся - посмотри в логических схемах (скриптах) или в том же state_mgr примеры использования. Ссылка на комментарий
Wik 0 Опубликовано 23 Декабря 2011 Поделиться Опубликовано 23 Декабря 2011 С 1-м вопросом я разобрался, прошу помощи с остальными. Заранее блогодарен. Добавлено через 3 мин.: Полтергейст спасибо за ответ. Ссылка на комментарий
losiara 13 Опубликовано 23 Декабря 2011 Поделиться Опубликовано 23 Декабря 2011 (изменено) Wik По второму вопросу смотря что тебя интересует, можно через логику в ремарковской схеме: target = Куда смотрит сталкер. Есть следующие варианты story_id – числовое значение actor – без комментариев nil – позиция вычисленная АИ автоматически <имя работы>,<имя гулага> смотреть на сталкера который находится на определенной работе под гулагом (второй параметр необязателен. В этом случае берется гулаг сталкера, для которого задана данная секция ремарка). Пример: target = logic@cit_killers_base_guard, cit_killers <path_name>, <point_number> - можно указывать смотреть в вершину патрульного пути (<имя пути>, <имя точки>). Например: [smart_terrains] none = true [logic] active = remark1 danger = danger_ignore [danger_ignore] ignore_distance = 5 [remark1] no_move = true target = actor; или что тебе необходимо по примеру выше! Изменено 23 Декабря 2011 пользователем losiara Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
Wik 0 Опубликовано 23 Декабря 2011 Поделиться Опубликовано 23 Декабря 2011 (изменено) К стати полный список анимаций находиться в файле state_lib.script.(тч, зп, чн-не знаю) Добавлено через 15 мин.: Может кому-то это известно, но я не знал (может, поможет, кому не будь такому как я) В топике "Ковыряемся в файлах" подобное может и уместно, но для темы данного - 'мусор'. --/Artos losiaraспаибо, а story_id вбивать story_id нпс, например target = 1000 Да. --/Artos Добавлено через 3 мин.: Спасибо еще раз всем, кто мне помог!!!!!!!! Изменено 24 Декабря 2011 пользователем Artos Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти