Svoboда 3 Опубликовано 23 Апреля 2009 Поделиться Опубликовано 23 Апреля 2009 Тема для обсуждения скриптов всего и всех в серии игр STALKER. Задавая вопрос (!): 1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего; 2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме); 3. Изучите информацию которая может вам помочь: Stalkerin. Там есть много хороших статей касательно данной темы.Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения. Справочное руководство по языку Lua 5.1https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ruСправочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены. Логика со вступлением и четырьмя частями: ВступлениеЧасть перваяЧасть втораяЧасть третьяЧасть четвертая. Smart_terrain (в простонароде - гулаг)Интересный способ настроики логики для гулаговСкриптовая часть игровой логики 4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос; 5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе; 6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода; 7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины. 8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ. 9. И помните: «Правильно заданный вопрос – половина ответа». Какие вопросы следует задавать, а какие нет... Задавайте вопросы, которые касаются непосредственно скриптов и их работы, т.е. Вы что-то делаете, а у Вас что-то не получается, при этом у Вас на руках должен быть хотя бы какой-то код, свидетельствующий о Вашей причастности к вопросу. Вопросы которые будут удалятся, следовательно их задавать не нужно:-- Где находится та или иная функция? Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;-- Как сделать что-то/то-то? С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов? В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос. И последнее: очень рекомендовано к прочтению Правила форума 1 2 Ссылка на комментарий
Malandrinus 615 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 спавн происходит в метре от актора, и сам объект появляется на земле. Надо сразу после создания объекта и до выхода его в онлайн обнулить флаг серверного объекта use_ai_location. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
CRAZY_STALKER666 36 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 (изменено) Спавню НПЦ вот так local obj=alife():create("gar_nano",db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id())local params=netpack_write.read_stalker_params(obj)params.custom="[logic]\ncfg = scripts\\ep\\gar\\gar_nano.ltx"params.sid=30198netpack_write.write_stalker_params(params,obj) Потом пытаюсь удалить(через диалог с другим НПЦ) function del()local sim = alife()local se_obj = sim:story_object(30198)if se_obj thensim:release(se_obj, true)endend Но ничего не происходит... Где я ошибаюсь? P.S Выводил при спавне SID - через новости на ПДА - всё хорошо. При удалении поставил брейкпойнтый вот так local sim = alife()local se_obj = alife():story_object(30198)news_manager.send_tip(db.actor, "stage 1", 0, "default", 10000)if se_obj thennews_manager.send_tip(db.actor, "stage 2", 0, "default", 10000)sim:release(se_obj, true)end Доходит лишь до первого... Изменено 23 Июня 2016 пользователем CRAZY_STALKER666 Не соответствует правилам. Ссылка на комментарий
TIGER_VLAD 361 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 обнулить флаг серверного объекта use_ai_location Вот так пробовал на ТЧ: s_obj= alife():create("energy_drink", pos, db.actor:level_vertex_id(), db.actor:game_vertex_id()) s_obj:use_ai_locations(false) Не получается. Вылетает. Ссылка на комментарий
Malandrinus 615 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 @CRAZY_STALKER666, проблема при назначении SID нетпакетом в том, что он при этом не вписывается в глобальный реестр SIDов и соответственно не будет искаться функциями получения по SID и не будет работать в логике. В XE для прописывания SIDа была специальная функция, которая одновременно с назначением и регистрировала SID в реестре, а на ванильном движке вписанный скриптом SID не заработает до перезагрузки сейва. Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
CRAZY_STALKER666 36 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 В XE для прописывания SIDа была специальная функция, которая одновременно с назначением и регистрировала SID в реестре XE - что это такое? И как мне тогда быть? М.б как всегда есть готовые решения? В том те TT2 использовался тот же функционал, что и у меня и не было таких проблем... Не соответствует правилам. Ссылка на комментарий
Malandrinus 615 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 Вот так пробовал на ТЧ: На ТЧ нет функции use_ai_locations для установки, только для получения значения. Надо использовать нетпакеты. XE - что это такое? X-Ray extensions 1 Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
Nazgool 250 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 (изменено) @CRAZY_STALKER666, В крайнем случае, если стоит расширение lua, можно и самому организовать свой динамический аналог game_story_ids.И там хранить типа sid-ов объектов.Я так делал когда-то.Если интересно. Изменено 23 Июня 2016 пользователем Nazgool Ссылка на комментарий
CRAZY_STALKER666 36 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 @Nazgool, нет времени изобретать велосипед... Может кому интересно будет, как я разобрался с проблемой, мало ли... Решил так - просто для этого НПЦ спавн идет через all.spawn, там прописал story_id и тогда всё удаляется прекрасно прекрасно... Не соответствует правилам. Ссылка на комментарий
Nazgool 250 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 Этот вариант я тоже тогда рассматривал.Но если ты будешь спавнить что-то через секцию alife():create("any_section", vector():set(... и т.д. и нужно будет это позже удалять.Снова for i=1,65534 ? Ссылка на комментарий
Dennis_Chikin 3 662 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 Если непись и вообще объект онлайновый - только что расписывал в соседней теме, как его получить, скажем, по info. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
CRAZY_STALKER666 36 Опубликовано 24 Июня 2016 Поделиться Опубликовано 24 Июня 2016 @Nazgool, не понял, о чем ты... Вроде проблема исчерпана Не соответствует правилам. Ссылка на комментарий
Nazgool 250 Опубликовано 24 Июня 2016 Поделиться Опубликовано 24 Июня 2016 (изменено) @CRAZY_STALKER666, Если ты будешь спавнить все объекты, которым необходимо назначать sid через all.spawn, то тогда я ни о чем. Я о том что будет, если будешь спавнить что-то по имени секции динамически, т.е. (например) alife():create("stalker", vector():set ... bla-bla И тебе позже нужно будет найти именно этого сталкера из кучи остальных, так же заспавненных. Изменено 24 Июня 2016 пользователем Nazgool Ссылка на комментарий
CRAZY_STALKER666 36 Опубликовано 24 Июня 2016 Поделиться Опубликовано 24 Июня 2016 @Nazgool, Всё, понял. Более не пригодиться задавать sid через скрипт, разве что для рестрикторов, но там проблем таких нету... Добавлено Dennis_Chikin, 24 Июня 2016 Вот именно для рестрикторов sid вообще не нужен. Не соответствует правилам. Ссылка на комментарий
TIGER_VLAD 361 Опубликовано 24 Июня 2016 Поделиться Опубликовано 24 Июня 2016 Всем привет. Такую штуку заметил, напрягать стало: когда ГГ в присяде обыскивает труп, тайник или начинает диалог с НПС, он сам поднимается. Вот на видео видно: . Можно как-то это отключить? А то есть ситуации, где эта фишка очень мешает(например спрятался за что-то, хп на 0, в приседе идешь к трупу, обыскиваешь - а ГГ в этот момент сам встает и открывается для противника получая маслину). Ссылка на комментарий
PTB 8 Опубликовано 24 Июня 2016 Поделиться Опубликовано 24 Июня 2016 @TIGER_VLAD, Честно говоря не знаю но по моему в двиг лезть надо. В жизни много плохих моментов. Пытайся избавляться от них ! Ссылка на комментарий
Nazgool 250 Опубликовано 24 Июня 2016 Поделиться Опубликовано 24 Июня 2016 (изменено) Более не пригодиться задавать sid через скрипт Вот это и плохо. Ты сам себя ограничиваешь в тех возможностях, которые люди придумали спустя много лет использования box-версии. Вот смотри. Что такое назначение sid-а в исходном варианте? В all.spawn-е ты создаешь секцию и прописываешь в ней story_id. Кроме этого тебе нужно зарегистрировать этот sid в game_story_ids.ltx. А что такое этот game_story_ids? Это жестко фиксированное хранилище, основываясь на котором возможен поиск по alife():story_object(sid), и без которого все твои назначенные sid-ы будут до лампочки. Не знаю как это выглядит, но подозреваю что достаточно запутанно и не очень удобно. До настоящего времени люди старались, делали, и как сказал Чебурашка - "строили, строили и наконец построили". Построили так, что можно и обойтись без всего того, что ты делаешь по "старой технологии". Что же есть нового, чтобы больше не смотреть на all.spawn, как на спасательный круг в твоём случае? Как можно назначить sid "не отходя от кассы"? 1. В расширение X-Ray extensions есть метод alife():assign_story_id. 2. Есть универсальные хранилища. By Malandrinus например. 2а. Если всё то что сказано выше сложно, то есть самый простой вариант - расширение lua by RvP, о чем я и хотел тебе сказать несколько постов назад. Так вот о самом простом, последнем варианте ( и втором тоже). Есть стандартное фиксированное хранилище (game_story_ids), а есть возможность сделать такое же, но динамическое хранилище. Теперь подробнее. Например создаем сталкера: local sobj = alife():create("stalker", vector():set ... bla-bla Пока этот сталкер существует, для него остаются неизменными name и id sobj:name() sobj.id Поэтому можно "запоминать" его либо по name, либо по id. Имя для динамически заспавненных объектов составляется из имени секции и его id (Для данного варианта) sobj:name() == 'stalker' .. sobj.id Зачем такая сложность, проще запомнить его id, оно же и так уникально. И вот теперь сама фишка того, что люди и придумали. Ты можешь сохранять id так : 1 (приоритетно) . Используя хранилище Malandrinus-а local sobj = alife():create("stalker", vector():set ... bla-bla ogse_unist.set_value('my_sid_kakoj_to_stalker', sobj.id , "number") 2. Используя только расширение by RvP писать эти id в свой файл посредством библиотеки io. Пишу налету, без всяких там разборок, криво, косо, на эмоциях, но это всё равно должно работать, и для наглядности хватит. В папке gamedata\config создать файл "my_sid.ini" (например) В _g.script добавить my_sid = {} my_sid_path = getFS():update_path("$game_config$", "my_sid.ini") function load_my_sid() local sim = alife() for line in io.lines(my_sid_path) do local k,v = line:match('([%w_]+)=([%w_]+)') v = tonumber(v) if sim:object(v) then -- для очиски от несуществующих на всяк my_sid[k] = v end end end function save_my_sid() local sim = alife() local f = io.open(my_sid_path, 'w') for k, v in pairs(my_sid) do if sim:object(v) then -- для очиски от несуществующих на всяк f:write(k..'='..v..'\n') end end f:flush() f:close() end Для запуска пока достаточно и в bind_stalker.script после function actor_binder:net_spawn(data) пишешь load_my_sid() и после function actor_binder:net_destroy() добавляешь save_my_sid() И наконец само использование где-то в скриптах : local sobj = alife():create("stalker", vector():set ... bla-bla my_sid.my_sid_kakoj_to_stalker = sobj.id Теперь в любой момент, ты можешь не перебирая for i=1,65534 которое может не лагать только на мощных системах, определить id своего объекта сталкера Либо по первому варианту local id_my_stalker = ogse_unist.get_value('my_sid_kakoj_to_stalker' , 0 , "number") Либо по второму local id_my_stalker = my_sid.my_sid_kakoj_to_stalker И найти сам объект local obj = alife():object(id_my_stalker) -- по прочтённому id А теперь удаляй или что ты с ним хочешь сделать. Изменено 24 Июня 2016 пользователем Nazgool 1 3 Ссылка на комментарий
Zander_driver 10 343 Опубликовано 26 Июня 2016 Поделиться Опубликовано 26 Июня 2016 @Nazgool, Фууух. Насилу собрала массив То что зачистили одно поле ещё не значит что буду валить всё то, что так тяжело строила.Ты сам как думаешь, такое поведение - нормально? Все эти своевольности запросто могут не совпадать с замыслом программиста, и быть ему не известны, т.к. не сообщаются очевидно. В итоге код работает не так как хотел программист, что выливается в лишние часы на отладку и выяснение причин. Мракобесие короче. Создавалось чтобы поощрить лень программиста, а я почитав это, дико затосковал по языкам где надо обязательно заранее объявить каждую переменную и указать ее тип... И не дай бог ты указал тип integer и стал туда записывать результат деления - будешь обруган компилятором самыми последними программистскими словами. Настоящее программирование - оно там а Луа это пардон, детский сад, в моем представлении. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Nazgool 250 Опубликовано 27 Июня 2016 Поделиться Опубликовано 27 Июня 2016 (изменено) @Zander_driver, На самом деле всё не так уж и плохо. Оператор '#' прекрасно работает с "правильными" массивами. Осталось только нам научиться работать с массивами также правильно table.insert и table.remove сделаны специально для этого и должны помочь. А поведение оператора '#' и его будущее в других случаях до сих пор не так однозначно. В PiL3 об этом написано в разделе 3.5. Оператор длины Особенно мне "нравиться" фраза самого автора:"поэтому большую часть времени оператор длины безопасен для использования" Как тебе такое? Изменено 27 Июня 2016 пользователем Nazgool Ссылка на комментарий
Desertir 202 Опубликовано 27 Июня 2016 Поделиться Опубликовано 27 Июня 2016 По идее для этого есть метаметод __len, можно его определить по-своему. Только вот Луа нужна 5.2 ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Nazgool 250 Опубликовано 27 Июня 2016 Поделиться Опубликовано 27 Июня 2016 (изменено) Да, в 5.1 не хватает этого метода. Впрочем можно написать функцию типа : function table.len(t) local n = 0 for _ in ipairs(t) do n = n + 1 end return n end А заодно не хватает __pairs и __ipairs. Да и goto, при аккуратном использовании, помогает крепко сокращать код Изменено 27 Июня 2016 пользователем Nazgool Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти