Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий
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 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти