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

Внимание. На форуме проводятся технические работы с боковым меню.

_Val_ _Val_

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

Тема для обсуждения скриптов всего и всех в серии игр 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/
7 часов назад, gam сказал:

Конечно. Но для чего?

Чтобы сделать проверку, когда ГГ обыскивает любого НПС из группы.

27.10.2024 в 16:39, gam сказал:

Имхо конечно

Вы извините, товарищи, но это тихий ужас. Неужели никто ничего не заметил? Или тут всеобщий стёб пошёл, который я не понял?

function yan_storyline_spot_add()
        for i = 1, 65534 do
            local sim = alife() -- зачем определять переменную sim внутри цикла? Чтобы функция alife() выполнилась 65534 раз? Но это ещё полбеды.
                if sim then
                    local sobj = sim:object(i)
                    if sobj and sobj:section_name() == "yan_storyline_ecolog_spot1" and sobj:section_name() == "yan_storyline_ecolog_spot2" and sobj:section_name() == "yan_storyline_ecolog_spot3" and sobj:section_name() == "yan_storyline_ecolog_spot4" then
                    -- Согласно условию, секция объекта должна быть равна одновременно и "yan_storyline_ecolog_spot1" и "yan_storyline_ecolog_spot2"
                    -- и "yan_storyline_ecolog_spot3" и "yan_storyline_ecolog_spot4", поскольку использовано AND.
                    -- Такое условие никогда не выполнится.
                        --    printf("level has sobj", sobj)
                        level.map_add_object_spot(sobj.id, "crlc_big", "storyline_yan_spot")
                    end
                end
        end
end

 

@abramcumner а это уже я не заметил. :)

Изменено пользователем Kirgudu
  • Согласен 4

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

19 минут назад, Kirgudu сказал:

Неужели никто ничего не заметил?

@Norman Eisenherz сразу и заметил.

Короче, есть динамический объект. Он состоит из его основы, и четырех его длинных частей. Подскажите пожалуйста как мне сделать проверку на то, касаются ли те самые 4 статического объекта на карте. Предупрежу сразу: я в скриптах не разбираюсь вообще, и мой предел это заспавнить физический объект и удалить. Даже с физикой работать не умею, там зафиксировать, пинка ему дать

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

Всем привет. Хотелось бы обратиться с вопросом касаемо данного кода. Суть задумки: вместо стандартных ПНВ, сразу вызывающих PPE из posteffects.ltx, сделать включение этих PPE скриптом (+ вывод небольшого статика-худа ПНВ-очков). По сути, каприз чисто ради визуального удовольствия, так как при выключении такого скриптового PPE он выключается не мгновенно, а как бы с постепенным высветлением. + к тому еще и маска ПНВ появляптся одновременно с PPE, без задержки.

Однако случилась проблема. Если в случае с ПНВ, которое можно считать непосредственно из секции предмета, косяков нет нет, то с ПНВ, поставленными на шлем/броню в результате грейда, имеются траблы. Так, если поставить грейд на ПНВ 1-го поколения на Стальной шлем, то выводится худ-маска без постэффекта, при этом маска зависает и ее больше нельзя убрать, сколько не включай/выключай ПНВ. Со снятием шлема/брони также не пропадает. Стоит отметить, что функция "check_upgrade_sect" сама по себе работает корректно, не раз протестирована. Я подозреваю, накосячил прежде всего в проверке на поколение ПНВ, однако на всякий случай докидываю и реализацию вывода худ-маски и PPE. Помогите найти, в чем косяк заключается. 

Скрытый текст
function check_nv_class()

	local outfit    = db.actor:item_in_slot(7)
	local helmet    = db.actor:item_in_slot(12)
	
	if outfit ~= nil then
	    if system_ini():line_exist(outfit:section(), "nightvision_sect") then
		    if system_ini():r_string(outfit:section(), "nightvision_sect") == "effector_nightvision_1" then
			    local nv_class1 = system_ini():r_string(outfit:section(), "nightvision_sect")
			    return nv_class1
			end
			if system_ini():r_string(outfit:section(), "nightvision_sect") == "effector_nightvision_2" then
			    local nv_class2 = system_ini():r_string(outfit:section(), "nightvision_sect")
			    return nv_class2
			end
			if system_ini():r_string(outfit:section(), "nightvision_sect") == "effector_nightvision_3" then
			    local nv_class3 = system_ini():r_string(outfit:section(), "nightvision_sect")
			    return nv_class3
			end
		end
	    if check_upgrade_sect(outfit, "nightvision_sect") == "effector_nightvision_1" then
            local nv_class1 = check_upgrade_sect(outfit, "nightvision_sect")
            return nv_class1
		end
		if check_upgrade_sect(outfit, "nightvision_sect") == "effector_nightvision_2" then
            local nv_class2 = check_upgrade_sect(outfit, "nightvision_sect")
            return nv_class2
		end
		if check_upgrade_sect(outfit, "nightvision_sect") == "effector_nightvision_3" then
            local nv_class3 = check_upgrade_sect(outfit, "nightvision_sect")
            return nv_class3
		end
	end
	
	if helmet ~= nil then
	    if system_ini():line_exist(helmet:section(), "nightvision_sect") then
		    if system_ini():r_string(helmet:section(), "nightvision_sect") == "effector_nightvision_1" then
			    local nv_class1 = system_ini():r_string(helmet:section(), "nightvision_sect")
			    return nv_class1
			end
		    if system_ini():r_string(helmet:section(), "nightvision_sect") == "effector_nightvision_2" then
			    local nv_class2 = system_ini():r_string(helmet:section(), "nightvision_sect")
			    return nv_class2
			end
		    if system_ini():r_string(helmet:section(), "nightvision_sect") == "effector_nightvision_3" then
			    local nv_class3 = system_ini():r_string(helmet:section(), "nightvision_sect")
			    return nv_class3
			end
		end
	    if check_upgrade_sect(helmet, "nightvision_sect") == "effector_nightvision_1" then
            local nv_class1 = check_upgrade_sect(helmet, "nightvision_sect")
            return nv_class1
		end
		if check_upgrade_sect(helmet, "nightvision_sect") == "effector_nightvision_2" then
            local nv_class2 = check_upgrade_sect(helmet, "nightvision_sect")
            return nv_class2
		end
		if check_upgrade_sect(helmet, "nightvision_sect") == "effector_nightvision_3" then
            local nv_class3 = check_upgrade_sect(helmet, "nightvision_sect")
            return nv_class3
		end
	end
end

 

Скрытый текст
function nvg_rework()
local nightvision = db.actor:object("device_torch")
local nv_signal
--отвечает за отрисовку худа при юзании ночника и звук самого ПНВ
 
    if nightvision and nightvision:night_vision_enabled() == true and nv_signal == true then
	    nv_signal = false
		hud:AddCustomStatic("hud_nvg_2")
		if check_nv_class() == "effector_nightvision_1" then
            level.add_pp_effector("nightvision_1.ppe", 1, true)
		elseif check_nv_class() == "effector_nightvision_2" then
            level.add_pp_effector("nightvision_2.ppe", 1, true)
		elseif check_nv_class() == "effector_nightvision_3" then
            level.add_pp_effector("nightvision_3.ppe", 1, true)
		end
	elseif (not nightvision or nightvision:night_vision_enabled() == false) and nv_signal == false then
	    nv_signal = true
		hud:RemoveCustomStatic("hud_nvg_2")
		level.remove_pp_effector(1)
	end

 

 

1. "What a terrible day to have eyes…"

 

"Есть переменная, которая может быть равна 1, 2 или 3. Если переменная равна 1, присвоить ее значение новой переменной и выдать его, аналогично для 2 и 3, аналогично для варианта проверки той же переменной в списке апгрейдов." Голландский штурвал, нет?

 

После проверки "параметр существует" достаточно выполнить действие

return system_ini():r_string(item:section(), "nightvision_sect")

То же для проверки в апгрейдах.

 

Аналогично с номером эффекта: отсечь последний знак через check_nv_class():sub(-1) и подставить его в level.add_pp_effector("nightvision_номер.ppe", 1, true) вместо трех проверок "если 1, то 1".

Примечание: проверка класса ПНВ должна возвращать только строку, в противном случае x:sub(-1) надо указать в полном виде: string.sub(x, -1).

 

 

2. При двух вариантах условий достаточно описать первое и сказать else.

2.1. Если флаг указан внутри функции, как в коде выше, он будет каждый раз сбрасываться на false – статик вообще не будет выведен.

2.2. Во избежание путаницы с частями условия лучше переоформить код:

local static_on

function nvg_rework()
	if nightvision and nightvision:night_vision_enabled() then
		if not static_on then
			static_on = true
			-- вывести статик
		end
	else
		if static_on then
			static_on = false
			-- удалить статик
		end
	end
end

 

  • Спасибо 1

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Написал скрипт на проверку нахождения в спейс рестрикторе  НПС, чтобы ГГ зачистил указанную зону, кроме НПС с группировкой "stalker". Вылетает с таким логом. Как я понимаю, методы применяются ко всем объектам, а нужно, чтобы только к НПС. Искал проверку, что объект является НПС, но не нашел.

 

function storyline_complex_clear()
	local sim = alife()
	if sim then
		local zone = sim:story_object(904)
		for id = 1, 65534 do
			sobj = sim:object(id)
			return sobj and zone and zone:inside(sobj:position()) and not sobj:community() == "stalker" 
		end
	end
end
Скрытый текст

FATAL ERROR
 
