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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/
Malandrinus 615 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 спавн происходит в метре от актора, и сам объект появляется на земле. Надо сразу после создания объекта и до выхода его в онлайн обнулить флаг серверного объекта use_ai_location. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1020233
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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1020289
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) Не получается. Вылетает. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1020320
Malandrinus 615 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 @CRAZY_STALKER666, проблема при назначении SID нетпакетом в том, что он при этом не вписывается в глобальный реестр SIDов и соответственно не будет искаться функциями получения по SID и не будет работать в логике. В XE для прописывания SIDа была специальная функция, которая одновременно с назначением и регистрировала SID в реестре, а на ванильном движке вписанный скриптом SID не заработает до перезагрузки сейва. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1020339
CRAZY_STALKER666 36 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 В XE для прописывания SIDа была специальная функция, которая одновременно с назначением и регистрировала SID в реестре XE - что это такое? И как мне тогда быть? М.б как всегда есть готовые решения? В том те TT2 использовался тот же функционал, что и у меня и не было таких проблем... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1020340
Malandrinus 615 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 Вот так пробовал на ТЧ: На ТЧ нет функции use_ai_locations для установки, только для получения значения. Надо использовать нетпакеты. XE - что это такое? X-Ray extensions 1 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1020347
Nazgool 250 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 (изменено) @CRAZY_STALKER666, В крайнем случае, если стоит расширение lua, можно и самому организовать свой динамический аналог game_story_ids.И там хранить типа sid-ов объектов.Я так делал когда-то.Если интересно. Изменено 23 Июня 2016 пользователем Nazgool Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1020355
CRAZY_STALKER666 36 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 @Nazgool, нет времени изобретать велосипед... Может кому интересно будет, как я разобрался с проблемой, мало ли... Решил так - просто для этого НПЦ спавн идет через all.spawn, там прописал story_id и тогда всё удаляется прекрасно прекрасно... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1020359
Nazgool 250 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 Этот вариант я тоже тогда рассматривал.Но если ты будешь спавнить что-то через секцию alife():create("any_section", vector():set(... и т.д. и нужно будет это позже удалять.Снова for i=1,65534 ? Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1020361
Dennis_Chikin 3 665 Опубликовано 23 Июня 2016 Поделиться Опубликовано 23 Июня 2016 Если непись и вообще объект онлайновый - только что расписывал в соседней теме, как его получить, скажем, по info. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1020418
CRAZY_STALKER666 36 Опубликовано 24 Июня 2016 Поделиться Опубликовано 24 Июня 2016 @Nazgool, не понял, о чем ты... Вроде проблема исчерпана Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1020500
Nazgool 250 Опубликовано 24 Июня 2016 Поделиться Опубликовано 24 Июня 2016 (изменено) @CRAZY_STALKER666, Если ты будешь спавнить все объекты, которым необходимо назначать sid через all.spawn, то тогда я ни о чем. Я о том что будет, если будешь спавнить что-то по имени секции динамически, т.е. (например) alife():create("stalker", vector():set ... bla-bla И тебе позже нужно будет найти именно этого сталкера из кучи остальных, так же заспавненных. Изменено 24 Июня 2016 пользователем Nazgool Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1020508
CRAZY_STALKER666 36 Опубликовано 24 Июня 2016 Поделиться Опубликовано 24 Июня 2016 @Nazgool, Всё, понял. Более не пригодиться задавать sid через скрипт, разве что для рестрикторов, но там проблем таких нету... Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1020533
TIGER_VLAD 361 Опубликовано 24 Июня 2016 Поделиться Опубликовано 24 Июня 2016 Всем привет. Такую штуку заметил, напрягать стало: когда ГГ в присяде обыскивает труп, тайник или начинает диалог с НПС, он сам поднимается. Вот на видео видно: . Можно как-то это отключить? А то есть ситуации, где эта фишка очень мешает(например спрятался за что-то, хп на 0, в приседе идешь к трупу, обыскиваешь - а ГГ в этот момент сам встает и открывается для противника получая маслину). Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1020550
PTB 8 Опубликовано 24 Июня 2016 Поделиться Опубликовано 24 Июня 2016 @TIGER_VLAD, Честно говоря не знаю но по моему в двиг лезть надо. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1020613
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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1020661
Zander_driver 10 348 Опубликовано 26 Июня 2016 Поделиться Опубликовано 26 Июня 2016 @Nazgool, Фууух. Насилу собрала массив То что зачистили одно поле ещё не значит что буду валить всё то, что так тяжело строила.Ты сам как думаешь, такое поведение - нормально? Все эти своевольности запросто могут не совпадать с замыслом программиста, и быть ему не известны, т.к. не сообщаются очевидно. В итоге код работает не так как хотел программист, что выливается в лишние часы на отладку и выяснение причин. Мракобесие короче. Создавалось чтобы поощрить лень программиста, а я почитав это, дико затосковал по языкам где надо обязательно заранее объявить каждую переменную и указать ее тип... И не дай бог ты указал тип integer и стал туда записывать результат деления - будешь обруган компилятором самыми последними программистскими словами. Настоящее программирование - оно там а Луа это пардон, детский сад, в моем представлении. Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1021188
Nazgool 250 Опубликовано 27 Июня 2016 Поделиться Опубликовано 27 Июня 2016 (изменено) @Zander_driver, На самом деле всё не так уж и плохо. Оператор '#' прекрасно работает с "правильными" массивами. Осталось только нам научиться работать с массивами также правильно table.insert и table.remove сделаны специально для этого и должны помочь. А поведение оператора '#' и его будущее в других случаях до сих пор не так однозначно. В PiL3 об этом написано в разделе 3.5. Оператор длины Особенно мне "нравиться" фраза самого автора:"поэтому большую часть времени оператор длины безопасен для использования" Как тебе такое? Изменено 27 Июня 2016 пользователем Nazgool Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1021209
Desertir 202 Опубликовано 27 Июня 2016 Поделиться Опубликовано 27 Июня 2016 По идее для этого есть метаметод __len, можно его определить по-своему. Только вот Луа нужна 5.2 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1021233
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 Ссылка на комментарий https://www.amk-team.ru/forum/topic/6185-skriptovanie/page/379/#findComment-1021239
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти