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

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

Тема для обсуждения скриптов всего и всех в серии игр 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
Ссылка на комментарий

@naxac, я ему уже предлагал: db.storage[mob:id()].pstor.mparts = n

Не хочет.

 

@F.Constantine, естественно, вылет.

if npc:character_community(stalker) - во-первых, здесь не существует никаких "npc", во-вторых - у неписей нет свойства health_hit_part

 

Это задается именно через конфиг. Разбирайтесь.

Ну и традиционно, горы трупов неписей в модах - результат работы некоей "оффлайн боевки", которая amk_offline_alife.script, вообще не имеет отношения к параметрам неписей, ибо они там просто убиваются случайным образом.

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

@Dennis_Chikin, Спасибо за "совет", конечно :(. Я уже неделю разбираюсь с конфигами, весь опус моих разбирательств подробненько 

в теме "[SoC] Ковыряемся в файлах", на 992 странице

если интересно - хотя вряд ли интересно.

А можно хотя бы подсказать, как правильно прописать проверку НПС на принадлежность к фракции :)?

 

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

function myfunction( npc )
if npc:character_community() ==  "stalker" then

 

Как-то так, наверное.

 

И при вызове его надо туда передать. В bind_stalker, разумеется, никаких npc тоже нет, и откуда бы они там взялись - я не знаю.

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

@Dennis_Chikin, Спасибо, но не помогло.

Я, собственно попытался сделать все по подобию довольно известного метода (он есть где-то здесь на форуме) "как сделать НПС бессмертным" - отдельно взятого НПС по его CID:

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

        Как сделать игрового НПС бессмертным

Пример:

 

function immortal()
local npc = level_object_by_sid(006) --волк
local npc2 = level_object_by_sid(092) --проводник
local npc3 = level_object_by_sid(032)-- кузнецов
local npc4= level_object_by_sid(100) --серый 
npc.health = 1
npc2.health = 1
npc3.health = 1
npc4.health = 1
end

 

Вызов функции прописываем в файле bind_stalker.script :

имя_файла.immortal() -- вызов нашей функции бессмертия
имя файла - это имя файла куда мы положим функцию. 
Например, если в файл test.script - пишем test.immortal() и т.п. 

 

Я эту функцию себе в игре прописал, обессмертил с десяток важных персон, все прекрасно функционирует.

 

Теперь, пользуясь Вашей подсказкой, сделал следующее:

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

Создал маленькую функцию:

 

function superresistance( npc )
if npc:character_community() == "stalker" then
npc.health = 1
end

 

Прописал ее в файлик test.script. А в bind_stalker.script вставил вызов этой функции:

 

...

    -- апдейт схемы детектора
    self.actor_detector:update()

    -- сверхсопротивляемость НПС
    test.superresistance( npc )

    -- апдейт звуковой схемы актера
    xr_sound.update_actor()

...

 

 

 

В общем, снова вылеты. Кстати, в вызове нужно прописывать:

test.superresistance( npc )

или

test.superresistance()

?

 

Изменено пользователем F.Constantine
Ссылка на комментарий

В вызове должен быть передан непись, с которым что-то делаете.

Кстати, в том примере если кого-то из перечисленных не будет в игре - тоже будет вылет.

Ссылка на комментарий
2 минуты назад, Dennis_Chikin сказал:

Кстати, в том примере если кого-то из перечисленных не будет в игре - тоже будет вылет.

 

Да, у меня эта функция с проверкой на живой-неживой для каждого персонажа. Я просто упрощенный вариант написал.

 

4 минуты назад, Dennis_Chikin сказал:

В вызове должен быть передан непись, с которым что-то делаете.

 

Ну, т.е. в данном случает должно быть именно test.superresistance( npc )

Ссылка на комментарий
3 часа назад, Dennis_Chikin сказал:

Не хочет.

Денис, ну, во-первых, не “не хочу”, а “не умею”, о чём я чётко и честно написал выше.
Я понимаю, что тебе решение этой задачи видится простым, ясным и сразу, но извини, не все обладают такими познаниями в написании скриптового кода.
Мои скромные скиллы пока не дотягивают до решения таких задач, потому и обратился за помощью. А до:

3 часа назад, Dennis_Chikin сказал:

db.storage[mob:id()].pstor.mparts = n

Я б в жизни не додумался
В каких модах и скриптовых сборках можно наглядно посмотреть практическое использование метода записи в pstor монстра и чтения из него?
 

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

@Капрал Хикс, тебе по идее вообще с пстором не надо заморачиваться. Если я правильно понял скрипт мясника, то когда ты юзаешь монстра и у тебя есть ножик, то спавнятся запчасти от монстра.

По идее тебе надо следующий код из мясника:

        self.item = read_if_exist("s",nil,self.object:section(),"Spawn_Inventory_Item_Section",nil)
    if self.item then
        self.item_count = read_if_exist("f",nil,self.object:section(),"Spawn_Inventory_Item_Amount",1)
    else
        return
    end
        for i=1, self.item_count do
        alife():create(self.item, who:position(), who:level_vertex_id(), who:game_vertex_id(), who:id())
    end

заменить на вызов функции

скрипт_реальных_частей.spawn_parts(self.object)

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

Изменено пользователем abramcumner
  • Полезно 1
Ссылка на комментарий

"В каких модах и скриптовых сборках можно наглядно посмотреть" - понятия не имею.

Разницы с неписями и даже актором - вообще ни какой.

 

Точнее, единственная с конкретно актором в том, что актор в офлайн не ходит, и, соответственно, записанное сохраняется всегда. Впрочем, трупы в офлайн тоже, как правило, не ходят.

 

@abramcumner, в "реальных запчастях" типа только количество увеличивается, без учета способа забоя? и всегда одинаковое? Ну и все равно надо хранить, что запчасти уже спавнили.

 

upd: посмотрел исходный пост еще раз: там в приведенном куске вообще странное делается. Так что хранить надо "минус запчасти", и при смерти вычислять разницу. При использовании тушки - создавать, и обнулять сохраненное.

Изменено пользователем Dennis_Chikin
Ссылка на комментарий
1 минуту назад, Dennis_Chikin сказал:

 

@abramcumner, в "реальных запчастях" типа только количество увеличивается, без учета способа забоя?

По идее нет, отслеживаются хиты по костям моба и если хит в неудачную кость, количество частей уменьшается. Результаты этого подсчета наверное хранятся в таблицах m_tD  и m_Tbl.

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

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

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

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

 

"Умные_запчасти" умно считает запчасти.

"Мясник" спавнит посчитанные запчасти, если подошел с правильным инструментом.

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

Попробовал всё по рецепту... Надпись "Срезать трофей" появляется, но тушка обыскивается и с ножом и без ножа в руках и даже с ножом выкинутым (стоит такая возможность).

Запчасти вроде спавнятся. Копаю дальше.

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

Обыскиваться она будет всегда.

Без лазания в модельку максимум что можно сделать - добавить в on_use()

level.hide_indicators()

level.show_indicators()

 

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

@Dennis_Chikin

5 часов назад, Dennis_Chikin сказал:

Да, и Вы перед  этим должны его откуда-то взять.

 

Уф, сплошные ребусы. Вы же на совершенно непонятном мне языке разговариваете :). В моем понимании "npc" в данном случае - любой НПС, которого мы проверяем на принадлежность к фракции "сталкеры". Но я, очевидно, ахинею несу, да :)?

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

Да, любой непись. Только в Ваших первоначальных вариантах, с вылетами, никаких неписей вообще не предусматривалось. Потому и вылеты.

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

@Dennis_Chikin, Ок, т.е. то, что требовалось сделать - поставить ( npc ) в скобочках после названия функции? В этом смысле: "должны его откуда-то взять"?

 

Ну второй-то вариант:

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

 

function superresistance( npc )
if npc:character_community() == "stalker" then
npc.health = 1
end

 

Прописал ее в файлик test.script. А в bind_stalker.script вставил вызов этой функции:

 

    test.superresistance( npc )

 

 

тоже дает вылеты. А в нем что не так :)?

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

@F.Constantine, пропиши суперресистанс в апдейт в xr_motivator, там находится биндер неписей, и передавай в него не непонятный npc, a конкретный self.object.

Изменено пользователем naxac
  • Нравится 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

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

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

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

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

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

Войти

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

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

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