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

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

@Капрал Хикс, а что хранится в таблице tD в "умном выпадении запчастей"? По идее, нужно сохранять где-то по id монстра количество оставшихся рогов и копыт (у тебя, я так понял, это m_Tbl[section].param), а потом при "отрезании" тут:

if self.item then

        self.item_count = ...

брать значение не из конфига, а по self.object:id() из этого "где-то", вот и всё.

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

naxac.gif

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

Всем доброго времени суток.

 

Сделал первый в жизни скриптик к "Сталкеру ТЧ" - естественно, получил вылет :). Подскажите, что не так сделал, пожалуйста.


 

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

 

Задача была повысить сопротивляемость урону всех НПС из сталкеров-одиночек (ну, просто надоело их трупы находить повсеместно). Сделать через конфиги не смог - разработчики там запутали все в какую-то безумную паутину перекрестных ссылок и #include-сов. Либо вообще не работают изменения, либо работают на всех НПС-людей, всех фракций сразу.

 

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

 

function superresistance()
if npc:character_community(stalker) then
npc.health_hit_part = 0.1
end

 

Параметр health_hit_part взят из конфигов сталкеров, это "процент хита, уходящий на отнимание здоровья".

Прописал в файлик test.script 

 

В bind_stalker.script вставил ссылочку test.superresistance(), ну вот так:

 

...

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

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

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

...

 

 

Что не так сделал? Заранее - спасибо.

Добавлено  Опричник,

Длинные тексты пожалуйста под спойлер. Выделить текст и нажать на панели инструментов кнопку с глазом.

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

@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 )

 

 

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

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

×
×
  • Создать...