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

Скриптование


Svoboда

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

Artos

Если в кратце:

Работают я с ЧН, там система сквадов устроена так, что если хоть 1 НПС из сквада в онлайне, то и весь сквад онлайн. Более того - скваду ставится флаг "сквад всегда в онлайне", ставится он только из se_stalker в колбеках switch_online\offline.

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

В частности им как раз мешает флажок "сквад всегда в онлайне" т.к он меняется только из se_stalker в колбеках онлайн\оффлайн. Но цимес в том, что из за этого же флага "сквад всегда в онлайне" колбеки на переход в онлайн\оффлайн больше не вызываются, т.к сквад навсегда остаётся в онлайне (до смены локации)

 

Я исправил это тем, что в момент, когда сквад ищет себе новое "задание" снимаю флажок "принудительного перевода НПС в онлайн", а также, сейчас, проверяю расстояние от игрока до всех НПС из сквада, и если они все в зоне переключения в оффлайн, сам ставлю скваду флажок "сквад всегда в онлайне" = false (иначе остаётся true)

 

Если я этот флажок ( "сквад всегда в онлайне") оставляю равным true, то в момент выдачи работы сквада, всем его НПС опять ставится флаг "принудительного перевода НПС в онлайн", и непись попадёт в онлайн.

 

Но если я не делаю проверку на расстояние от игрока и НПС, а всегда ставлю флаг "сквад всегда в онлайне" = false (а если этого не делать, то в момент выдачи работы, НПС принудительно кинет в онлайн, даже если он за радиусом онлайн элайфа), то получается ситуация, что те сквады, что остались в онлайне, имеют в свойствах сквада флаг того, что они в оффлайне (со всеми вытекающими последствиями), а проблема в том, что как я сказал в начале, флаг этот в чистой игре ставится только в se_stalker в колбеках..., и если с колбеком с уходом в оффлайн всё нормально (сквад был в онлайне), то с колбеком на переход в онлайн проблема, т.к непись уже в онлайне... соответственно колбек не вызывается, и флаг "сквад всегда в онлайне" остаётся равным false, хотя это не соответствует действительности. Именно этого мне нужно избежать.

 

Тоесть грубо говоря если флаг "сквад всегда в онлайне" не менять вручную, сквад и его НПС всегда будут в онлайне (их кинет обратно), но ежели изменить его вручную на false, то у НПС, которые находятся близко к игроку (в Зоне действия онлайн-элайфа), т.к колбек на переход в онлайн не вызовется, этот флаг так и останется false. Тоесть по факту сквад в онлайне, но на уровне скриптов остаётся в оффлайне.

 

 

Кстати, вроде тут относительно недавно обсуждалось. Мне необходимо в момент смерти НПС добавить к его оружию апгрейд через нет-пакеты, но переводить оружие online-offline-online нельзя, т.к получается что в момент смерти НПС, оружие в его руках будет пропадать и исчезать, существуют ли ещё какие то варианты, чтобы изменения нет-пакета сработали?

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Да в принципе вопрос со сквадами я решил, просто не уверен насчёт его стопроцентной гарантии ну да ладно. Сейчас меня это уже не так волнует. По игровым отладочным меткам с карты всё сходится.

-----------------

Кстати я не совсем тогда понял, зачем тебе записывать нет-пакеты при использовании разрывных патронов, там же вроде тока читать их надо, а не писать. Правда я эту часть твоего мода почти не смотрел, и это была древняя версия.

-----------------

 

А что если менять нет-пакет оружия в момент его подьёма игроком. Как быть если объект находится в инвенторе игрока, его же не перенести в оффлайн\онлайн пока он внутри инвенторя... или можно? Ещё как вариант я попробую выкидывание ствола, с заменой пакета, и возвращение его в инвентарь, но вот интересно, можно ли обойтись без выкидывания.

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Я дополнил пост выше. Мне нужно каким то образом помечать оружие для игрока. Т.к у меня оружие делится на оружие с трупов, и купленное оружие. Сперва я хотел менять ему имя в инвенторе. Но это не получилось. Теперь я хочу ему апгрейд дописывать со своим текстом, чтобы хоть как то различать пушки.

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Да не нужны мне метки\pstor-ы, я хочу показать ИГРОКУ, у которого в инвенторе лежит два совершенно одинаковых по внешнему виду и конфигам оружия, но разных на уровне скриптов. Мне надо, чтобы это увидел игрок, увидел при просмотре инвенторя в свойствах предмета, увидел при торговле там же и прочее...

Для себя на уровне скриптов у меня это давно реализовано, но мне нужно донести это визуально игроку в максимально удобной форме.

 

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

 

Собстно никто не пробовал менять предмету нет-пакет, пока он находятся в инвенторе игрока? Можно ли предмет там переносить в онлайн\оффлайн, или надо обязательно выкинуть его инвенторя.

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

> application is aborting

Проблема с моделью скорее всего. У меня было когда omf-файл был взят от другой модели.

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

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Ну в любом случае копай в этом направлении. Может у тебя какая то модель из ЧН не имеет\имеет лишние анимации или типа того. По идее у тебя модель будет вылетать сразу, как тока появится в игре. Так что можешь просто ставить на карту сталкеров и смотреть с какой моделью будет вылет... тут уже сам решай.

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

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

Поделиться этим сообщением


Ссылка на сообщение

ziStam

А ты на ЗП делаешь? Там у снорка вроде бы тока анимация stand_run_0

Или ты анимацию не из конфигов, а скриптами вызываешь?

Если ты анимацию вызываешь из конфигов, или просто заменил существующию на свою, то скрипты тебе врятле помогут. Надо крутить конфиги\модели.

Ежели анимация у тебя вызывается скриптами, тогда можно что нибудь попробовать.

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Boofer

Схема mob_walk

Две секции. Активная первая. В ней ставь on_timer = 10 | переключение на другую@секцию (как то так) через 10 секунд.

В другой секции кажется ставь combat = ... или combat_ignore = true, опять таки глянешь в готовых примерах или в статьях,и там настраиваешь игнорирование им врагов. Я точно не помню как это выглядит, но сделать в целом просто. Правда скорее всего он будет игнорировать не только игрока, но и всех врагов.

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

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

Поделиться этим сообщением


Ссылка на сообщение

Возможно кому то будет интересно, столкнулся сегодня с вылетом в ЧН:

FATAL ERROR

[error]Expression    : error handler is invoked!
[error]Function      : invalid_parameter_handler
[error]File          : E:\priquel\sources\engine\xrCore\xrDebugNew.cpp
[error]Line          : 793
[error]Description   : 


stack trace:

 

Вываливался при попытке вывести UI с листом названий инвентарных предметов.

Покапавшись и проведя тесты - выяснил, что игра валилась при попытке добавить в лист строчку "Противорадиационные препараты"

Причём достаточно было изменить любую букву\заменить пробел на _\написать любое другое слов и вылет прекращался.

Я честно говоря немного ...

 

Полез сюда на форум и оказалось, что я (и не только) уже сталкивался давно с этим вылетом.

Это какой то баг с разрешением экрана. У меня вылет происходил на 1280x1024, стоит сменить разрешение (я себе на 800x поставил + vid_restart в консоли для гарантии)

и вылет пропал...

 

Вот такой он... Сталкер. Антирад пришлось переименовать.

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Nuclear_xD

У тебя синтаксическая ошибка в скрипте heal_regen

Либо ты где то написал неправильно, либо может поставил\недоставил лишний end

http://dl.dropbox.com/u/23885395/LuaChecker-0.3.rar

Используй эту программу, чтобы найти ошибку в скрипте.

 

botik

Это дело не на одну минуту. Если сам в скриптах ноль, то даже перенести готовое будет проблематично. Как вариант на ЗП есть мод с дин. новостями от Vano_Santuri, подсмотри у него, и пробуй перенести что надо.

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Nuclear_xD

Файл для вывода можно не делать, всё на экран программы будет выведено. Если пишет что ошибок нет, тогда тут обычно причина в том, что у тебя стоит лишний end в коде, тогда программа начинает тупить. Как вариант удали в скрипте один любой end, и занаво пусти программу, если она ошибку не найдёт, значит точно где то один (а мож и не один) end поставил лишний.

 

Artos

А как переключаться между типами боя? Помнится в ЗП работал с переделанной Bak-ом схемой xr_danger, и на основе колбека на опасность сделал простенький такой стелс. Попытался в ЧН но там столкнулся с проблемой как у Полтергейста, и забил. Как можно заставить непися не реагировать на врага?

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Напомните как правильно надо удалять аномалии. У меня была схема дин. аномалий, всё работало хорошо. А вот недавно в следствии каких то далёких операций при удалении аномалий через release через некоторое время\после загрузки движковый вылет в ЧН:

 

stack trace:

001B:067C486E xrGame.dll
001B:067C49D9 xrGame.dll
001B:0681EEE1 xrGame.dll

 

+ похоже что то пытается некоторые аномалии прописать в рестрикторы, но я вроде как спецом их никуда не вписываю, так какого же...

 

Единственное что я делаю с аномалиями, это disable\enable_anomaly(), отключаю аномалии, далёкие от игрока.

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

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Спасибо, завтра попробую :)

