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

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

MIDERY, Может быть, кроме анимации стоит еще здоровье этого НПСа убавить, чтоб он не сомневался в своей ранености?

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

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

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

Вопрос: ЗП 1.6.00

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

 

 

local food = {
       bread       = true,
       kolbasa    = true,
}

local interval = 0

function porsha_food()
   if interval < time_global() then
   local time = game.time() + 300
      for i=1, 300 do
      if game.time() == time then
        db.actor:iterate_inventory(function (dummy,item)  
           if food[item:section()] then
              this.del_item(item)
              this.spawn_item(tostring(item:section().."_propal"))
           end
         end, nil)
      interval = time_global() + 1000
    end
 end
end

 

Акривировал так:

 

function actor_binder:update(delta)
dfz_porsha_food.porsha_food()
    object_binder.update(self, delta)

 

Но произошёл вылет с таким логом:

 

FATAL ERROR

 

[error]Expression : !m_error_code

[error]Function : raii_guard::~raii_guard

[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp

[error]Line : 748

[error]Description : d:\stalker cop\gamedata\scripts\bind_stalker.script:231: attempt to index global 'dfz_porsha_food' (a nil value)

 

Помогите исправить?

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

Tris, О_о, я прям себя узнал 2 года назад.

 

1)

end, nil)

-- это убрать надо. а то бред какой-то.

2)

 kolbasa    = true,
}

 

запятая после последней строки не нужна...

 

Проверь,но это первое,что я заметил из синтаксических ошибок...

Что-то кончается, что-то начинается...

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

Vano_Santuri

-- это убрать надо. а то бред какой-то.

Нет, не надо. В метод iterate_inventory передается функция и какой то еще параметр. А то что ты указал - это последний end функции и передача nil в метод iterate_inventory

Freedom

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

Vano_Santuri,

 

Исправил но вылетать продолжает.

Вылет во время загрузки.

 

FATAL ERROR

 

[error]Expression : !m_error_code

[error]Function : raii_guard::~raii_guard

