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

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

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


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

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

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

 

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

 

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

 

Вопросы которые будут удалятся, следовательно их задавать не нужно:
-- Где находится та или иная функция?
Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;
-- Как сделать что-то/то-то?
С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;
-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.
-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.
Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов?
В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос.

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


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий
https://www.amk-team.ru/forum/topic/6185-skriptovanie/
4 часа назад, CiberZold сказал:

обычно юзают цикл перебора всех алайф объекту

Порочный совет. "Обычно" наоборот, стараются так не делать, а если советовать такое, неплохо бы объяснять все минусы этого подхода. Да ещё и пример написан с ошибками (об этом ниже).

 

@Balavnik, минус, причём жирный, заключается именно в переборе 65 тысяч (в примере) или в среднем 33 тысяч объектов. Что если такой поиск нужно делать периодически? А если он сам находится внутри другого цикла и/или содержит в себе достаточно внушительный код? Подход "процессор вывезет" сработает у одного, а у другого - приведёт к фризам.

Скрытый текст

Если тебе необходимо удалить кого-то совершенно определённого и никого больше таким образом не удалять - лучше адресоваться к story_id и получать объект по этому признаку. Если необходимо удалить случайного персонажа, но при этом создаваемого в строго определённый момент строго определённым образом - лучше как-то запомнить его точный идентификатор, а потом использовать его при удалении. Если необходимо удалить одного или всех НПС по какому-то фиксированному признаку - лучше проверить признак и запомнить этих персонажей в момент загрузки из сейва или их спавна, а потом, опять же, удалять адресно.
Да, так сложнее, но при этом правильнее. Способ же с полным перебором следует использовать тогда и только тогда, когда никакой другой в принципе применить нельзя. Для целей обучения он, конечно, подойдёт, но на будущее необходимо чётко представлять последствия.
А пример выше, как я уже сказал, содержит в себе как минимум 2 ошибки.
Первая: после нахождения объекта с именем "bar_dolg_respawn_3" цикл не остановлен и продолжится до достижения максимального числа 65535. После alife():release() следовало выполнить break или return.
Вторая: если в игре существуют объекты с именем "bar_dolg_respawn_31", "bar_dolg_respawn_345" или, допустим, "foobar_dolg_respawn_3" - будут удалены все, поскольку все эти имена содержат одно и то же, а именно то, что ищется, а паттерн, использованный для поиска, неточен.
Не ошибки это только в одном случае: если необходимо удалить все объекты, содержащие в своём имени "bar_dolg_respawn_3". Но об этом надо сообщать особо.

 

  • Нравится 3

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

2 часа назад, Kirgudu сказал:

"Обычно" наоборот, стараются так не делать

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

 

2 часа назад, Kirgudu сказал:

Первая: после нахождения объекта с именем "bar_dolg_respawn_3" цикл не остановлен и продолжится до достижения максимального числа 65535.

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

 

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

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

Вот именно, что возникает много разных "если" и "но".

1 час назад, CiberZold сказал:

в чём ошибка ,если как раз и нужно удалить всех неписей

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

1 час назад, CiberZold сказал:

особенно мой пример как раз хорош ,когда надо удалять заспавненных по скрипту нпс

Вот я заспавнил скриптом одного НПС, мне больше не надо. Тоже будешь удалять перебором, или здесь возникнет ещё одно невысказанное "если"?

Вопрос риторический, ответ не нужен.

  • Нравится 1

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

2 часа назад, Kirgudu сказал:

Где было написано про удаление всех?

даже если надо удалить одного, секция bar_dolg_respawn_3 подразумевает, что это какой-то респавн, за то время пока дойдёт до ручного спавна и удаления, игра сама может наспавнить несколько неписей на этой секции и они будут с этой строчкой в имени, также как и нужный нам непись, потому можно и удалить их всех скопом вместе с нужным нам нпс, здесь делать выход из цикла после первого удалённого как раз приведёт к тому, что мы можем удалить левого нпс, а нужного нет, потому цикл надо довести до конца, чтоб он удалили всех с похожими именами (бесполезных сим неписей) и заодно и нужного на удаление:)

  • Жуть! 1

Можно ли менять свойства объектов, например condition у оружия, просто делая равенство См.Пример., или существуют специальные методы?

 

Скрытый текст
weapon:condition() = 1

 

 

Жить стало лучше, жить стало веселей. А когда веселей живётся, то работа скорится.

img.php?nick=Balavnik&sert=2&text=t6

@Norman Eisenherz А где-то можно список получить этих методов? Каждый раз спрашивать - засорять тему.

Жить стало лучше, жить стало веселей. А когда веселей живётся, то работа скорится.

img.php?nick=Balavnik&sert=2&text=t6

@Купер уже набил примерно то же самое, но опоздал секунд на 20. :laugh:

