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

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

  Информация (Показать)

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

  Читать рекомендуется. (Показать)

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий

Tris

Инициализируй функции перед выполнением проверок.

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

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

Уже даже укоротил... Сделал самую простейшую.

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

Что за запись? function function_start_1(). Один раз function

Сорри. Зарапортовался.

P.S. Ну ты и назвал. Назови просто start_1, дабы не вводить людей в заблуждение :)

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

Tris

Да и вообще, зачем эти громоздкие конструкции с if ... end? Вот тебе твой же код, только гораздо проще и легче:

  Код (Показать)
Ссылка на комментарий

Все чуть дополню ответ Gun12 по вопросу Tris'a:

Многие забывают (или не знают) про такое понятие как "область видимости". Очень советую начинающим скриптерам почитать это в мануале по Lua повнимательнее. И, какой бы оптимальный код ни был, не следует обращаться к функциям/переменным или не объявленным или объявленным ниже по коду. Ошибка Tris'а в том, что вначале он пытается выбрать одну из функций, которые определяются ниже по коду этой же (основной) функции - в результате ошибка по отсутствию выбранной функции. Или эти функции должны быть выше по коду данной функции (random_time) или же быть в корне скрипт-файла.

 

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

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

Доброе время всем!

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

ЗОНА ДОЛЖНА БЫТЬ НЕПРЕДСКАЗУЕМОЙ !!! НЕТ ТАМ ЛОГИКИ И НЕ НУЖНА ОНА ТАМ !!!
Ссылка на комментарий

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, форум АМК съел моё старое имя и не хочет отдавать о_О

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

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

Как сделать так чтобы после определенного диалога нпс пошел в определенную точку?

 

Тебе сюда: >>Click Me<<

ColR_iT

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

Ребята, поймал ступор...

На Волке проверяю простенький диалог актора из последовательности фраз, без ветвления и каких либо условий на появление диалога/фразы. Собственно вот такой:

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

ColR_iT

id в двигателе обозначается чилом типа unsigned short int (2 байта), которое ну никак не может быть равно -1. id у актора = 0

Freedom

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

ColR_iT, уже _Призрак_ подсказал ошибку в условиях проверок, но добавлю:

Зачем проверять на некие сторонние идентификаторы? Диалог возможен только между актором и кем-то - значит условие if first_speaker:id() == db.actor:id() всегда возможно и вернет однозначный результат, от которого и плясать далее ...

 

Добавлено через 21 мин.:

*Shoker*, начну с конца и кратко:

Упаковка файлов мода выполнена стандартно движковым конвертером (by bardak) и только "нестандартное" длинное расширение мешает распаковке различными батниками и гуишниками. Научи их распознавать расширение и исчезнут проблемы с распаковками.

Собственно на какую-либо скорость в игре упаковка в пак-файлы влияет по-разному. Может и ускорить, а может и замедлить, все зависит от конфигурации твоего железа и OC, но это тема иного топика ... Ну а собственно цель упаковки в ином, это удобство установки и моддинга установленного мода.

По пунктам (хотя ты так и не оазобрался в сути):

Приведенный код НЕ удаляет рестрикторы (в контексте скрипта - аномалии), а чистит упоминания о рестрикторах в параметрах неписей, занося их в таблицу для последующего возможного удаления.

1. Упомянутый кусок кода требует адаптации под ЗП, т.к. в таком виде работает только для ТЧ и ЧН. Т.к. речь идет не про удаление собственно рестриктора а о его записи в параметрах непися - то и чистится в любом случае (существует иль нет).

2. Код был написан в три этапа. Вначале только для онлайн объектов, чего оказалось мало. Потом был написан для всех (через нет-пакеты), но ... изредка появлявшиеся "рельсы" из-за некорректностей старых писалок нет-пакетов, первичная чистка в онлайне осталась (что снизило кол-во ошибок с "рельсами"). вероятно сейчас откажусь от онлайн чисток, оставив тлько через нет-пакеты. Но это уже вопрос излишеств ...

3. Повторю, этот код чистит записи а н удаляет рестрикторы. Удаление рестрикторов происходит уже ПОСЛЕ чистки записей, что и является залогом отсутствия ошибок при удалении аномалий.

4. Данный фрагмент кода (таблица) используется при удалении рестрикторов/аномалий в дальнейшем.

5. Читаем п.2. Чистить нужно все записи рестикторов у всех объектов - если рестриктор/аномалия удаляются. Для моментов записи сэйвов - это залог их "не битья".

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

 

Добавлено через 18 мин.:

strong, врядл существуют "уроки" по подобным вопросам.

Собственно а в чем загвоздка? Например я, при каждом старте игры считываю из сэйва запомненную табличку о "уже известных для ГГ локациях" и, если там нет текущей (или нет таблицы при начале НИ) - значит ГГ попал на локацию впервые. Запомиаем локацию в табличку для последдующего и сохраняем ее при записи в сэйв. Все это стандартные движковые и Lua операции.

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

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

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

как сделать проигрования звука при использовании предмета? Эта статья не работает.

 

С чего это вдруг? У других работает, а у тебя нет!?

Посмотри ещё вот это: Звук при использовании предмета

ColR_iT

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

Artos

Спасибо :)

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

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

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

 

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

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

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

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

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