[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp

[error]Line : 748

[error]Description : d:\stalker cop\gamedata\scripts\bind_stalker.script:231: attempt to index global 'dfz_porsha_food' (a nil value)

 

 

stack trace:

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

Tris

local food = {
bread = true,
kolbasa = true
}

local interval = 0

function porsha_food()
    if interval < time_global() then
        local time = game.time() + 300
        for i=1, 300 do
            if game.time() == time then
                db.actor:iterate_inventory(
                function (dummy,item)
                    if food[item:section()] then
                        this.del_item(item)
                        this.spawn_item(tostring(item:section().."_propal"))
                    end
                end, nil)
            interval = time_global() + 1000
            end
        end
    end
end

Теперь у тебя этот вылет исчезнет

 

А на будущее скачай себе script Syntax checker от Gun12

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

Freedom

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

MIDERY, Полезно почитать

Можно примерно так:

local h = object.health
object.health = 0.05 - h

Где object - это собственно нужный вам нпс. Как получить его объект, существует масса способов, начиная с того что проще всего его выцепить и запомнить по ид при спавне.

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

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

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

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий
Zander_driver, Чтож, чуть чуть почитал. Немного недопонял - как же все-таки это сделать, при спавне через all.spawn? Это, как я понимаю скрипт, но как его активировать при начале новой игры, без квестов и поршней? Как я понимаю, такой скрипт с объектом, чей story_id будет 10000 будет выглядеть так:
local h = 10000.health
10000.health = 0.05 - h

или надо прописать имя его профиля?

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

MIDERY

Ох ё... Конечно не так это будет.

Для story_id будет так

 

if object:story_id() == 1000 then
local h = object.health
object.health = 0.05 - h
end

для профиля так:
if object:profile_name() == "тот_что_тебе_нужен" then
local h = object.health
object.health = 0.05 - h
end

для секции так:
if object:section() == "секция_непися" then
local h = object.health
object.health = 0.05 - h
end

И раз уж оказалось непонятно, поясню подробнее: object здесь - это клиентский объект НПСа. тип данных *game_object.

 

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

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

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

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

Zander_driver, не с того ты начал пытаться объяснять/помогать ...

 

MIDERY, учти, чуток почитал, чуток понял ... в скриптах/логике не прокатит.

Исходняй вопрос:

MIDERY ... как заспавнить раненного непися и сделать так, чтобы с ним можно было поговорить, но он при этом не вставал?
Немного общей теории:

1. Заспавнить можно через all.spawn, или скриптом.

В первом случае потребуется в секции спавна нужного НПС установить значение здоровья соответствующее "раненый" (об этом ниже). При чем, обязательно установить и параметр 'upd:health' в 'раненый', иначе НПС встанет со временем и начнет свою 'нормальную' жизнь.

Во-втором случае, аналогично потребуется установить значениЯ здоровья в 'раненый', но с помощью нет-пакетов и новая игра не требуется.

2. Все неписи подчиняются общим схемам, в которую обязательно входит схема раненого (xr_wounded.script). В этой схеме неписям устанавливаются значения (hp_state,hp_state_see,psy_state ...) в которых определенным значениям здоровья сопоставляются определенные действия, т.е. какую позу принять, какую фразу сказать и пр.

Если в логике НПС нет прописанных значений для этой схемы - значения устанавливаются по дефолту. Это значит, что при здоровье health <= 0.1 непись будет валяться и просить помощи. При health >= 0.5 - встанет и ... далее в зависимости от обстановки.

3. Возможность разговаривать с ранеными прописана в схеме xr_meet.script, которая дефолтно запрещает ГГ разговаривать с врагами, вояками и т.п. Также, в логике НПС может быть свои установки для ведения разговоров.

 

Т.о. чтобы решить задачку исходного вопроса простым спавном и сбросом здоровья для НПС ничего не выйдет. Упасть может он и упадет, может какое-то время даже и поваляется, но ... не забываем, что для НПС работает реанимация здоровья и через некоророе время здоровье восстановится до 50% и НПС встанет как ни в чем ни бывало. Это означает, что или править параметр 'upd:health' до значения 'раненый' или написать логику для НПС чтобы даже при 100% здоровья валялся раненым до некоего события ... или ... тупо биндить этого непися и апдейтом сбрасывать его здорове до 'раненый'.

 

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

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Хочу написать скрипты на проверку положения ГГ (сидит, в глубоком приседание, стоит, идёт, бежит). Для худа нужно

Знакомый скриптер подсказал, куда вставлять (в bind_stalker-е), вот только я не знаю как саму проверку сделать.

Не поможете?

Работаю с ЗП.

 

Там, насколько я понял надо так начать:

function_actor_sit

Выводы модмейкера:

1)Вылетает - это хорошо. Значит, работает :)

2) Если хочешь сделать что-то хорошо, делай сам!

3) Если падёшь духом, падёт и мод.

4) Он живой... :o

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

SibireaStalker, о-о-о ... батенька ... с азбукой скриптов/программирования у вас совсем напряженка.

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

Помочь то можно, но проще так:

1. Сформулируй подробно то, что хочешь получить в итоге.

2. Укажи/выложи те исходные данные, которые имеешь, т.е. критерии по которым ты считаешь нужно определять положение ГГ.

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

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Коллеги, может, кто поможет? Ситуация такая: вылет по стори айди.

FATAL ERROR

 

[error]Expression : no_assert

[error]Function : CALifeStoryRegistry::add

[error]File : E:\stalker\patch_1_0004\xr_3da\xrGame\alife_story_registry.cpp

[error]Line : 30

[error]Description : Specified story object is already in the Story registry!

 

Предпосылки: да в общем-то, никаких. Сначала хотел создать респавнер, он не создался из-за этой ошибки. Далее стал проверять, что вообще творится, и в итоге выяснил, что через алл.спавн вообще перестали создаваться объекты! Пробовал на разных уровнях, в разных координатах, с разными секциями спавна, с разными СИДами (и без них). Дошло до того, что перед ГГ не создается банальный деревянный ящик при старте игры. Просто не представляю, что делать... Причем если откатиться на момент перед созданием этого респавнера, все работает (однако дело уже по ходу не в нем - ведь перестало создаваться ВООБЩЕ что-либо).

 

Добавлено

Пока писал пост, пришла идея - удалил последнюю рабочую секция спавна, на ее месте создал другую - заработало. При создании следующей секции опять вылет по стори айди. Единственная оставшаяся мысль, что у меня алл.спавн закончился... Но ведь такого не бывает, правда ведь?

