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

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

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

@I am Dead так у тебя ОГСР? Тогда другое дело. Там и итератор тебе сразу есть, и эти проверки - is_on_belt, is_on_ruck и куча всего другого.

@ARTLantist Тогда вопрос уже другой, как эту функцию переделать под огср.

 

Скрытый текст

-- переносим все вещи из ящика с указанным story_id
function transfer_from_box(box_sid)
    local box = level_object_by_sid(box_sid)
    if box then
        box:iterate_inventory_box(function(item) box:transfer_item(item, db.actor) end)
    end
end

 

С такой функцией у меня идет ругань на iterate_inventory_box так как в движке его нету, происходит вылет.

 

Изменено пользователем I am Dead

Рнебята пытаюсь прикрутить гуи окно с двумя кнопками к функции обыска монстров.

function generic_object_binder:use_callback(obj, who)
	if self.use_flag == nil and self.object:section()~="m_trader" then
		self.object:set_nonscript_usable(false)
		self.use_flag = true
	end
	--------------------------
	--------------------------
	--------------------------
	NewUI4.main()
	--self:mutanter_use(obj,who)
	   
end

Разделил функцию на две. Где self:mutanter_use(obj,who) это все действия по обыску трупов. NewUI4.main() это собственно окно с двумя кнопками. Если вызываю из окна при нажатии кнопки скрипт валиться из за отсутствия переменных. Если функцию без окна запускаю все работает. Вызываю собственно так.

function NewUI4:button1_button_clicked()
	 bind_monster.generic_object_binder:mutanter_use()
	 --bind_monster.generic_object_binder:mutanter_use(obj,who)
	 self:Hide()
end

 

@Stalkersof Попробуй так сделать:

 

Скрытый текст

function generic_object_binder:use_callback(obj, who)
	if self.use_flag == nil and self.object:section()~="m_trader" then
		self.object:set_nonscript_usable(false)
		self.use_flag = true
	end
	--------------------------
	--------------------------
	--------------------------
    level.start_stop_menu(NewUI4.main(), true)
	--self:mutanter_use(obj,who)
	   
end

 

44 минуты назад, I am Dead сказал(а):

@Stalkersof Попробуй так сделать:

 

  Показать



function generic_object_binder:use_callback(obj, who)
	if self.use_flag == nil and self.object:section()~="m_trader" then
		self.object:set_nonscript_usable(false)
		self.use_flag = true
	end
	--------------------------
	--------------------------
	--------------------------
    level.start_stop_menu(NewUI4.main(), true)
	--self:mutanter_use(obj,who)
	   
end

 

Не а не получается. NewUI4.main() это скрипт и функция в нем. Окно появляется и кнопки и все. 

function main()
	local hud = NewUI4(get_hud())
	level.start_stop_menu(hud, true) 
end

Попытаюсь еще раз объяснить проблему функция self:mutanter_use(obj,who) вызываемая непосредственно в скрипте. Прекрасно работает. Комментирую ее и пытаюсь вызвать при нажатии кнопки вылет. Либо не корректные параметры либо отсутствие параметров. Т.е вот это (obj,who)я не могу передать из другого скрипта.

@Stalkersof заведомо безнадёжная идея делать так, как сделано у тебя. При смерти мутанта в биндере он отлавливается и все действия относятся к нему, а когда ты хочешь заупустить из другой функции что-то из биндера монстров, ты уже теряешь этого монстра. Используй логические переменные и пересылай их в свой скрипт с ГУИ окном, там после нажатия кнопки делай true и в апдейте биндера монстров отлавливай момент, когда эта переменная true, выполняй нужные действия.

  • Нравится 1
2 минуты назад, ARTLantist сказал(а):

@Stalkersof заведомо безнадёжная идея делать так, как сделано у тебя. При смерти мутанта в биндере он отлавливается и все действия относятся к нему, а когда ты хочешь заупустить из другой функции что-то из биндера монстров, ты уже теряешь этого монстра. Используй логические переменные и пересылай их в свой скрипт с ГУИ окном, там после нажатия кнопки делай true и в апдейте биндера монстров отлавливай момент, когда эта переменная true, выполняй нужные действия.

Вроде с переменными тоже пробовал. Хорошо еще раз попробую.

@I am Dead ну, либо лезть в движок, либо костыльно как-то перебирать все предметы в ящике.

Как вариант, попробуй так:

Скрытый текст

local cnt = box:object_count()
	for i=0, cnt-1 do
		local item = box:object(i)
		--нужные действия
	end

 

Сразу говорю, что не ручаюсь за работоспособность у inventory_box, я эту функцию раньше использовал только для актора

@Stalkersof и вообще, зачем тебе обратно ссылаться на биндер монстров? Можно же в скрипте с ГУИ выдать все нужные предметы и не забивать себе голову.

Изменено пользователем ARTLantist
11 минут назад, ARTLantist сказал(а):

 

@Stalkersof и вообще, зачем тебе обратно ссылаться на биндер монстров? Можно же в скрипте с ГУИ выдать все нужные предметы и не забивать себе голову.

У меня там не только предметы(запчасти) чтение конфига монстра, удар ножом, хит монстру и анимация. Мне вот это и актор нужен там и монстр(obj,who) надо. 

1 минуту назад, Stalkersof сказал(а):