5) -

6) -

 

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

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

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

 

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

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

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

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

*Shoker*

  Раскрывающийся текст (Показать)

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

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

Удаляются рестрикторы, не удаляются... Переведите название функции remove_in_restriction. Речь не о рестрикторах (restrictor), а об ограничениях (restriction). Удаляются ограничения (задаваемые естественно именем рестриктора).

  Полезный утиль (Показать)
Ссылка на комментарий

Мля, достали уже.

demover123, да и многие другие.

Когда-то написал этот скрипт - ДА!. Но только не для тех кто в бронепоезде.

Неужели трудно понять что

  Цитата
[[Путь_до_звука_относительно_папки_sounds]]
, да и другое, это...

Э-э-х. Чего бисер метать?

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

malandrinus

Не обращал внимание - спасибо. Так будет легче объяснять :D

 

Artos

> Ну не думал, что у модмейкера со стажем возникнут заморочки с распаковкой обычного *.db файла, тренируйся ... ;-)

Наверно потому что распаковкой раз в пол года занимаюсь, по праздникам :)

На харде до сих пор распакованный ТЧ, который я распаковывал ещё в начале 2008 года.

_____________________________________________

1) Если дело только в этом, то это не проблема.

2) Ну вот так понятней. В таком случае чистка для онлайн объекта и в прям не особо нужна.

3) И всё таки я шутки дня не понял. Судя по коду:

        for idx,idRestr in ipairs(data.dynamic_in_restrictions) do
          local soRestr = idRestr and sim:object(idRestr)
          if soRestr then
            if Is_ZoneAnom(soRestr) then --/ проверка: аномалия?
              tRestrRemoved[idRestr] = true
              if tAnomsRemove[idRestr] then
                tAnomsRemove[idRestr] = false --/#?#
              end
              sim:remove_in_restriction(soNPC, idRestr)
            else --/ не удаляемый рестриктор
              table.insert(tRestrLeft, idRestr)
            end
          end

 

в этой части у тебя удаляются все "ограничения" от аномалий, все остальные "валидные" ограничения просто заносятся в табличку и занаво записываются объекту через нет-пакет, хотя они у него уже записаны. Где здесь два зайца я не заметил, единственный плюс что более надёжно, хотя вероятность сбоя alife():remove_in_restriction() мне кажется (надеюсь) довольно низкой. А вот лишний раз трогать такую хрупкую вещь как пакеты тоже не хочется.

4) А где я говорил что не удаляю потом этот рестриктор из игры? Удаление ограничений вызывается сразу после удаления аномалий\рестрикторов и до спавна новых. Я ведь не на твоём моде работаю, у меня по своему всё сделано. А значит этот кусок кода для меня является бесполезным.

_____________________________

И вообще, раз удаление "ограничения" у клиентского объекта по сути не так уж и нужно (для лечения вылета)

Что мешает весь код вообще упростить и пересадить на одну тока alife():remove_in_restriction() как например тут:

 

  Код (Показать)
Изменено пользователем *Shoker*

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

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

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

*Shoker*, пора заканчивать мусолить одно и то же, тем более разбирать детально "сторонний" код с целью портировать под "свои" частности ...

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

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

 

По п.3: Для меня гораздо проще работать именно с такой "хрупкой вещью" как нет-пакеты, т.к. при правильной работе с ними все делается гораздо проще и предсказуемее. sim:remove_in_restriction(soNPC, idRestr) - как уже ранее говорил, остался пока как рудимент, который дублирует то, что делаю нет-пакетами. Учитывая, что мод изменяется мною "по ходу игры", то даже мои ошибки/эксперименты при изменениях в модуле нет-пакетов в этой части не приведут в данном коде к последствиям ...

 

Ну и по п.4: Ты все же не понял, что в отличии от твоего стремления в-первую очередь удалить собственно рестриктор/аномалию, а потом почистить о ней записи, у меня иной алгоритм. Строка tAnomsRemove[idRestr] = false --/#?# - как раз исключает аномалию/рестриктор из списка удаляемых, если она присутствует в записях объекта по ограничениям ... Т.о. мною аномалия НЕ удаляется сразу, а только тогда, когда записей о ней уже нет у объектов. Попробуй понять разницу ...

  Цитата
*Shoker*: Интересуют конкретные причины, подкреплённые фактами и тестами.
Вам как отчетом или на слово поверите? :crazy:

Помнится с проблемой удаления аномалий возились одновременно с kamikazze (перед OGSE 0692, там тоже были аналогичные проблемы) ... C тех пор проблема была решена и "аномальные" вылеты в модах исчезли. Тебе почти пара лет тестирования игроками в мод о чем-то говорит, или еще какие-то факты нужны? Ну а причина - потребность удалять аномалии/рестрикторы тогда, когда потребно и без ошибок. :-)

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

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

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

Подскажите пожайлуста что в этих скриптах не правельно.На ЗП 1.6.00 работает,а на 1.6.02 не работает.

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

Здрасте, у меня такой вопрос, как прописать переход в один конец скрипом? Я освоил как сделать простой переход по известным точкам туда и обратно, но мне нужно в один конец! Плиз подскажите функцию!

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

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

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

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

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

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

Войти

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

Войти
  • Недавно просматривали   0 пользователей

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