@Balavnik от себя хочу добавить ещё один способ: поиск по форуму. Пример для "состояние предмета" с вхождением всех слов:

https://www.amk-team.ru/forum/search/?&q=состояние предмета&quick=1&search_and_or=and&sortby=relevancy

Каждый второй пост в результатах содержит искомую функцию set_condition.

 

Немного брюзжания: раньше считалось хорошим тоном сначала поискать ответ на свой вопрос в старых постах, коих за столько лет накопилось изрядно, и только потом - писать.

  • Полезно 1

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

https://imgur.com/5mgNkfl

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

 

А ниже скрины где это используется, и укажите может где ошибся

Цитата

 

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

1_Draken_1.gif

AMD FX (tm)-6300 Six-Core (6 X 3.50GHz); RAM 16Gb; GeForce GTX 1660 Super (6Gb).
Windows -10 Home (х64)

 My ArtStation - https://www.artstation.com/artem344

Каким образом лучше всего таймеры делать? В биндере прописывать или как-то иначе?

Жить стало лучше, жить стало веселей. А когда веселей живётся, то работа скорится.

img.php?nick=Balavnik&sert=2&text=t6

Каким образом лучше всего отслеживать события? Например, поднятие актором определённого предмета двигает поршень. Думаю, в  bind_stalker прописывать не лучшая идея.

Жить стало лучше, жить стало веселей. А когда веселей живётся, то работа скорится.

img.php?nick=Balavnik&sert=2&text=t6

43 минуты назад, Balavnik сказал:

в  bind_stalker прописывать не лучшая идея

Прописывать можно где угодно. Но коллбек on_item_take именно в bind_stalker и вызов будет там.

  • Согласен 2

Здесь могла быть ваша реклама.

@mole venomous А не будет ли это шибко сильно тормозить игру? Я просто хочу таким макаром обработать +- 70 объектов.

Жить стало лучше, жить стало веселей. А когда веселей живётся, то работа скорится.

img.php?nick=Balavnik&sert=2&text=t6

2 часа назад, Balavnik сказал:

Каким образом лучше всего отслеживать события?

А что такое, по твоему, биндер вообще? Это скриптовой объект, который позволяет скриптам отслеживать события забинденного объекта. Т.е. он буквально вот для этого и создан.

В биндерах находятся (могут находиться) обработчики всех событий которые могут происходить с объектом и отслеживаются движком.

1 час назад, Balavnik сказал:

А не будет ли это шибко сильно тормозить игру?

А каким образом? Код метода-обработчика вызывается только при срабатывании соответствующего колбека события.

На каждом фрейме вызывается только update.

1 час назад, Balavnik сказал:

обработать +- 70 объектов.

Все в on_item_take?

switch case по секции в помощь, Ну или по тому признаку по которому они у тебя различаются. Еще можно таблицу функций сделать с ключами-секциями, и по секции вызывать нужную из обработчика on_item_take. Как угодно можно.

  • Нравится 1
  • Полезно 1

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine / Мимокрокодил.

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

Вырезаны ли функции работы с файловой системой? Хочу считать количество смертей актора. 

 

Какими командами можно редактировать user.ltx?

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

Жить стало лучше, жить стало веселей. А когда веселей живётся, то работа скорится.

img.php?nick=Balavnik&sert=2&text=t6

1. Библиотека io – чтение и запись текстовых файлов (есть ЧН/ЗП, про OGSR не знаю).

2. Написать в консоли help, искать примеры по названиям.

  • Полезно 1

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

4 часа назад, Norman Eisenherz сказал:

про OGSR не знаю

В OGSR тоже есть. Везде есть, кроме оригинала ТЧ и основанных на нём без расширения или редактирования движка модов.

  • Полезно 3

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

Товарищи, parent_id ящика в  оффлайне как получить? Что-то не нашел нигде инфы.

 

Прикладываю код. Суть: спавн объекта секции(пока водки) в ящике по известному sid. Пока не выходит реализовать.

 

Скрытый текст
function spawn_remkom(first_speaker, second_speaker)
	local sim = alife()
	local obj = level.object_by_sid(5003)
	alife():create("vodka",vector():set(39.420829772949,-0.10841239988804,25.139078140259), 1, obj:game_vertex_id(), obj:id())
	
end

 

 

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

Жить стало лучше, жить стало веселей. А когда веселей живётся, то работа скорится.

img.php?nick=Balavnik&sert=2&text=t6

@Balavnik 

function spawn_remkom(first_speaker, second_speaker)
	local sobj = alife():story_object(5003)
	alife():create("vodka", vector(), 0, 0, sobj.id)
end

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

  • Нравится 1
  • Полезно 2

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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

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

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

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

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

Войти

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

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

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