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

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

Вообще, я бы советовал так не делать. Обозначенное большое число возвращается тогда, когда никакой слот не активен, т.е. это аналогично значению -1 допустим. Или nil. Это фактически "шум".

На практике для каких либо действий, обычно требуется проверить активность определенного слота. Ее и выясняйте, if a:active_slot() == то_число_которое_вам_надо. Все практически используемые слоты имеют номера в пределах вполне скромных чисел.

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

Требуется сделать что-то при условии, когда никакой из слотов не активен? Тогда проверяйте active_item, он как раз в этом случае будет возвращать nil, а не числовой шум.

Изменено пользователем Zander_driver
  • Спасибо 1
  • Согласен 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

 naxac

Это имя профиля, только сейчас обратил внимание!!! Получается, что для того что бы работало надо имя профиля вбивать???

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

Жизнь следует измерять поступками, а не временем...

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

 

 

Требуется сделать что-то при условии, когда никакой из слотов не активен?
Имено.Как я уже писал выше - выбросил оружие, проверил слот (получил 4294967296), проверил есть ли в инвентаре еще оружие под слот, из которого выбросил и, если есть такое - вставил и активировал.

Почему спрашиваю - сейчас пробую X-Ray extensions и соответственно входящие в него новые функции on_belt, on_ruck, on_slot. Вот и хотелось бы сразу разобраться.

Проверил по вашему совету "if a:active_item() == nil then" - да, проверка срабатывает и дальнейшая функция полностью себя отрабатывает. Спасибо!

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

Добрый вечер!!!

Подскажите, секция логики "[spawner]" работает только на сталкерах, монстрах, вертолетах??? Ее возможно прописать например как условия существования смарта или нет?

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

 

И еще вопрос если можно, активация схемы в логике поддерживает условия:

[logic]
active = {+поршень или функция} walker, {+поршень или функция}  walker2

Если прописываю, вылетает на "клиент синхронизация", со ссылкой на _g.script:20 может патч не тот? Использую также файлы АМК "amk.script и amk_mod.script + правленный xr_logic.script" что дает возможность в логике прописывать активацию из любых скриптов, а не только "xr_effects.script".  В статьях пишут вроде как должно работать...

игра на патче1.0004

СПАСИБО!!!

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

Жизнь следует измерять поступками, а не временем...

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

 

 

Ее возможно прописать например как условия существования смарта или нет?

Для смартов используется "cond" в настройках смарта, смотри тут.

 

активация схемы в логике поддерживает условия:

Это называется "кондлист". Для гулагов добавляется крайне просто: в xr_gulag.script находишь ф-цию function gulag:get_job_path_name( job ), в ней меняешь строку

local active_section = self.ltx:r_string( section, "active" )

на такую

local active_section_cond = xr_logic.cfg_get_condlist(self.ltx, section, "active", self).-- добавлено чтение кондлиста

Для персональной логики, я думаю, можно исправить по аналогии...

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

Что это сейчас было ?

 

function determine_section_to_activate(npc, ini, section_logic, actor)
	if not ini:section_exist(section_logic) then
		return "nil"
	end

	-- Распарсить строку выбора активной секции с учетом команд, заключенных в %%
	local active_section_cond = cfg_get_condlist(ini, section_logic, "active", npc)
	local active_section
	if not active_section_cond then
		abort("object '%s': section '%s': unable to find field 'active'", npc:name(), section_logic)
	else
		active_section = pick_section_from_condlist(actor, npc, active_section_cond.condlist)
		if not active_section then
			abort("object '%s': section '%s': section 'active' has no conditionless else clause",
				npc:name(), section_logic)
		end
	end
	return active_section
end
- из оригинала.

 

"может патч не тот?" - Ага. Несовместимая версия драйвера /dev/hands

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

У меня она выглядит иначе (правки АМК видимо):

