Полтергейст 37 Опубликовано 25 Декабря 2011 Поделиться Опубликовано 25 Декабря 2011 (изменено) Выкладываю свой код по частям. 1) Фрагмент из биндера NPC (xr_motivator) (в функции net_spawn сразу осле установки коллбеков) if se_zones.level_anomalies[self.level_id] == nil then se_zones.level_anomalies[self.level_id] = {} else for name, anomaly in pairs(se_zones.level_anomalies[self.level_id]) do anomaly:register_npc(self.se_obj) end end 2) Фрагменты из se_zones Таблица аномалий по уровням, добавление и удаление level_anomalies = {} ... function se_zone_anom:on_register() cse_anomalous_zone.on_register(self) self.zone_for_npc = {} local anom_vertex = game_graph():vertex(self.m_game_vertex_id) self.level_id = anom_vertex:level_id() if level_anomalies[self.level_id] == nil then level_anomalies[self.level_id] = {} end ... end function se_zone_anom:register_npc(npc) f self.zone_for_npc[npc.id] ~= true then self.zone_for_npc[npc.id] = true alife():add_in_restriction(npc, self.id) end end function se_zone_anom:unregister_npc(npc, force) if self.zone_for_npc[npc.id] ~= nil or force == true then self.zone_for_npc[npc.id] = nil alife():remove_in_restriction(npc, self.id) end end Проблема в том, что вызывать unregister_npc() для каждой аномалии не очень хорошо в плане тормозов. Хотел заменить на вызов remove_all_restrictions(...), чтобы удалить все сразу, но эта функция совсем виснет. Вторая проблема - если сохраниться рядом с NPC, которому уже добавлены рестрикторы, то при загрузке этого сохранения добавление будет вызвано ещё раз. В идеале неплохо было бы сделать так, чтобы в сохранения всё это вообще не записывалось, но как именно - пока не придумал. Изменено 25 Декабря 2011 пользователем Полтергейст Ссылка на комментарий
Artos 99 Опубликовано 25 Декабря 2011 Поделиться Опубликовано 25 Декабря 2011 (изменено) Полтергейст, обычно начинают с начала а не с конца ... т.е. говорят что хотят сделать/получит, а не то что ради этого делалось и неполучилось. Без того что же ты хочешь сделать (идеи/алгоритма) толку от приведенных кодов маловато ... P.S. Вот тебе набросок из моего мода касательно этого вопроса (применим для ТЧ/ЧН): function Clear_Restriction(oNPC) if oNPC:alive() then local sInRestrictions = oNPC:in_restrictions() --/ читаем список рестрикторов 'in' if sInRestrictions ~= "" then local tToRemove = {} for sRest in sInRestrictions:gmatch('%s*[^,]+%s*') do --/ разделяем имена по запятым local oRestr = alife():object(sRest) --/#!# for SHOC|CS if oRestr and Is_ZoneAnom(oRestr) then --/#!# функция проверки что oRestr - аномалия table.insert(tToRemove,sRest) end end if next(tToRemove) then local sToRemove = table.concat(tToRemove,',') --/ строка 'удаляемых' у объекта рестрикторов oNPC:remove_restrictions("",sToRemove) end end else --/ мертв oNPC:remove_all_restrictions() end end - более подробно смотри в моде, где и нет-пакетоми дублирую чистку. Изменено 25 Декабря 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
*Shoker* 322 Опубликовано 26 Декабря 2011 Поделиться Опубликовано 26 Декабря 2011 (изменено) Сейчас столкнулся с такой интересной бякой на ЧН, ищу её решение и решил спросить, вдруг кто сталкивался. У меня в моде присутствуют НПС, которые появляются на карте случайным образом (не как сквады) И вот в момент перехода одного такого НПС в онлайн (самый обычный сгенерированный сталкер) игра просто зависает. Видно, как он появляется в онлайне (ещё без оружия в руках) и всё ... Само собой после зависона лога никакого нету. Я расследую тока один случаи, но мне известно, что были как минимум два других. Я ещё буду смотреть инвентарь этого НПС, но из того необычного, что я знаю сейчас это то, что он заспавнился совсем рядом с аномалией (но не в 1 с ней точке) Я пробовал удалять аномалию, но вылет остался. Другие два места я пока ещё не смотрел. Обхода аномалий у меня нету, ничего с рестрикторами я сам не делал. В ранних версиях у меня с такими случайными НПС ничего подобного небыло, теперь ищу причину. Может у кого был похожий случаи? Изменено 26 Декабря 2011 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
basil 102 Опубликовано 26 Декабря 2011 Поделиться Опубликовано 26 Декабря 2011 (изменено) Доброго времени суток! Прошу помощи! Мне нужно, чтобы после выдачи определённого инфопоршня, бандиты стали нейтралами по отношению к главному герою. При вызове данной функции происходит безлоговый вылет: function set_freedom_enemy (player, stalker) relation_registry.set_community_goodwill ("bandit", db.actor:id (), +5000) end В чём может быть проблема? Изменено 1 Января 2012 пользователем ColR_iT Ссылка на комментарий
bill_gates 1 Опубликовано 27 Декабря 2011 Поделиться Опубликовано 27 Декабря 2011 (изменено) basil, кажется в +5000 стоит убрать + и все заработает. Аккуратнее в советах. СтОит порой промолчать, дабы не советовать ошибочное иль бесполезное. --/Artos Изменено 27 Декабря 2011 пользователем Artos Ссылка на комментарий
Wik 0 Опубликовано 27 Декабря 2011 Поделиться Опубликовано 27 Декабря 2011 Подскажите, я спавню НПС через скрипт, после перестрелки НПС остаются там, где закончили бой, а на точки своего спавна не идут. Что делать с логикой? Заранее благодарен. Ссылка на комментарий
Artos 99 Опубликовано 27 Декабря 2011 Поделиться Опубликовано 27 Декабря 2011 *Shoker*, твой вопрос из области погадалок ... В чем похожест? В том, что при спавне объекта -> ошибка -> вылет? Да такого как снега у каждого разработчика. :-) Без доп.информации бессмыселенно гадать-предполагать. Единственное: то, что ты успеваешь заметить заспавнившего дает возможность предположить, что функции инициализации объекта все же проходят, а вот потом - тут и ошибки штатной логики иль те же ошибки в инфентаре иль пр. basil, чтобы стали нейтралами нужно задавать не +5000 (лепшие друганы), а 0 (ноль). Но по любому вылета именно от этой операции не должно быть. Раз вылетает - ищи коллизию в других кодах, когда бандиты-нейтралы приводят к ошибкам. Wik, что делать с логикой? Да задать ее такой, какой хотелось бы, а не куций ремарк ... (как предполагаю в твоем случае). Хочешь чтобы были в точке спавна в любом случае - используй схему 'walker'. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
losiara 13 Опубликовано 27 Декабря 2011 Поделиться Опубликовано 27 Декабря 2011 (изменено) Прошу прощения, что бы у товарища не возникало вопросов, самую малость дополню ответ куратора Artos Wik Схема ремарк не используется для постоянной работы НПС, как правило она является переходным этапом от одной к другой схеме. Вот логика, а точнее ее часть "заезженного бедного Волка" на локации Кордон! [logic@esc_lager_volk] active = walker@esc_lager_volk_walker1 ;активная в данный момент схема on_death = death@wolf ;что будет с неписем после его смерт [walker@esc_lager_volk_walker1] path_walk = wolf_walk ;путь где или куда ходит path_look = wolf_look ;куда смотрит - если прописывать валкера с несколькими точками, то это поле задавать необязательно! meet = meet@wolf ;поле для общения, диалога on_actor_dist_le = 23| {+tutorial_wounded_start -esc_kill_bandits_quest_kill} remark@esc_lager_volk1 ;условия для перехода в другую схему, в данном случае в ремарковскую при приблежении ГГ на расстояние 23 метра и выполнения (невыполнения) "+", ;"-" соответствующих инфопоршней on_actor_dist_le_nvis = 5| walker@esc_lager_volk_walker2 ;то же самое, только в схему валкера danger = danger_condition@shustryi ;поведение НПС в опасности (денжере) [remark@esc_lager_volk1] anim = hello_wpn ;анимация snd = esc_wolf_say_thanks ;проигрывающиеся звуковые файлы, конкретно это разговор Волка target = actor ;напрвление взгляда НПС on_signal = sound_end| walker@esc_lager_volk_walker2 ;поле для перехода НПС в другую схему по получению сигнала в данном случае окончание проигрывания музыкального (звукового) файла on_actor_dist_le_nvis = 5| walker@esc_lager_volk_walker2 ;уже объяснялось выше... danger = danger_condition@shustryi ;объяснялось... [walker@esc_lager_volk_walker2] path_walk = wolf_walk path_look = wolf_look meet = meet@wolf on_info = {+esc_kill_bandits_quest_have} remark@esc_lager_volk2 ;поле для перехода в следующую схему ремарк при получении НПС соот. инфопоршня +esc_kill_bandits_quest_have danger = danger_condition@shustryi Делай по анологии. Если тебе необходимо что бы НПС стоял на месте своего спавна, то пропиши ему одну точку path_walk = твое название, тогда даже в случае получения хита, он все равно вернется на свое место!!! Пути прописываются в all.spawn, way...название локации! Изменено 27 Декабря 2011 пользователем losiara Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
Artos 99 Опубликовано 27 Декабря 2011 Поделиться Опубликовано 27 Декабря 2011 losiara, Я даю ответы/советы не как от куратор (куратор может и не давать ответов по существу вопросов), а как такой же участник форума как ты и другие. Куратор скорее по форме вопросов иль отсутствию в них сути и т.п. высказывается. А дополнять пока ответ не было особенного смысла, т.к. совершенно неизвестно какая логика (если вообще это сделано) прописана неписю из вопроса Wik'а, это только мое предположение. Если есть желание более полно дать информацию по этой теме (ремарку-валку) - то можно просто дать отдельным от вопроса постом, а уж пригодится вопрошающему иль кому-то иному - это уже дело их. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
bill_gates 1 Опубликовано 27 Декабря 2011 Поделиться Опубликовано 27 Декабря 2011 Artos, я бы не стал делать столь поспешных выводов. Прежде чем написать пост выше я тестил функцию set_community_goodwill самостоятельно, вызывал ее из диалога. Если в последнем аргументе поставить плюс то функция не срабатывает, а если убрать или поставить минус, то все работает нормально, отношения меняются в положительную/отрицательную сторону. Смотрел как реализована эта функция в других модах (в частности в солянке), там в эту ф-цию тоже передавалось положительное значение без плюса. Ну по крайней мере так ф-ция ведет себя на ТЧ, насчет ЧН и ЗП не уверен, не пробовал. Ссылка на комментарий
gruber 2 481 Опубликовано 27 Декабря 2011 Поделиться Опубликовано 27 Декабря 2011 Схема "ремарк" хороша там, где нельзя заставить находится НПС ,прописав им пути,к примеру- из за отсутсвия АИ сетки в этом месте.Но кроме как стоять болванчиком на месте ,трудно заставить делать его что то еще. Ссылка на комментарий
Artos 99 Опубликовано 27 Декабря 2011 Поделиться Опубликовано 27 Декабря 2011 (изменено) bill_gates, извини, действительно несколько резко, но суть - даже если убрать синтаксическую ошибку с '+', то остается то, что действие задает не нейтральность бандитов, а максимальную дружелюбность, что неверно в контексте вопроса. Изменено 27 Декабря 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Wik 0 Опубликовано 27 Декабря 2011 Поделиться Опубликовано 27 Декабря 2011 Есть ли у кого подробная инструкция по добавлению аномалий на новые локации, для сталкера т.ч. Ссылка на комментарий
*Shoker* 322 Опубликовано 27 Декабря 2011 Поделиться Опубликовано 27 Декабря 2011 (изменено) Artos Если бы оно вылетало, это было бы фигня. Но у меня оно просто зависает, вся игра при спавне персонажа виснет. А это врятле "обычный" случаи. Изменено 27 Декабря 2011 пользователем *Shoker* Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О Мастер аномалий на свою заднюю точку. Ссылка на комментарий
losiara 13 Опубликовано 27 Декабря 2011 Поделиться Опубликовано 27 Декабря 2011 (изменено) Добрый день!!! Возник вопрос относительно логики рестрикторов. По задумке, при входе в рестриктор, проигрывается музыкальная композиция, а через 5 сек. начинается спавн монстров. Вот логика: [logic] active = sr_idle [sr_idle] on_actor_inside = {+new_restriktor} sr_sound %=spawn_zombie_x18% --функция спавна в xr.effects.scripts [sr_sound] snd = characters_voice\scenario\rnd_fallscream, characters_voice\scenario\rnd_moan, characters_voice\scenario\rnd_the_horror3, characters_voice\scenario\rnd_scr3, characters_voice\scenario\rnd_ratchant idle = 5 delay = 1 Инфопоршень также активирует работу рестриктора. Все бы ничего, но вначале появляются монстры, а потом проигрывается композиция, что не совсем то что мне нужно. Пробовал менять на следующее: [logic] active = sr_idle [sr_idle] on_actor_inside = {+new_restriktor} sr_sound [sr_sound] snd = characters_voice\scenario\rnd_fallscream, characters_voice\scenario\rnd_moan, characters_voice\scenario\rnd_the_horror3, characters_voice\scenario\rnd_scr3, characters_voice\scenario\rnd_ratchant idle = 5 delay = 1 on_timer = 10000 | sr_sound2 nil %=spawn_zombie_x18% [sr_sound2] snd = characters_voice\scenario\rnd_fallscream, characters_voice\scenario\rnd_moan, characters_voice\scenario\rnd_the_horror3, characters_voice\scenario\rnd_scr3, characters_voice\scenario\rnd_ratchant idle = 5 delay = 1 on_timer = 10000 | sr_sound3 [sr_sound3] snd = characters_voice\scenario\rnd_fallscream, characters_voice\scenario\rnd_moan, characters_voice\scenario\rnd_the_horror3, characters_voice\scenario\rnd_scr3, characters_voice\scenario\rnd_ratchant idle = 5 delay = 1 on_timer = 10000 | sr_sound2 Вылет с ссылкой на 20 строку g_скрипта, видимо связанный с nil значением в логике, поскольку происходит именно после первого звука в игре на переключении секций... Я так думаю. Еще вариант: [logic] active = sr_idle [sr_idle] on_actor_inside = {+new_restriktor} sr_sound on_timer = 10000 nil %=spawn_zombie_x18% [sr_sound] snd = characters_voice\scenario\rnd_fallscream, characters_voice\scenario\rnd_moan, characters_voice\scenario\rnd_the_horror3, characters_voice\scenario\rnd_scr3, characters_voice\scenario\rnd_ratchant idle = 5 delay = 1 Спавн происходит, а звуковая схема не срабатывает... :ny_ph34r_1: Были еще несколько вариантов, но все либо нерабочие, либо наполовину,активируют или звуковую схему или спавн. Подскажите где исправить??? Заранее благодарен! Изменено 27 Декабря 2011 пользователем losiara Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
Artos 99 Опубликовано 27 Декабря 2011 Поделиться Опубликовано 27 Декабря 2011 losiara, что-то ты плутаешь в логике как в трех соснах, но не открываешь глаз (прочтя по логике мануал), а тычешься носом. 1. Если возник вопрос по логике то и начинать нужно с описания алгоритма того, что хочешь сделать, а то наличие упоминаний трех звуковых файлов сбивает с толку ... рандомные иль последователые(?). 2. Если используешь звук и условием ставишь "по окончании звука" - ну так и использовать в логике нужно окончание по сигналу (окончание звука) и по нему переключаться на секцию где спавнишь монстров. *Shoker*, вылеты иль зависания - могут иметь одну природу, т.е. некорректные применения методов/функций. Если в логике срабатывает что-то некорректное, то последствия могут быть самыми разными ... от незначительных коллизий, до зависани иль безлоговых вылетов. И как уже сказал - это все погадалки, так ничего не накопаешь, даже если сейчас десяток заявит типа: "А у меня что-то схожее было". Или засучивай рукава, бери дебаг-инструментарий и копай вглубь ... или откатывайся назад и иди другим путем. "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
losiara 13 Опубликовано 27 Декабря 2011 Поделиться Опубликовано 27 Декабря 2011 Artos Всегда не хватает малости - подсказки!!! Иной раз и коды\описания в подробностях не нужны, а только направить человека в русло... [logic] active = sr_idle [sr_idle] on_actor_inside = {+new_restriktor} sr_sound [sr_sound] snd = characters_voice\scenario\rnd_fallscream, characters_voice\scenario\rnd_moan, characters_voice\scenario\rnd_the_horror3, characters_voice\scenario\rnd_scr3, characters_voice\scenario\rnd_ratchant idle = 5 delay = 1 on_signal = sound_end | sr_idle@odin ;переключение схемы... [sr_idle@odin] on_timer = 1500 | sr_sound2 %=spawn_zombie_x18% ;спавн... Ок! [sr_sound2] snd = characters_voice\scenario\rnd_fallscream, characters_voice\scenario\rnd_moan, characters_voice\scenario\rnd_the_horror3, characters_voice\scenario\rnd_scr3, characters_voice\scenario\rnd_ratchant idle = 5 delay = 1 Не совсем оптимально, но именно то что и требовалось. Вошел в рестриктор, проигрался звук, в данном случае устрашающий, через 1,5сек. по окончании звука - спавн зомби. При повторном входе в рестриктор, звуковая схема отрабатывает, но уже без спавна. Жизнь следует измерять поступками, а не временем... Ссылка на комментарий
Artos 99 Опубликовано 27 Декабря 2011 Поделиться Опубликовано 27 Декабря 2011 (изменено) losiara, именно поэтому и стараюсь в-первую очередь давать подсказки, а не "готовенькое", т.к. считаю, что любому модмейкеру, кто увлекся моддингом, гораздо больше пользы и удовлетворения принесет ощущение самостоятельно сделанного (хотя и с небольшой подсказкой), чем от полученного "на халяву". Ну а неоптимальности или огрехи -это дело наживное ... ;-) Изменено 27 Декабря 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Полтергейст 37 Опубликовано 28 Декабря 2011 Поделиться Опубликовано 28 Декабря 2011 Artos обычно начинают с начала а не с конца ... т.е. говорят что хотят сделать/получит, а не то что ради этого делалось и неполучилось. Без того что же ты хочешь сделать (идеи/алгоритма) толку от приведенных кодов маловато ... Идея простая - добавлять все аномалии, находящиеся на уровне, всем NPC при переходе в онлайн. С фильтрацией уже добавленных разобрался, но тут появилась ещё одна проблема. Похоже, все эти операции с добавлениями/удалениями что-то перегружают и в итоге у меня стала появляться ошибка "С stack overflow". Есть ещё другая проблема - рестрикторы, которые добавляются таким способом (через alife_simulator) не отображаются в списке рестрикторов (был вылет "any vertex... inaccessible") онлайн-объектов. Либо они хранятся в какой-то отдельной таблице, либо просто не успевают добавиться, т.к. NPC уже перешёл в онлайн. Ссылка на комментарий
Artos 99 Опубликовано 28 Декабря 2011 Поделиться Опубликовано 28 Декабря 2011 (изменено) Полтергейст, у тебя какое-то странное понятие 'идея'. Говоря о ней ты пишешь про средство достижения некоей тобою замысленной идеи, а не о ней самой. Ну на кой бес прописывать все рестрикторы неписям? Ну должно же быть понятно, что сторадж объектов не резиновый, запихивать в строковую переменную все и вся - прямой путь к битым сэйвам и стек-оверлоадам. Хочешь чтобы неписи по тупому видели все аномалии и их обходили - ну так что мешает сделать как монстрам? Иль присвой аномалиям тип рестриктора для запрета входить в них и не будут твои неписи в них заходить ... Сорри, но твой путь тупиковый и у тебя скооее получается не упражнение в кодинге, а испражнение и напрсная трата времени. ИМХО. Изменено 28 Декабря 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти