Перейти к контенту

Рекомендуемые сообщения

Выкладываю свой код по частям.

 

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, которому уже добавлены рестрикторы, то при загрузке этого сохранения добавление будет вызвано ещё раз. В идеале неплохо было бы сделать так, чтобы в сохранения всё это вообще не записывалось, но как именно - пока не придумал.

Изменено пользователем Полтергейст
Ссылка на комментарий

Полтергейст, обычно начинают с начала а не с конца ... т.е. говорят что хотят сделать/получит, а не то что ради этого делалось и неполучилось. Без того что же ты хочешь сделать (идеи/алгоритма) толку от приведенных кодов маловато ...

 

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

- более подробно смотри в моде, где и нет-пакетоми дублирую чистку.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Сейчас столкнулся с такой интересной бякой на ЧН, ищу её решение и решил спросить, вдруг кто сталкивался.

У меня в моде присутствуют НПС, которые появляются на карте случайным образом (не как сквады)

И вот в момент перехода одного такого НПС в онлайн (самый обычный сгенерированный сталкер) игра просто зависает. Видно, как он появляется в онлайне (ещё без оружия в руках) и всё ... Само собой после зависона лога никакого нету.

 

Я расследую тока один случаи, но мне известно, что были как минимум два других. Я ещё буду смотреть инвентарь этого НПС, но из того необычного, что я знаю сейчас это то, что он заспавнился совсем рядом с аномалией (но не в 1 с ней точке)

Я пробовал удалять аномалию, но вылет остался. Другие два места я пока ещё не смотрел. Обхода аномалий у меня нету, ничего с рестрикторами я сам не делал.

В ранних версиях у меня с такими случайными НПС ничего подобного небыло, теперь ищу причину.

Может у кого был похожий случаи?

Изменено пользователем *Shoker*

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

Доброго времени суток! Прошу помощи! Мне нужно, чтобы после выдачи определённого инфопоршня, бандиты стали нейтралами по отношению к главному герою. При вызове данной функции происходит безлоговый вылет:

function set_freedom_enemy (player, stalker)
relation_registry.set_community_goodwill ("bandit", db.actor:id (), +5000)
end

В чём может быть проблема?

Изменено пользователем ColR_iT
Ссылка на комментарий

basil, кажется в +5000 стоит убрать + и все заработает.

 

Аккуратнее в советах. СтОит порой промолчать, дабы не советовать ошибочное иль бесполезное. --/Artos

Изменено пользователем Artos
Ссылка на комментарий

Подскажите, я спавню НПС через скрипт, после перестрелки НПС остаются там, где закончили бой, а на точки своего спавна не идут.

Что делать с логикой?

Заранее благодарен.

 

 

Ссылка на комментарий

*Shoker*, твой вопрос из области погадалок ...

В чем похожест? В том, что при спавне объекта -> ошибка -> вылет? Да такого как снега у каждого разработчика. :-)

Без доп.информации бессмыселенно гадать-предполагать.

Единственное: то, что ты успеваешь заметить заспавнившего дает возможность предположить, что функции инициализации объекта все же проходят, а вот потом - тут и ошибки штатной логики иль те же ошибки в инфентаре иль пр.

 

basil, чтобы стали нейтралами нужно задавать не +5000 (лепшие друганы), а 0 (ноль). Но по любому вылета именно от этой операции не должно быть. Раз вылетает - ищи коллизию в других кодах, когда бандиты-нейтралы приводят к ошибкам.

 

Wik, что делать с логикой? Да задать ее такой, какой хотелось бы, а не куций ремарк ... (как предполагаю в твоем случае).

Хочешь чтобы были в точке спавна в любом случае - используй схему 'walker'.

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Прошу прощения, что бы у товарища не возникало вопросов, самую малость дополню ответ куратора 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...название локации!

Изменено пользователем losiara

Жизнь следует измерять поступками, а не временем...

Ссылка на комментарий

losiara,

Я даю ответы/советы не как от куратор (куратор может и не давать ответов по существу вопросов), а как такой же участник форума как ты и другие.

Куратор скорее по форме вопросов иль отсутствию в них сути и т.п. высказывается.

 

А дополнять пока ответ не было особенного смысла, т.к. совершенно неизвестно какая логика (если вообще это сделано) прописана неписю из вопроса Wik'а, это только мое предположение.

Если есть желание более полно дать информацию по этой теме (ремарку-валку) - то можно просто дать отдельным от вопроса постом, а уж пригодится вопрошающему иль кому-то иному - это уже дело их.

 

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий
Artos, я бы не стал делать столь поспешных выводов. Прежде чем написать пост выше я тестил функцию set_community_goodwill самостоятельно, вызывал ее из диалога. Если в последнем аргументе поставить плюс то функция не срабатывает, а если убрать или поставить минус, то все работает нормально, отношения меняются в положительную/отрицательную сторону. Смотрел как реализована эта функция в других модах (в частности в солянке), там в эту ф-цию тоже передавалось положительное значение без плюса. Ну по крайней мере так ф-ция ведет себя на ТЧ, насчет ЧН и ЗП не уверен, не пробовал.
Ссылка на комментарий

