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

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

лог

[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: d:\games\С.Т.А.Л.К.Е.Р\gamedata\scripts\bind_stalker.script:235: attempt to index global 'inventory' (a nil value)

 

inventory - это скрипт

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

Говори, что и где правил в бинд_сталкер и выкладывай все новые скрипты, под спойлер конечно.

Вылет (если я прав) указывает на то, что в скрипте inventory есть синтаксическая ошибка.

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий
Вылет (если я прав) указывает на то, что в скрипте inventory есть синтаксическая ошибка.
Это я понял, но вот где она. В бинд-сталкер просто поставил апдейт этой функции

 

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

Все, проблема решена, спасибо

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

Darkscape, а зачем у тебя проверки разных предметов через elseif идут? Этак получается, колбаса начнет становиться радиоактивной только тогда, когда нерадиоактивный хлеб в инвентаре закончится. А если его много? понадобится немало апдейтов чтобы до колбасы дошла очередь...

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

 

Способ получше - сделать у себя в скрипте список секций продуктов, которые надо проверять, и если радиация поднялась выше 0,3, а перед тем была ниже - перебором предметов в инвентаре сразу обнаруживаем все подходящие предметы (продукты). заносим найденные итемы в таблицу. И при следующем апдейте заменяем их все разом, секцию нового предмета определяя по принципу секция_старогo..rad.

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

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

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

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

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

Zander_driver, спасибо за совет, переписал скрипт, получилось:

local items1 = {"bread", "kolbasa", "chocolate"}

function rad_food()
   if db.actor.radiation>0.3 then
      for i=1,table.getn(items1) do
         db.actor:iterate_inventory(function (dummy,item)  
            if item:section()==items1[i] then
               dsm.del_item(item)  
               dsm.spawn_item(tostring(items1[i].."_rad"))
            end
            end, nil)
      end
    end
end

Все работает, вроде правильно написал

 

1. Используем спойлеры ...

2. Перед написанием вопросов проверяем коды чекерами (см. в топике по инструментарию)

--/ Artos

Изменено пользователем Artos
Ссылка на комментарий
Кивач: Кто знает где прописан спавн ПДА для НПСов?

Прописан в движке.

Каждому(!) спавнящемуся НПС после прописанных ему предметов в конфигах (если таковые есть), движек обязательно доспавнивает "именной" КПК. Т.о., сколько в Зоне людей - столько и КПК у них на руках.

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

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

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

Ребят подскажите пожалуйста как определить отношение одной группировки к другой ?

В Lua_help нашел функцию.

 

function community_relation(string, string);

 

Предполагаю, что нужно взять id группировок и сравнить.

 

community_relation(id1,id2)

 

Если это то, что я хочу, то какие варианты может вернуть эта функция?

good, friend, enemy и т.д...

 

Как вызвать эту функцию? Она глобальная? Или нет?

 

Сам понимаю, что могу сам проверить, но решил спросить у знающих людей...

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

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

Vano_Santuri

Удивляют подобные вопрошалки-переспрошалки ...

1. Спрашивающий не удосуживается уточнить интересующую его версию игры. Гадать о том, что он "нашел" нужную ему функцию в 'lua_help' именно от ему нужной игры (т.е. ЧН/ЗП)?

2. Достаточно сделать простейший поиск по скриптам исходной игры и найти практические примеры применения от разработчиков, из коих предельно ясно и как вызывать функцию и какие аргументы ей нужны и каковы возможные результаты (возвраты) от применения функции (см. game_relations.script).

:-(

 

Функция естественно глобальная и принадлежит пространству 'relation_registry'.

В качестве аргументов должны быть именно строковые значения группировок (community), а не некие id, под которыми которыми чаще понимают/обозначают численные значения.

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

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

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

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

Vano_Santuri, relation_registry.community_relation(faction, faction_to)

Может возвращать friends и enemies

Пример из игры:

if(relation_registry.community_relation(squad:get_squad_community(), alife():actor():community())>=FRIENDS) then

goodwill = "friend"

 

Поправьте если что

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

ХОВАН

Ну для чего вводить в заблуждение?

Сам же цитируешь стоку кода от разработчиков:

if(relation_registry.community_relation(squad:get_squad_community(), alife():actor():community())>=FRIENDS) then

Из коей ясно, что сравниваются ЧИСЛЕННЫЕ значения (>=) результата работы функции и константы (ранее заданной как FRIENDS = 1000).

О каких тут возвратах friends иль enemies можно толковать??? Результатом возврата (повторюсь) является численное значение (как минимум в диапазоне: -1000 ... 1000)

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

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

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

О форматировании строк вопрос. В примере по добавлению часов на худ, пробую к строке времени добавить еще строку:

...............
...............
local str = "вторая строка"
local msg = string.format(" %02d:%02d\n%s", time_h, time_m, str)

if cs ~= nil then
    cs:wnd():SetText(msg)
end

результат получается "07:10вторая строка". Что я не так делаю ?

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

http://stalkerin.gameru.net/modules.php?na...tit&lid=290

 

Скачай это, умеет проверять скрипты на синтаксические ошибки. :)

 

Потом, ты сделал чутка не правильно цикл. Сейчас у тебя для КАЖДОГО предмета перебирается ВЕСЬ инвентарь когда достаточно РАЗ перебрать весь инвентарь и сравнивать секцию предмета с той, что в таблице. Плюс такая схема довольно прилично будет нагружать игру. За 1 секунду в среднем выполняется около 4 апдейтов (при норм. ФПС) и терь представь что раз в секунду у тебя столько переборов инвенторя будет :) Игра просто начнёт тормозить, но ты заметишь это тока тогда, когда у тебя будет куча подобного кода ...

 

