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

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

Тема для обсуждения скриптов всего и всех в серии игр 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
Ссылка на комментарий
https://www.amk-team.ru/forum/topic/6185-skriptovanie/

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

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

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

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

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

 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 пользователей

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