А если дисаблить аномалию, нужно ли ждать какое то время, или можно сразу же её удалить в той же функции?

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

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Отключил абсолютно все удаляемые аномалии задолго до попытки удаления - вылет остался. Сейчас попробую прочитать рестрикторы.

 

А других причин вылетов таких нету случаем?

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

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

Поделиться этим сообщением


Ссылка на сообщение

Пару страниц назад писал о вылете при удалении аномалий в ЧН:

001B:067D486E xrGame.dll
001B:067D49D9 xrGame.dll
001B:0682EEE1 xrGame.dll

 

Пока смог обнаружить что вылет происходит тока при удалении какой то из грави-аномалий (ещё не определился какой\каких)

Решил проверить теорию, что вылет происходит из за рестрикторов. Удалил все трупы на локации (животных\монстров)

Но вылет остался.

Пошёл дальше - удалил всё живое на локации.

Вылет пропал.

 

Сам я в рестрикторы НПС ничего не добавляю, есть ли у кого нить идеи из за чего это может быть ещё?

 

Есть ещё такой нюанс, что "грави" аномалии после убийства сталкера разрывают его труп. Это удаляет сталкера из игры или формально он ещё там?

 

И как вообще определить что аномалия у кого то прописана в рестриктор? Я так понял, судя по нет-пакетам, у НПС одновременно тока 1 in и 1 out может быть?

Если я переберу всех НПС и проверю их in\out рестрикторы на совпадение с аномалией (я так понял там хранится id аномалии\рестриктора же?), то теоретически я могу определить из за какого\каких НПС происходит вылет?

 

ЗЫ: Ради интереса, вчера убил несколько сталкеров в электре (грави не проверил), чтобы их трупы остались там, удалил потом аномалию, загрузился - вылета небыло.... хотя по идее НПС-у должен был присвоится in-рестриктор если верить Artos-у и при удалении аномалии - вызвать вылет без лога, если я ничего не путаю конечно.

 

ЗЫЫ: Ещё пробовал не удалять сразу аномалии, а просто их выключать, а удалять уже при последующей загрузке игры - аналогичный вылет.

 

Дополнение:

Протестировал сейчас все 3 грави аномалии. Убил в них и сталкера и монстра, удалил аномалию, сделал сохранение, загрузился - всё пучком, всё работает -_-

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Совершенно аналогичная ситуация. Скрипты, функции которых вызываются из xml-тегов диалогов, и больше нигде не вызываются (как и сам скрипт), тем ни мение они все работает, хотя до вызова из диалога попасть в _G таблицу не могли...

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Вообщем я разобрался (но ещё не исправил) от чего был движковый вылет при удалении аномалий. В этом и впрям оказались виноваты рестрикторы.

Вылет был из за монстров (оба монстра из оригинала, ставятся через all.spawn, флажок "всегда в онлайне"), когда я глянул их рестрикторы, у обоих в in-рестрикторах была прописана ближайшая (на момент загрузки сейва) к ним грави-аномалия (но расстояние между монстром и аномалией около 10-15 метров). Но что интересно, оба монстра были живы и ходили по локации. Так каким образом к ним могла прописаться эта аномалия в рестрикторы? Возможно аномалия прописывается объекту после нанесения ему хита? (я ещё это не проверил)

И кстати, при удалении этих аномалий, рестрикторы которых были прописаны монстрам, сообщение об ошибке в консоль не выводилось в 97% тестов.

 

И вот ещё вопросцы по поводу рестрикторов...

1) Рестрикторы можно удалить в любой момент, или нужно из какой нибудь скриптовой схемы? В ЧН нашёл интересный скрипт restrictor_manager.script, который как раз из xr_logic вызывается.

2) Рестрикторы достаточно удалить только у онлайн объектов, или они могут быть ещё прописаны объекту который в оффлайне?

3) Какие ещё есть подводные камни, связанные с удалением рестрикторов, которые стоит знать?

 

И ещё извиняюсь за тупой вопрос, но щас уже поздно, штудировать мануалы не хочется. In рестрикторы я так понял НЕ впускают в себя объект, а out наоборот НЕ выпускают. А если out-ов несколько прописано?

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

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

Поделиться этим сообщением


Ссылка на сообщение

Artos

Спасибо за разъяснение :)

___

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

strong

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

В bind_stalker есть функция function actor_binder:net_spawn(data), она вызывается каждый раз при загрузке карты\сохранения.

В самом её конце перед end напиши например проверку вида:

 

if level.name() == "имя_твоей_локации" then
  if xr_logic.pstor_retrieve(db.actor, "first_visit", false) == false then
     <тут делаешь что те надо>
     xr_logic.pstor_store(db.actor, "first_visit", true)
  end