и актор нужен там и монстр(obj,who)

Перешли их в скрипт с ГУИ окном:

NewUI4.main(obj,who)

и там уже устанавливай в той функции

function main(obj,who)
	self.actor = who
	self.monstr = obj
	--и далее нужное

и всё.

  • Нравится 1

Попросил помощи с проверкой скрипта на предыдущей странице, но в виду "оживлённой" беседы моё сообщение, видимо, просто осталось без внимания... Попрошу ешо раз:

 

@ARTLantist я все переправил уже. Сделал плюс-минус как ты, только естесн, параметры назвал по-другому

Вот еще вопрос: может кто-то может подсказать мод на ЗП, в котором была перенесена из ТЧ скриптовая система фейк слотов с ножом, фонариком и т.д. Просто ввиду того, что еще новичок - скрипты-то совместить я умею, и даже что-то элементарное написать, но вот перенести с одной платформы на другую... Ибо я просто не знаю различий в функциях и т.д. Потому и спрашиваю, может что-то готовое есть

  • Нравится 1
9 часов назад, Biblia сказал(а):

Просто ввиду того, что еще новичок - скрипты-то совместить я умею, и даже что-то элементарное написать, но вот перенести с одной платформы на другую... Ибо я просто не знаю различий в функциях и т.д.

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

А вообще, я не вижу смысла всех этих костылей-фейк слотов, когда можно залезть в движок и за 5 минут прописать настоящие, нормально работающие слоты.

Изменено пользователем ARTLantist
  • Нравится 1
  • Согласен 2

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

 

function generic_object_binder:use_callback(obj, who)

  if self.use_flag == nil and self.object:section()~="m_trader" then

    self.object:set_nonscript_usable(false)

    self.use_flag = true

  end

  local wnd = NewUI4.main()

  level.start_stop_menu( wnd, true )

  wnd.owner = self -- сохраняем ссылку на биндер

  --self:mutanter_use(obj,who)

end

 

А потом в гуе вызывать нужную функцию так:

 

function NewUI4:button1_button_clicked()
	 self.owner:mutanter_use()
	 self:Hide()
end
Изменено пользователем naxac
  • Спасибо 1
  • Согласен 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub/Тема на AP-PRO

naxac.gif

@ARTLantist были бы у меня исходники движка СТКоПа версии 3.4 - я бы так и сделал. Но так как вынужден работать с тем, что имею - только фейк-слоты. 

@Biblia не поверишь, точно такая же проблема у меня была. Я просто скачал более старый пак, который не требует установки библиотек движка, и всё. Поверь, возможность править движок куда важнее, чем красивый оружейный пак.

  • Согласен 1

@ARTLantist на красивый ОП мне как-то по-барабану. Туеву кучу моделей сейчас можно найти и добавить в стулкер. Просто оптимизация 3д прицелов и их реализация лучшая, что я встречал. Товарищ Мортан там потрудился на славу. Да и я просто хочу накатить маленькую сборку для души. 

И заключительный вопрос: кол-во артов на поясе в ЗП зашито в двигле? 

Господа, доброго времени! Возникла необходимость перманентно держать на экране определенную информацию. Решил использовать шаблон из туториала: "нажмите "клавиша" чтобы присесть"

В конфиге имеем:

Скрытый текст

<item><!-- Для того чтобы пройти под невысоким препятствием - нажмите клавишу "ctrl" $$ACTION_CROUCH$$-->
			<length_sec>5</length_sec>
			<pause_state>off</pause_state>
			<guard_key/>
			<sound/>
			<cursor_pos/>
			<pda_section/>
			<grab_input>0</grab_input>
			<main_wnd>
				<auto_static start_time="0" length_sec="5000" x="712" y="475" width="400" height="150" alignment="c" stretch="1"
							light_anim="" la_cyclic="1" la_texture="1" la_alpha="1">
					<window_name>w1</window_name>
					<text font="graffiti22" r="225" g="225" b="250" a="255">crouch_tutorial</text>
				</auto_static>
			</main_wnd>
		</item>

 

<length_sec>5</length_sec> - время показа 5 секунд (если я правильно понял). А как сделать вывод информации бесконечным?

5 часов назад, Biblia сказал(а):

кол-во артов на поясе в ЗП зашито в двигле

да.

 

1 час назад, _Sk8_AsTeR_ сказал(а):

А как сделать вывод информации бесконечным?

function xxx()
	local hud = get_hud()
    if (hud) then
        hud:AddCustomStatic("static", true)
        hud:GetCustomStatic("static"):wnd():TextControl():SetTextST(game.translate_string("text"))
    end
end

static - название твоего статического элемента в ui_custom_msgs.xml

Скрытый текст

<static x="200" y="70" width="600" height="50" ttl="3">
	<text font="graffiti32"  r="240" g="217" b="182" a="255" align="c">text(нужный текст)</text>
</static>

 

потом удаляешь тогда, когда тебе захочется:

Скрытый текст


function yyy()
	local hud = get_hud()
	if (hud) then
		local custom_static = hud:GetCustomStatic("dosimeter_rad")
		if custom_static ~= nil	then
			hud:RemoveCustomStatic("dosimeter_rad")
		end
	end
end

 

 

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

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

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

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

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

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

Войти

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

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

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