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

Malandrinus

Жители
  • Число публикаций

    1 930
  • Регистрация

  • Последнее посещение

  • Дней в топе

    13
  • AMKoin

    160 [Подарить AMKoin]

Весь контент пользователя Malandrinus

  1. Monnoroch, непись стоит там, откуда не добраться по сетке до пути
  2. npc:alive() npc - клиентский объект (game_object)
  3. Трупы оживить невозможно. Можно убрать труп и заспавнить вместо него живого непися.
  4. Kirag, вся логика вроде как парсится в файле xr_logic.script. А там как раз и прописаны файлы xr_conditions.script и xr_effects.script. Я бы просто создал в этих файлах псевдонимы функций, вынесенных в другие файлы. Типа такого fun = another_file.fun
  5. Может кому-то пригодится... В качестве альтернативы вывода в лог можно использовать перенаправление консольного вывода в текстовый файл. В этом случае работает функция Lua print(). Вывод буферизированный, способа флушить его я не нашёл (т.е. если движок крашнется, то часть потеряется). Зато можно выводить произвольно форматированный текст с пробелами, табуляциями, переносами строки и т.п.
  6. Изменения в скриптах вступают в силу после перезагрузки уровня (скрипты грузятся заново). Поскольку переход на новый уровень реализован фактически через механизм сохранения/загрузки, то к тому-же эффекту приводит смена уровня.
  7. npc:accessible(vertex) кажется так
  8. Я просто с трудом представляю, как можно сделать мало-мальски похожую на правду анимацию скелета из нескольких десятков костей. Ну можно так можно. Но тогда и сталкер не сможет на это место встать. Упрётся лбом и будет "идти" на месте до бесконечности. И в этом случае, как я понимаю, не сможет сработать нужный эвалуатор "пришёл на место и можно садиться". Надо наверное, как-то помудрить с моделью стула. Сделать типа как у вертолёта оболочку проницаемую для всего. А как называется анимация? Я так думаю, проблема именно во взаимодействии с физическими объектами. А Сидор - это монстр со своим набором костей, анимация у него своя, и стул - часть геометрии уровня.
  9. Сяк, я вижу здесь одну задачу и одну проблему. задача - это сделать анимации "сидеть на стуле", "встать со стула", "сесть на стул". Решаемо наверное, но ведь анимации делают методом съёмки живых актёров. На коленке не сделаешь. Проблема - это как заставить сталкера прийти туда, где стоит стул. Я так думаю, если сделать стул частью геометрии уровня, то можно под стулом сделать вертекс, и тогда это получится. А вот если это будет физический объект, то сталкер будет отталкивать его при приближении к нему. В общем гемор нехилый.
  10. dan, между "stalker" и у примеру твоим "my_trader" принципиальной разницы нет. Всё это секции, которые находятся в system.ltx. С секцией "stalker" можно заспавнить и скриптом, а секцию "my_trader" можно прописать кому-то для спавна через all.spawn. Мне не понятно другое, почему у 4ufak спавнится с одной секцией, а потом при проверке секция другая. По-моему, он просто другого сталкера проверяет. Я проверил по-другому. Записал как и у 4ufak проверку в коллбек биндера на использование. По-любому секция выводится та, с которой был создан. Для меня вопрос закрыт.
  11. Как он может выдать "stalker", если спавнил "bar_dolg_respawn_1"? Может там попросту не тот непись проверяется? Насколько я знаю, "stalker" - это секция для всех или почти всех неписей из all.spawn. На всякий случай. Вот мой тестовый код: if not db.test_st then local actor_gvid = db.actor:game_vertex_id() local actor_lvid = db.actor:level_vertex_id() local actor_pos = db.actor:position() db.test_st = alife():create("bar_dolg_respawn_1", actor_pos, actor_lvid, actor_gvid) else local con = get_console() local st = level.object_by_id(db.test_st.id) con:execute(db.test_st:section_name()) con:execute(st:section()) con:execute(db.test_st:profile_name()) con:execute(st:profile_name()) end Его надо выполнить подряд два раза. При первом выполнении заспавнится долговец (слегка подвинет ГГ), при втором - для него выведется информация. У меня чётко выводится та секция, которую спавнил.
  12. Заспавнил этого долговца. Что для серверного объекта snpc:section_name(), что для клиентского cnpc:section() выдаёт одинаково "bar_dolg_respawn_1". Откуда у тебя "stalker" взялся непонятно.
  13. вылетает, если делать переименование до загрузки игры. Если загрузиться и сделать переименование, то вылета нет. Почему так, без понятия.
  14. Спецификой Lua является то, что сам по себе он не предоставляет почти ничего, только даёт доступ к функциям хост-приложения. Были бы экспортированы, к примеру, функции для создания и синхронизации потоков - были бы потоки. А в самом Lua искать их бессмысленно =)
  15. В смысле? Поставь цикл длинный, вот и тормоз будет. Если имеешь в виду поток в суспенд отправить, то этого нет. Функции луа вызываются как подпрограммы движка. Тормозишь функцию луа - тормозишь по любому всю игру.
  16. Вношу поправку. В папке сейвов тоже работает. Надо использовать корень $game_saves$ Да может и в остальных папках тоже работает. Просто если не работает, то нифига не говорит, поэтому сложно ошибки определять.
  17. local f1 = getFS():update_path("$game_data$","ai\\test\\a.txt") local f2 = getFS():update_path("$game_data$","ai\\test\\a1.txt") local overwrite_existing_files = true local res = getFS():file_rename(f1, f2, overwrite_existing_files) Работает. Файл gamedata\ai\test\a.txt. Кроме $game_data$ есть и ещё пути. Их список можно посмотреть в fs.ltx, хотя вроде как работают не все. "Левые" файлы и каталоги мне удалось сделать и переименовать только в пределах папки gamedata. Дополнение: Файл должен существовать до запуска игры (до запуска программы, а не загрузки уровня). После уже игра отслеживает изменение имени, но если файл появится во время игры, то игра его проигнорирует.
  18. Это означает, что где-то стоит вызов: printf("%s", <второй аргумент - строка>) и этот второй аргумент либо равен nil либо просто отсутствует. Вот где этот вызов стоит, там и надо копать. Выяснять, почему там не передаётся строка. Мест таких наверняка не одно, но это уже зацепка.
  19. в районе 20-й строки было бы достаточно. Вот этот фрагмент: function printf(fmt,...) log(string.format(fmt,...)) -- это 20-я строка end Видим, что ошибка происходит в функции format. У неё должны быть дополнительные аргументы. Но сказать какие, можно только узнав строку fmt. Попробуй вставить туда дополнительную строчку: function printf(fmt,...) get_console():execute(string.gsub(fmt, " ", "_")) log(string.format(fmt,...)) -- это 20-я строка end Когда будет вылет по крайней мере узнаешь, что выводилось. Может сможешь понять, откуда была вызвана функция.
  20. Может быть всё, что угодно. Что такое битый сейв? Это когда в нетпакет при сохранении (а больше ничего не сохраняется) попадает мусор. Это может случиться по нескольким причинам: - неверный алгоритм. Пишется не то, что читается. Таких ситуаций может быть море и как-то их классифицировать сложно. - переполнение буфера. Записал слишком много, вышел за пределы нетпакета и наехал на чужие структуры данных. Хотя это обычно вызывает немедленные вылеты, но может вызвать и отложенный вылет. - более тонкие причины могут быть связаны с асинхронными операциями. Движок, который работает в несколько потоков, при некорректной их синхронизации может одновременно что-то записывать и оттуда же что-то читать. Вполне возможно, что квиксейвы портятся по этой причине. Если выходишь в меню, то все процессы останавливаются. При этом сохранение происходит корректно. А если сохраняешься на ходу, то в процессе сохранения ещё что-то работает и меняет какие-то данные. В итоге выходит некое противоречие в данных, которое потом и сказывается в виде ошибок и вылетов. Это всё разумеется из области предположений. Читай внимательней. Там про левел и гейм вертексы в самых первых строках говорится.
  21. Какую статью ты имеешь в виду? Об этом везде пишут в первую очередь. alife():create(section, pos, lvid, gvid)
  22. _g.script содержит много общих функций, на которые ссылаются из других файлов. Примерно в районе 20-й строки должна быть функция вывода в лог. Видимо она у тебя где-то вызывается и её передаются неправильные аргументы. Хоть бы привёл кусок своего _g.script, а то гадай, что у тебя там в 20-й строке. Как минимум, неправильно задаются координаты спавна. Для спавна надо указывать координаты и соответствующие этим координатам gvid и lvid. Облёт камерой тебе в этом не поможет. Надо побегать самому и в точках спавна снять эти параметры.
  23. На самом деле нет. Кстати, рекомендую использовать для распаковки плагины для Total Commandera (см. мою подпись). Отдельно взятый файл искать существенно удобнее.
×
×
  • Создать...