end

 

Этот вариант удобен, если тебе в скриптах надо что то сделать. Если в логике то там скорее всего с инфопоршнями придётся работать, я точно не знаю есть ли легче метод там.

 

И это, у меня скриптов ЗП под рукой щас нету, если там перед последним в функции end-ом есть что то типа return true или просто return, то пиши перед ним, иначе твой код не вызовется.

 

 

Artos

По поводу этого кода:

http://www.amk-team.ru/forum/index.php?sho...st&p=675950

Сразу хочу сказать что сейчас я работаю тока с той частью кода, которая отвечает за удаление рестриктора у онлайн объекта (часть с нет пакетами я отключил, т.к у меня она сейчас вызывает вылеты + я использую твою старую версию m_net_utils, а не xStream-овскую, мож из за этого)

 

Щас ковыряю его и назрела пара вопросов:

1) При удалении рестрикторов у онлайн объекта у тебя есть проверка вида:

            local oRestr = sim:object(sRest) --/#!# only for SHOC|CS
            if oRestr and Is_ZoneAnom(oRestr) then
              table.insert(tToRemove,sRest)
            end

 

Но тут такой недочёт (ли?), может так случится что в момент вызова чистки рестрикторов, один из рестрикторов (как в моём случае) уже удалён из игры, и поэтому oRestr-а не существует и он (по крайнем мере в части что за онлайн отвечает) не удаляется у объекта. Исправил (ли?) это тем, что при отсутствии oRestr добавляю рестриктор в список удаления, даже если это не аномалия.

 

2) Зачем после удаления рестриктора у клиентского объекта у тебя всё равно вызывается код удаления рестриктора у серверного, так и должно быть?

 

3) Зачем ты в части, что отвечает за удаление рестриктора у серверного объекта, перезаписываешь нет-пакет если можно (ли?) просто удалить рестриктор через sim:remove_in_restriction(soNPC, idRestr)? В чём смысл записывать оставшиеся рестрикторы, если по идее они и так останутся у НПС?

 

4) Насколько критичен этот код:

              tRestrRemoved[idRestr] = true
              if tAnomsRemove[idRestr] then
                tAnomsRemove[idRestr] = false --/#?#
              end

В твоей функции он нигде не вызывается, я посчитал что мне он не нужен.

 

5) Как я упомянул в начале - сейчас я пока удаляю рестрикторы только первой частью кода (где работа с онлайн объектом), и щас после последнего теста рестриктор у клиентского объекта удалился (по крайнем мере проверял на 1 объекте, у него он пропал из списка), хотя вылет пока остался (возможно я не у всех удалил), так вот, в данном случае можно обойтись без чистки рестриктора у серверного объекта или это тоже необходимо?

 

6) Твою функцию удаления рестрикторов аномалий вызываю из меню\на колбеке спавна аномалии. Я так понял место вызова значения не имеет для моего случая? А то ты что то про скриптовые схемы упоминал.

 

Пример использования в твоём моде (SoC версия) посмотреть не могу, т.к не получается его распаковать :D

 

ЗЫ: А вообще насколько сильный на практике прирост идёт от паковки мода в db-архив.

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

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

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

Поделиться этим сообщением


Ссылка на сообщение

Artos

Спасибо :)

Распаковку делал как раз и обычным конвертором. Расширение менял просто на .db

Буду ещё пробовать.

О том что код не удаляет рестрикторы физически, это я знаю, просто неправильно выразился - под рестрикторами подразумеваю сами записи о них (рестрикторах) у НПС, а не физ. объект (аномалию и прочее)

 

1) С ЗП не работаю с апреля, давно как вернулся на ЧН, в ЗП с этой ошибкой посчастливилось не столкнутся.

2) А если ты очистишь рестриктор у серверного объекта через нет-пакет, он ведь может остаться у клиентского (если не перегнать его в оффлайн\онлайн, что тоже затратно)

3) Вопрос остался. В качестве рестрикторов подразумеваю сами записи о рестрикторах у НПС.

По идее: sim:remove_in_restriction(soNPC, idRestr) удалит из списка НПС нужный рестриктор, оставив другие. Так зачем ещё перезаписывать нет-пакет и вносить туда "оставшиеся" рестрикторы?

4) Но в контексте чистки просто записей о них у НПС (что и является причиной вылета) это ведь не критично и я могу код этот удалить?

5) -

6) -

 

> Запомиаем локацию в табличку для последдующего и сохраняем ее при записи в сэйв. Все это стандартные движковые и Lua операции.

Ну ну, сохраняем таблицу в сейв :)

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

 

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

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

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

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...