-- Вызывается биндером с целью определить первую активную схему
function determine_section_to_activate(npc, ini, section_logic, actor)
  if not ini:section_exist(section_logic) then
    return "nil"
  end

  -- Распарсить строку выбора активной секции с учетом команд, заключенных в %%
  local active_section_cond = cfg_get_condlist(ini, section_logic, "active", npc)
  local active_section
  if not active_section_cond then
    abort("object '%s': section '%s': unable to find field 'active'", npc:name(), section_logic)
  else
    active_section = pick_section_from_condlist(actor, npc, active_section_cond.condlist)
    if not active_section then
      abort("object '%s': section '%s': section 'active' has no conditionless else clause",
        npc:name(), section_logic)
    end
  end
  if active_section and db.storage[npc:id()].stype and db.storage[npc:id()].stype<=1 and db.storage[npc:id()].stype~=stypes[utils.get_scheme_by_section(active_section)] then -- вот здесь
  -- Блокируем активацию схемы для зверушек в человеческих гулагах. Dirty Hack.
    return "nil"
  else
  return active_section
  end
end

Жизнь следует измерять поступками, а не временем...

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

что-то совсем лыжи не едут...

	local lvid = npc:vertex_in_direction( npc:level_vertex_id(), npc:direction(), 10 )
	if npc:accessible( lvid ) then
		npc:set_dest_level_vertex_id( lvid )
		log( "info", "action_anomaly(%s):execute, accessible: %s, current: %s",
			npc:name(), lvid, self.object:level_vertex_id() )
	else ...
! Cannot find saved game ~info~ [blowout_scheme] (bar_ecolog_professor)evaluator_anomaly:evaluate, dest reached

! Cannot find saved game ~info~ [blowout_scheme] (bar_ecolog_professor)evaluator_anomaly:evaluate, dist: 2.9374704360962 to amk_zone_gravi_zone_strong0777

! Cannot find saved game ~info~ [blowout_scheme] action_anomaly(bar_ecolog_professor):execute, accessible: 41085, current: 41085

и в такой позе стоит.

 

- это так и должно быть ?

Я почему-то думал, что npc:vertex_in_direction() - это не тот вертекс, в котором непись сейчас, а какой-то другой, "в ту сторону".

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

- это так и должно быть ?

Я почему-то думал, что npc:vertex_in_direction() - это не тот вертекс, в котором непись сейчас, а какой-то другой, "в ту сторону".

Значит в ту сторону нет аи-нод или они накрыты запрещающим рестриктором.
Ссылка на комментарий

То есть, тогда конструкция if npc:accessible( lvid ) получается полностью бессмысленной ?

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

То есть, тогда конструкция if npc:accessible( lvid ) получается полностью бессмысленной ?

Не совсем. В принципе функция задумана, что она возвращает или доступную ноду в заданном направлении или ноду, на которой объект стоит.

Но в начале влепили 2 проверки, которые возвращают -1 :)

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

 

 

То есть, тогда конструкция if npc:accessible( lvid ) получается полностью бессмысленной ?

 

Возможно ошибаюсь, но мне кажется эта конструкция должна выглядеть чуть иначе:

 

 local lvid = npc:level_vertex_id()

 if npc:accessible( lvid ) then

        lvid = npc:vertex_in_direction( lvid, npc:direction(), 10 )

        npc:set_dest_level_vertex_id( lvid )

        log( "info", "action_anomaly(%s):execute, accessible: %s, current: %s", npc:name(), lvid, self.object:level_vertex_id() )

 else ...


 

 

В принципе функция задумана, что она возвращает или доступную ноду в заданном направлении или ноду, на которой объект стоит.

 

Полностью согласен.

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

Функция для "combat_ignore", написана специально для одной сценки, хотя в принципе можно использовать по желанию.

function check_fighting_by_community(actor, npc, p)
 if p[1] == nil then
 abort("Wrong string of params in check_fighting_by_community")
 end
 local npc = db.storage[npc:id()].enemy
 local community
 if npc and npc:alive() then
 community = npc:character_community() 
            for i, v in pairs(p) do
                 if type(v) == 'string' and community == v then
                           return true    
     end
     end
 end
 return false
 end

Себя отрабатывает, бой неписи как и положено игнорируют некоторое время, а потом вылет через 1-2 минуты, даже не представляю по какой причине. Оговорюсь, что файл "game_relations.ltx" в полном порядке, несколько раз перепроверил, думаю что все таки из за скрипта вылет случается. Если выключить это условие, вылет исчезает...

Вызов так: "combat_ignore_cond = {=check_fighting_by_community(freedom:dolg)}", ну или какие то другие группировки по желанию...

 

Expression : fatal error


Function : CIni_IdToIndex<1,struct COMMUNITY_DATA,class shared_str,int,class CHARACTER_COMMUNITY>::GetByIndex
File : e:\stalker\patch_1_0004\xr_3da\xrgame\ini_id_loader.h
Line : 147
Description :
Arguments : item by index not found in section game_relations, line communities

 

Благодарю за внимание!!!

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

Жизнь следует измерять поступками, а не временем...

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

 

 

Вызов так: "combat_ignore_cond = {=check_fighting_by_community(freedom:dolg)}", ну или какие то другие группировки по желанию...

 

Попробуйте таким образом:

 

combat_ignore_cond = {=check_fighting_by_community}


 losiara

Если не сработает, попробуйте в xr_conditions.script вписать собственную функцию как-то:

 

function my_check_fighting(actor, npc, p)
if p[1] == nil then
abort("Wrong string of params in check_fighting_by_community")
end
local npc = db.storage[npc:id()].enemy
local community
if npc and npc:alive() then
community = npc:character_community()
for i, v in pairs(p) do
if type(v) == 'string' and community == "ваша" then

return true
end
end
end
return false
end

 

и уже потом смело использовать ее в своих *.ltx.

 

combat_ignore_cond = {=my_check_fighting}

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

А вылет точно в этой функции ?

Или ошибка все-таки в game_relations, line communities ?

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

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

 

gam, в этом варианте получится разовое использование на определенную группировку, для сценки однократно. Тоже можно в принципе. Попробую сейчас.

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

Жизнь следует измерять поступками, а не временем...

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

@losiara, вылет явно не из-за этой функции. Точнее, может и из-за нее, но только косвенно. Проблема явно в game_relations.ltx. Возможно, какая-то группировка там не указана.

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

dsh- у меня действительно есть группировки, но они указаны и прописаны во всех файлах, гуляют их представители, разговаривают и выполняют квесты. При убиении обыскиваются, при нанесении хитов выдают поршни, логику отрабатывают, вылетов не было ни разу!!!

Единственное что меня смущало в game_relations, это вот это:

 

;названия группировок
communities = actor, 0, actor_dolg, 1, actor_freedom, 2, stalker, 5, monolith, 6, military, 7, killer, 8, ecolog, 9, dolg, 10, freedom, 11, bandit, 12, zombied, 13, stranger, 14, trader, 15, arena_enemy, 16, zone, 18, osoznanyie, 19

две последнии мои

 

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

названия группировок


communities = actor, 0, actor_dolg, 1, actor_freedom, 2, stalker, 5, monolith, 6, military, 7, killer, 8, ecolog, 9, dolg, 10, freedom, 11, bandit, 12, zombied, 13, stranger, 14, trader, 15, arena_enemy, 16, wind, 18
Отсчет идет построчно начиная сверху. Хотя есть небольшой нюанс. У первых трех строк - нумерация начинается с нуля, с остальных группировок она идет как надо. Для wind выставили 18, так как мы эту группировку отделили от других.

 

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

Жизнь следует измерять поступками, а не временем...

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

 

 

Единственное что меня смущало в game_relations, это вот это:

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

  • Спасибо 1

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

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

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

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

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

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

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

Войти

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

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

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