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

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

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


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

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

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

 

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

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

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


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

Здравствуйте! Сегодня решил попробовать свои силы в создании модов для Сталкера, так как это моя любимая игра. Когда-то раньше пробовал, но почему-то забросил...

Я в основном занимаюсь Web-программированием, а сегодня попробовал скрипты, минут за 20 сделал  такую штуку, как механизм событий и их обработчиков, это что-то вроде биндинга, но по-другому работает.

Принцип сейчас покажу в коде:
 


function handler()
    -- Тут всякий код
end
function handler2()
    -- Тут всякий код
end

setHander("test_action", handler)
setHander("test_action", handler2)

setAction("test_acton")
-- Будет выполнен код из функций handler() и hander2()

Такая штука будет очень полезна, когда нужно обработать какое-то событие в моде и вся эта система должна содержаться в порядке.
Вызывать события можно вообще любые:
setAction("bla-bla-bla"). Если нет обработчиков, то ничего не произойдёт, но ошибок не будет

Регистрировать обработчики можно в любом месте любого скрипта, будет работать.

Например при заходе на локацию вызывать событие on_location_zaton, тогда можно будет событие обрабатывать.

В общем система очень простая и полезная, можно много применений найти. Её можно использовать в любой версии Сталкера, так как она использует только возможности языка Lua

Также в приведённом коде есть ещё некоторые функции, они может и не самые полезные, но их тоже можно использовать.

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

 

Мог объяснить не очень понятно, просто спать уже хочу... Критикуйте) буду только рад

Как вам моя идея? Есть ли у неё перспективы?
Если есть предложения, чего бы ещё сделать, предлагайте)
 

 

  Показать

 

Добавлено Dennis_Chikin,

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

  • Нравится 1
Ссылка на комментарий
  Николай1 писал(а):

Как вам моя идея? Есть ли у неё перспективы?

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

Но на еще один велосипед посмотреть можно, сарказма тут нет, ибо так оно и есть.

 

1. Убило название функции для срабатывания события - setAction. Установить действие? Иногда называют такие методы fire или fireEvent, но не setAction.

2. Нет передачи аргументов в хендлеры.

3. Нет прерывания срабатывания событий (в цикле).

4. Симпатичное комментирование кода, конкретно описание аргументов + тип.

ТЧ 1.0004. SAP и Trans mod

github

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

@Николай1, начинание благое, жаль только припозднилось года этак на 2-3.
Но если удастся предложить что-то действительно новое и полезное - всем будет только хорошо.

Для начала рекомендую изучить аналогичные решения, уже предложенные другими авторами, коих даже больше, чем указал @Desertir.

Можно сделать общий поиск по форуму слова «event». Или поискать отдельные варианты: "Песочница" от @xStream, слот-сигнальная система от @Malandrinus, были ещё частные реализации от @Artos и, кажется, @Monnoroch и @Viнt@rь.

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

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

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

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

Кто объяснит, как в цикле for отловить последнюю итерацию?

 

  код (Показать)

Сталкер - наше всё!

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

@AndrewMor, как минимум "if i==count then", чтобы не вылетало.

А во-вторых, после окончания действия цикла (перед закрывающим функцию "end") в переменной col как раз и будет нужное значение, можно делать с ним что угодно.

  • Спасибо 1

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

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

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

 

 

  Kirgudu писал(а):
как минимум "if i==count then", чтобы не вылетало.

Блин, ну конечно. Привычка, что "=" - это сравнение. Спасибо.


Kirgudu, переписал функцию так:

  код (Показать)

Сталкер - наше всё!

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

Потому что переменая i существует только внутри цикла, а вне его равна nil.

Оставь только проверку на col ~= 0.

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

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

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

@Kirgudu, А всё равно выводится не одно сообщение, а несколько. Я так понимаю, что биндер отслеживает получение первого предмета и идет подсчет в цикле. Выводится сообщение. Далее отслеживается получение предмета номер 2, опять цикл и вывод сообщения. Ну и так далее. А как бы мне сделать, чтобы выводилось только одно, итоговое сообщение?

Сталкер - наше всё!

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

@AndrewMor, ты б объяснил толком, что хочешь сделать.

Свои работы и совместные проекты: ИнструментOGSM CSFinal StrokeHARDWARMOD

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

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

@Kirgudu, при взятии денег из схрона прибавлять их к общим деньгам ГГ, взятые деньги из рюкзака долой, а потом выводить сообщение о полученной сумме целиком. Эта моя функция вызывается из биндера on_take_item.

Сталкер - наше всё!

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

@AndrewMor, как-то так лучше сделать:

function take_money(obj)
if obj:section() == 'money_500' then
alife():release(alife:object(obj.fov and obj:id() or obj.id))
db.actor:give_money(500)
news_manager.send_tip(db.actor, "Получено 500 рублей.", nil, nil, 10000)
end
end

При желании рандомизировать, циклы тут точно не нужны, лишняя нагрузка.

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

"при взятии денег из схрона прибавлять их к общим деньгам ГГ"

 

Если деньги - это предмет, то вешаем вызов на on_take_item_from_box().

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

@Dennis_Chikin, лучше на обретение. Какая разница откуда ты их получил если алгоритм для всего один и тот же? Будь-то труп, тайник или любой другой способ.

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

Ребята, помощь нужна.

Мне нужно заспавнить physic_destroyable_object. Через all.spawn всё красиво, но есть одно "НО" - не работает функция [spawner]. Может быть через скрипт как-то можно его спавнить, а то я что-то не догоняю... 

PS Всем мир!

Пишу мод с неповторимым сюжетом.

Нужны "модельеры"

Заинтересованным писать в ЛС

J.A.A..gif

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

 

 

  J.A.A. писал(а):
Мне нужно заспавнить physic_destroyable_object. Через all.spawn всё красиво, но есть одно "НО" - не работает функция [spawner].

Насколько я помню, секция spawner работает только для НПС и монстров.

Сталкер - наше всё!

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

Всем привет, опять я со своей проблемой по деньгам.

В bind.stalker.script в биндере take_item_from_box пишу: money.take_money(item)

 

Мой скрипт:

  код (Показать)

Сталкер - наше всё!

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

@AndrewMor, зачем ты спрашиваешь? Я тебе сказал как нужно сделать, но ты упорно продолжаешь делать по своему. Ты понимаешь как работает коллбек? В общем, как говорится, "если не можешь - значит не нужно"(с).

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

@Карлан, Я делал, как ты посоветовал, и все равно не работает.

 

PS: ты бы лучше объяснил, что где не так. В общем, спасибо за "помощь".


Карлан, по твоему совету при обыске трупа вылет:

  лог (Показать)

Сталкер - наше всё!

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

function take_money(pid)

db.actor:iterate_inventory(is_item, db.actor)

end

 

Жуть какая...

Собственно, то, что получаем - это и есть искомый предмет. Все. Получаем id, получаем объект, удаляем.

Больше ничего не надо. Ни каких итераций.

 

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

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

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

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

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

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

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

Войти

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

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

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