В итоге лучше будет сделать так:

 

local items1 = {
        bread       = true,
        kolbasa    = true,
        chocolate  = true,
}
local rad_food_interval = 0

function rad_food()
   if db.actor.radiation>0.3 then
    if rad_food_interval < time_global() then
   -------------------------------------
         db.actor:iterate_inventory(function (dummy,item)  
            if items1[item:section()] then
               dsm.del_item(item)  
               dsm.spawn_item(tostring(item:section().."_rad"))
            end
          end, nil)
    -------------------------------------
     rad_food_interval = time_global() + 1000 --\\ заставим нашу функцию выполнятся РАЗ в секунду 
     end
    end
end

 

В итоге основная часть этой функции будет вызывать только раз в секунду при условии что игрок заражён радиацией.

И предметы в инвенторе будут перебираться лишь 1 раз за вызов а не для каждого предмета. :)

 

 

 

> Каждому(!) спавнящемуся НПС после прописанных ему предметов в конфигах (если таковые есть), движек обязательно доспавнивает "именной" КПК. Т.о., сколько в Зоне людей - столько и КПК у них на руках.

 

Правда? Я думал этот рудимент вырезали с билдов, и у них просто обычный PDA спавнится. Тоесть если я напишу npc:object("deivce_pda"), то я в большинстве случаев получу его именной ПДА? (Кстати, а существует ли возможность скриптом изменить имя и описание объекта, как с этими именными ПДА ...)

 

Vano_Santuri

-- Узнаём отношение группировки к другой группировке
function get_faction_relation(f1, f2)
if game_relations.is_factions_friends(f1, f2) then return "friend" end
if game_relations.is_factions_enemies(f1, f2) then return "enemy" end
return "neutral"
end

 

Должно работать, правда на ЗП не проверял.

 

AndreySol

В UI-конфиге объекта CS поставь complex_mode = "1" (кажется так) а в скрипте попробуй cs:wnd():SetText(msg) заменить на cs:wnd():SetTextST(msg)

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

Может я тоже ошибаюсь, но по моему у тебя тоже есть ошибка:

item:section() возвращает строку следовательно таблица должна быть такая:

local items1 = {
        ["bread"]       = true,
        ["kolbasa"]    = true,
        ["chocolate"]  = true,
}

Если я конечно же тоже не ошибаюсь

 

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

[error]Expression : motion_ID.valid()

[error]Function : CKinematicsAnimated::ID_Cycle

[error]File : E:\stalker\sources\trunk\xr_3da\SkeletonAnimated.cpp

[error]Line : 136

[error]Description : ! MODEL: can't find cycle:

[error]Arguments : $editor

 

 

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

t.skeleton_name="idle"

Но некоторые визуалы (например визуал излома или химеры) все равно вылетают. Что нужно написать в t.skeleton_name чтобы не вылетало?

Freedom

Ссылка на комментарий
_Призрак_, открой в hex редакторе файл модели, в конце прописаны доступные анимации. У сталкеров прописаны все анимации из stalker_animation.omf, а у монстров анимации по отдельности. У той же химеры, например, анимации "idle" нет. Возможно, поэтому у тебя вылет. Изменено пользователем KD87
Ссылка на комментарий

*Shoker*,

SetTextST

отличается только тем, что транслирует строку. Тоесть если подать идентификатор, то выдаст нормальную текстовую строку, а не сам идентификатор. Аналогично

SetText(game.translate_string(msg))

Vita sine libertate, nihil

Vita sine litteris - mors est

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

_Призрак_

Не беспокойся, игра и такую таблицу переваривает, проверенно :)

 

RvP

Спс. Буду знать :)

 

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

AndreySol, тогда добавь ещё один "слешь":

local msg = string.format(" %02d:%02d\n%s", time_h, time_m, str)

local msg = string.format(" %02d:%02d\\n%s", time_h, time_m, str)

всё легко

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

По ТЧ:

1. Как скриптово сделать монстра и непися друзьями?

2. Можно ли реализовать в ТЧ сценку из ЗП, где военный стреляет по сторонам, атакованный контролером?

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

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

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

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

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

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

Войти

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

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

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