Изменено пользователем Dreamtale
Ссылка на комментарий
gruber, я не настолько неопытный, как может показаться по количеству сообщений. Начинал, конечно. В общем, после последней _рабочей_ секции алсспавна не спавнится ничего ни при каких условиях (проверил, кажется, все возможные варианты)... Как будто реально у него закончилось свободное место для предметов.
Ссылка на комментарий
Dreamtale, Проще всего проверить твою теорию ,это удалить пару объектов и добавить вместо них свои,но какой же должен быть аллспавн чтоб в нем кончились места,помоему 65000 ;)
Ссылка на комментарий

Dreamtale, место в аll.pawn'е закончиться не может. Даже если ты в него запихнешь более 65535 объектов, то все одно движек при создании новой игры ругаться будет уже на нехватку ID'ов, а не на сиды.

Однозначно, подобные ошибки возникают при некорректных конфигах секций в распакованном спавне и/или некорректной запаковке, т.е. версия ACDC не правильно трактует классы пакуемых объектов.

Выкладывай твой спавн (желательно и с распакованным вариантом) + конфиги + используемый упаковщик (ACDC) - попробуем найти причину. Думаю и KD87 поможет, если будет с чем помогать, а не гадать.

 

Добавлено через 3 мин.:

gruber, при загрузке сохранения all.spawn (хоть новый, хоть старый) - игнорируется. Поэтому из-за правки алл.спавна такие ошибки невозможны. Исключение только в модах, которые доспавнивают объекты в игру по секциям из алл.спавна.

 

Кстати, Dreamtale, а не из-за сдвига ли секций в алл.спавне твоя проблема?

Если в моде спавнятся объекты по секуиям из него, то как минимум требуется корректировка цифирек в кодах/скриптах независимо НИ или сэйв!

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

Да я пошутил про место - понятно, что оно не закончилось.

Artos, Ок: ацдц от 11 октября, последняя секция спавна, при которой вылет:

[9041]

 

 

 

section_name=physic_destroyable_object

 

position = -57.74195098877,-6.4983997344971,13.447357177734

direction = 0,0,0

 

game_vertex_id = 778

level_vertex_id = 4007

 

story_id = 10015

 

 

 

name = agr_under_box_9

 

distance = 0

 

object_flags = 0xffffff3a

 

visual_name = physics\box\box_wood_01

 

physic_type = 0x3

 

mass = 10

 

Вообще, если более доступно описать проблему:

Имеем n секций спавна, при добавлении секции n+1 получаем вылет. Удаляем секцию n+1 и еще в придачу n (в итоге получаем на одну секцию меньше, чем при последнем рабочем варианте) - все работает. Добавляем секцию n+1 (любую другую - не обязательно ту же самую, что в первой итерации - в итоге получаем количество секций, равное последнему рабочему варианту) - работает. Добавляем n+1 секцию и снова получаем вылет. То есть как бы я ни изгалялся, при достижении количества секций спавна числа n+1 получаю вылет. Также наверянка важная информация - если допустить явную ошибку в аллспавне (например, забыл из копипащенной секции удалить сид), размер лога - 7 r,? если все вроде бы должно работать - размер лога 17 кб... То есть, по идее, аллспавн он считывает и виснет уже потом.

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

Dreamtale, далее - не будет исходногого материала - погадалки прекращаю. Куцые цитатки секции и домыслы - только для флуда годятся.

 

1. Номер твоей последней секции (9041) говорит что добавляешь в конец распакованных секций.

2. Номер game_vertex_id = 778 - говорит о том, что спавнишь в подземелья агропрома.

Ну а при запаковке, эта секция получает совершенно иной номер(!), ей присваивается номер по порядку следования локаций и она попадает в середину, сдвигая все за ней последующие. Если в этих сдвинутых секциях имеется секция, номер которой в последующем используется для скриптового переспавна в игре - получаешь спавн совершенно иного объекта и вполне возможно с уже занятым сидом. При чем, скрипту нет-пакетов ты передаешь один класс объекта, хотя спавнится возможно совершенно иной - получаешь битый нет-пакет и вылет по некорректному сиду.

Ну а то, что вначале все считывается, а уж потом происходит вылет - как раз ничего почти не говорит. Вначале из алл.спавна считываются конфиги и записываyюся заготовками объектов. Уже при повторной переинициализации объектов происходит обнаружения несоответствий/ошибок.

 

Повторяю уточняющий вопрос: В скриптах твоего мода спавнятся ли объекты по секциям из алл.спавна? В особенности на локациях подземелья Агропрома и последующих?

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

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