[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: No such operator defined
 

stack trace:

 

2 часа назад, rost2000 сказал:

а нужно, чтобы только к НПС

Можно воспользоваться функциями из _g.script

return sobj and zone and (IsStalker(sobj) or IsMonster(sobj)) and zone:inside(sobj:position()) and not sobj:community() == "stalker"

а можно пойти с другой стороны и перебрать только те объекты, в свойствах которых есть функция community():

return sobj and zone and sobj.community and sobj:community() ~= "stalker" and zone:inside(sobj:position())

 

  • Полезно 1

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

Наличие определенных методов в обычных классах можно проверять через

if obj.fx and type( obj.fx ) == "function"

Существует ли аналогичная проверка для общих функций языка Lua?


В частности, в таблице db.storage[id].mob_trader Сидоровича есть несколько значений, которые дают вылет "no such operator defined" при проверке type(v). Значения можно исключить просто по заголовкам (actions, anim_head, anim_global), но хочется более универсального решения.

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

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

28 минут назад, Norman Eisenherz сказал:

anim_head, anim_global

Это же просто строки, если правильно помню. Как они могут давать вылет при определении типа?
Но вообще интересный вопрос, надо будет поэкспериментировать как-нибудь.

  • Нравится 1

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

Надеюсь меня не казнят за то, что я второй раз задаю вопрос. Как сделать проверку на то, есть ли соприкосновение какой либо отдельной части динамического объекта с любым статическим объектом на карте? Например м землёй, или стеной какого либо здания, и тд. 

Можно ли отследить, что ГГ обыскивает труп именно мутанта и в таком случае не отображать отношение мутанта к ГГ (баг с "другом")?

А можно как-то скриптом увеличивать ранг ГГ, добавлять очки, а то в моде куча предметов на локациях бесхозных уникальных. Можно попробовать сделать что-то типа бонусов. Идея какая-то такая витает. ОГСР движок.

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

 

db.actor:set_character_rank(db.actor:character_rank() + number)

  • Нравится 1
  • Полезно 3

Здесь могла быть ваша реклама.

Ребята а можно в хранилище данных на огср движке. Хранить таблицы, пополнять их и читать. Сделал я на калбеке on_item_take (obj) систему вознаграждения при поднятии уникальных предметов. Но есть проблемка если выкинуть предмет и снова подобрать то опять система сработает. Вот думаю может таблицу надо создавать уже поднятых предметов и проверять их наличие(что они уже были подобранны), чтоб повторно скрипт не срабатывал на уже поднятый предмет.

Если можно на огср дайте пример кода.

function item_take(obj)
	local sect = obj:section()
	local reputation
	local rang

	for i=1,#list_items do
		if sect == list_items[i].section then
		    reputation = list_items[i].reputation
			rang = list_items[i].rang
			db.actor:change_character_reputation(reputation)
			db.actor:set_character_rank(db.actor:character_rank() + rang)
			
			local news_text = "%c[255,160,160,160]".."Уникальный предмет".."\\n".."%c[default]".."Ранг+ "..rang.."  ".."Репутация+ "..reputation
			local hud = get_hud()
	        hud:AddCustomStatic("main_task", true)
	        hud:GetCustomStatic("main_task"):wnd():SetTextST(news_text)
	        hud:GetCustomStatic("main_task").m_endTime = time_global()/1000 + 5
			log1(list_items[i].section.."-"..rang.."-"..reputation)
			break
		end
	end
	
end

 

Изменено пользователем Stalkersof
34 минуты назад, Stalkersof сказал:

чтоб повторно скрипт не срабатывал на уже поднятый предмет.

Делай проще. Выдавай инфопоршень при наличии у ГГ предмета. На поршень повесь выдачу бонуса.

  • Спасибо 1
  • Нравится 1
  • Согласен 1
7 минут назад, Капрал Хикс сказал:

Делай проще. Выдавай инфопоршень при наличии у ГГ предмета. На поршень повесь выдачу бонуса.

Чем это проще на 50 предметов 50 пошней и скриптов

@Stalkersof , меньше возни со скриптами. Можно поршни тоже в таблицу забить.

  • Спасибо 1

Да там три строчки кода. Обозначить таблицу, записать данные, считать данные. Если предмета нет в таблице то выполнить скрипт. Просто я пока не докумекал как)))

 

Пс Докумекал, вопрос снят

Изменено пользователем Stalkersof
  • Нравится 3

[ТЧ 1.0006]

Пытаюсь расставить метки на группе NPC приведенным ниже скриптом, но создается только одна метка посреди лагеря. Если указывать определенные id, метка будет создана именно на NPC, но только на первом из списка. В чем может быть причина?

Spoiler
		local gobj = xr_gulag.get_gulag_by_name("esc_bridge")

		for id, v in pairs(gobj.npc_info) do
			level.map_add_object_spot(id, "green_location")
		end

 

 

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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

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

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

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

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

Войти

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

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

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