Схема "ремарк" хороша там, где нельзя заставить находится НПС ,прописав им пути,к примеру- из за отсутсвия АИ сетки в этом месте.Но кроме как стоять болванчиком на месте ,трудно заставить делать его что то еще.

Ссылка на комментарий
bill_gates, извини, действительно несколько резко, но суть - даже если убрать синтаксическую ошибку с '+', то остается то, что действие задает не нейтральность бандитов, а максимальную дружелюбность, что неверно в контексте вопроса. Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Artos

Если бы оно вылетало, это было бы фигня. Но у меня оно просто зависает, вся игра при спавне персонажа виснет.

А это врятле "обычный" случаи.

Изменено пользователем *Shoker*

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

Ссылка на комментарий

Добрый день!!!

Возник вопрос относительно логики рестрикторов. По задумке, при входе в рестриктор, проигрывается музыкальная композиция, а через 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: Были еще несколько вариантов, но все либо нерабочие, либо наполовину,активируют или звуковую схему или спавн. Подскажите где исправить???

Заранее благодарен!

 

 

Изменено пользователем losiara

Жизнь следует измерять поступками, а не временем...

Ссылка на комментарий

losiara, что-то ты плутаешь в логике как в трех соснах, но не открываешь глаз (прочтя по логике мануал), а тычешься носом.

1. Если возник вопрос по логике то и начинать нужно с описания алгоритма того, что хочешь сделать, а то наличие упоминаний трех звуковых файлов сбивает с толку ... рандомные иль последователые(?).

2. Если используешь звук и условием ставишь "по окончании звука" - ну так и использовать в логике нужно окончание по сигналу (окончание звука) и по нему переключаться на секцию где спавнишь монстров.

 

*Shoker*, вылеты иль зависания - могут иметь одну природу, т.е. некорректные применения методов/функций. Если в логике срабатывает что-то некорректное, то последствия могут быть самыми разными ... от незначительных коллизий, до зависани иль безлоговых вылетов. И как уже сказал - это все погадалки, так ничего не накопаешь, даже если сейчас десяток заявит типа: "А у меня что-то схожее было". Или засучивай рукава, бери дебаг-инструментарий и копай вглубь ... или откатывайся назад и иди другим путем.

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

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сек. по окончании звука - спавн зомби. При повторном входе в рестриктор, звуковая схема отрабатывает, но уже без спавна.

 

Жизнь следует измерять поступками, а не временем...

Ссылка на комментарий

losiara, именно поэтому и стараюсь в-первую очередь давать подсказки, а не "готовенькое", т.к. считаю, что любому модмейкеру, кто увлекся моддингом, гораздо больше пользы и удовлетворения принесет ощущение самостоятельно сделанного (хотя и с небольшой подсказкой), чем от полученного "на халяву".

Ну а неоптимальности или огрехи -это дело наживное ... ;-)

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Artos

обычно начинают с начала а не с конца ... т.е. говорят что хотят сделать/получит, а не то что ради этого делалось и неполучилось. Без того что же ты хочешь сделать (идеи/алгоритма) толку от приведенных кодов маловато ...

Идея простая - добавлять все аномалии, находящиеся на уровне, всем NPC при переходе в онлайн. С фильтрацией уже добавленных разобрался, но тут появилась ещё одна проблема. Похоже, все эти операции с добавлениями/удалениями что-то перегружают и в итоге у меня стала появляться ошибка "С stack overflow".

 

Есть ещё другая проблема - рестрикторы, которые добавляются таким способом (через alife_simulator) не отображаются в списке рестрикторов (был вылет "any vertex... inaccessible") онлайн-объектов. Либо они хранятся в какой-то отдельной таблице, либо просто не успевают добавиться, т.к. NPC уже перешёл в онлайн.

Ссылка на комментарий

Полтергейст, у тебя какое-то странное понятие 'идея'. Говоря о ней ты пишешь про средство достижения некоей тобою замысленной идеи, а не о ней самой.

Ну на кой бес прописывать все рестрикторы неписям? Ну должно же быть понятно, что сторадж объектов не резиновый, запихивать в строковую переменную все и вся - прямой путь к битым сэйвам и стек-оверлоадам.

Хочешь чтобы неписи по тупому видели все аномалии и их обходили - ну так что мешает сделать как монстрам?

Иль присвой аномалиям тип рестриктора для запрета входить в них и не будут твои неписи в них заходить ...

Сорри, но твой путь тупиковый и у тебя скооее получается не упражнение в кодинге, а испражнение и напрсная трата времени. ИМХО.

Изменено пользователем Artos

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
×
×
  • Создать...