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

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

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

Gun12, ну ты уж не придирайся :rolleyes: , Callisto уже сама поняла и назвала "ересью"... Да и причина вероятно не в Lua-ошибках (привнесенных позже), а в переполнении стека из-за того, что целую игровую минуту с частотою апдейта актора запускались проигрываться объекты одного и того же звука... ;)

Всем привет. Стоит задача вывести строку времени на ПДА. Имеется готовая функция от тов. Artos'а:

function show_time()

---------------------------------------------------------------------------------

local clock = true -- (true\false) - включение\выключение показа часов на HUDе

---------------------------------------------------------------------------------

local hud = get_hud()

if clock == true then

local cs = hud:GetCustomStatic("hud_show_time")

if cs == nil then

hud:AddCustomStatic("hud_show_time", true)

cs = hud:GetCustomStatic("hud_show_time")

end

 

local time_h = level.get_time_hours() - "2"

local time_m = level.get_time_minutes()

local msg

if time_m >= 10 then

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

else

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

end

 

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

end

end

 

 

 

 

Также в скрипте есть функция которая "ловит" момент открытия ПДА и вызывает функцию времени.

]function PdaOpen()

oHelpWnd = CHelpWindow()

oPda = level.main_input_receiver()

my_show_time.show_time()

....

 

 

 

В ui_custom_msgs.xml строка времени уже описана. В результате на самом худе время есть а вот в ПДА строка никак не хочет появляться.

"Перехватчик" открытия ПДА работает исправно, после него я добавлял текст с помощью CUIStatic() - текст на ПДА появляется без проблем. А вот строка времени - не хочет.

Прошу помощи.

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

Jein, не пробывал время выводить не через кастом статик, а через CUIStatic()? сам пытался сделать подобное(только в окне инвентаря на ЗП) то кастом статиком ничего не добился, в смысле добился, но мой текст был под окном инвентаря...

Jein, у тебя выходит как в известной поговорке "В огороде бузина, а в киеве - дядька".

Если ты, сформировав строку о времени, выводишь ее с помощью кастомстатика на экран - то с какого такого барабана ждать, что она появится в ПДА?

Если требуется чтобы именно в ПДА появилась строка времени - то и выводи ее именно туда, а не на игровой экран.

Т.е. посмотри как это делается в исходной игре иль модах при помощи: db.actor:give_talk_message(text, ...) и не заморачивайся с кастом-статиком.

P.S. Если же вопрос о выводе в некий доп.элемент на интерфейсе ПДА - то тут уже через CUIStatic(), как подсказал Viнt@rь, и приаттачивать...

 

Viнt@rь, если требуется выводить поверх другого окна, которое обновляется - то или тоже требуется обновлять свою надпись (после обновления подложки) или аттачить свой статик к основному окну...

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

Viнt@rь, Artos - кастомное время мне нужно выводить на месте стандартного. С помощью CUIStatic() вывести время у меня получилось без проблем. Поэтому исходя из ваших советов и моих экспериментов - получается что CUIStatic() самый подходящий вариант??

Но здесь встает другой вопрос - дело в том что строка времени выведенная через CUIStatic() статическая, то-есть время не "идет". Получается что нужно как-то обновлять CUIStatic() через апдейт или с помощью цикла. И вот вопрос - как это лутше сделать? К примеру бесконечный цикл в котором крутился бы CUIStatic() вешает игру.

Artos,

если требуется выводить поверх другого окна, которое обновляется - то или тоже требуется обновлять свою надпись (после обновления подложки) или аттачить свой статик к основному окну...

обновлял(на апдейте актора постоянно, но статик не вылазил на верх...) потому ИМХО самый лучший выход это

...тут уже через CUIStatic()...и приаттачивать...

Jein, я точно не уверен, но по идее должно помочь:

 

пример(ЗП)
class "CSpNotepad" (CUIScriptWnd)
...
function CSpNotepad:Update()
  CUIScriptWnd.Update(self)
  self.wClock:TextControl():SetText(GetTime())
end
...

 

Вот примерно таким методом можно обновлять свой эелемент/окошко

Изменено пользователем Viнt@rь

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

Тебе требуется создать свой CUIStatic() и приаттачить его в нужное место к окну ПДА. Ну а далее, создав объект своего "окошечка" - выводить в него нужную информацию, при необходимости обновляя ее (в твоем случае раз в игровую минуту). Это уже в общем-то отработанный алгоритм, примеры которого можно найти в модах, где свои "окошки" добавлены.

Вопрос в общем-то не очень прост, т.к. придется озаботиться и корректным деаттачем своего окошка при завершении/перезагрузке игры.

 

Viнt@rь, наверное нужно было догадаться, что апдейт акторских окошек (инвентаря и т.п.) происходит аналогично циклам апдейта в биндере актора, но после(!) него, т.е. апдейтить (пересоздавать) кастомстатик нужно после "оконных" апдейтов. Но это уже начинаем муссолить очевидное, тем более, как уже написал выше - есть нормальный (независимый) альтернативный вариант.

 

P.S. Использовать штатный метод апдейта для созданного объекта CUIStatic() для ПДА нецелесообразно, ИМХО.

И ПДА редко когда открывается и изменения времени - раз в минуту. Имея созданный объект можно просто в нужное время в нем менять/перезаписывать информацию...

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

Jein, ....

P.S. Использовать штатный метод апдейта для созданного объекта CUIStatic() для ПДА нецелесообразно, ИМХО.

И ПДА редко когда открывается и изменения времени - раз в минуту. Имея созданный объект можно просто в нужное время в нем менять/перезаписывать информацию...

То есть, ты предлагаешь не использовать метод апдейта, а обновлять объект таймером?

Jein, да он это и имеет ввиду) обновлять с апдейта актора раз в 1 мин игрового времени(тебе же секунды не надо выводить)

Jein, алгоритм может быть аналогичным как в модуле m_backpack.script (из SIMBION-мода), только относительно окна ПДА, а не инвентаря.

При первом открытии окна создается объект (в твоем случае для вывода времени).

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

Ну а по закрытию окна ПДА - таймер останавливается (деактивируется), экономя ресурсы.

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

 

Да и строку времени неплохо бы формировать не давно "устаревшей" функцией (неудачно примененной в исходном варианте), а немного иначе:

str = game.get_game_time():timeToString(1) --/ TimeToMinutes (23:59)

или даже более приближенно к строке времени в ПДА:

str = game.get_game_time():timeToString(1) .." " .. game.get_game_time():dateToString(0) --/ TimeToMinutes+DateToDay (23:59 01/01/2012)

 

P.S. Ну а если требуется "сместить" время относительно "штатного", то как раз можно game.get_game_time() заменить на тикающий свой CTime и от него и апдейтить и строки времени формировать.

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

Viнt@rь, Artos спасибо за разъяснения. Вот только боюсь что строку времени предложенную Artos'ом я не знаю как править, ведь мне нужно "сдвинуть" время на час или на два назад. В конструкции вида

 local time_h = level.get_time_hours() - "2"

все предельно ясно. Я просто отнимаю 2 часа, а в выше изложенном варианте я не знаю как это сделать.

И второй вопрос. Решил я функцию времени вынести в другой файл для удобства работы, вот она:

function show_time()
local oPda = level.main_input_receiver()

	   local time_h = level.get_time_hours() - "2"
	   local time_m = level.get_time_minutes()
	   local msg
		  if time_m >= 10 then
		  msg = string.format(" %02d:%02d\n", time_h, time_m)
		  else
		  msg = string.format(" %02d:%02d\n", time_h, time_m)
		  end
oShow_time = CUIStatic()
oShow_time:SetAutoDelete(true)
oPda:AttachChild(oShow_time)
oShow_time:SetStretchTexture(true)
oShow_time:SetWndRect(600, 692, 145, 27)
oShow_time:SetText(msg)
end

 

 

и начал получать вылет с логом

[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: ...:\s.t.a.l.k.e.r\gamedata\scripts\my_show_time.script:18: attempt to index local 'oPda' (a nil value)

 

из лога я понимаю что переменная oPda не имеет значения, но вот что с ней делать? Что нужно ей присвоить? Забыл сказать что сейчас функция show_time() прописана в function actor_binder:update(delta). А если выкинуть ее из апдейта - ошибка пропадает.

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

Jein, уже писал выше, что "простенько" не получится и от тебя потребуется поглубже вникать в скрипты.

Во-первых, твое упрощенное: local time_h = level.get_time_hours() - 2 начинает врать в первых минутах-часах суток, т.е. вместо 23:00 покажет -01:00 и т.п.

Во-вторых, почитав мануалы, статьи и примеры в модах, можно найчиться управляться с классом CTime, задавая и нужное время и формируя нужные строки. Если ждешь готового кода - то ... это не ко мне, а от кого-то иного. Кучку готовых функций можно увидеть в m_hlp.script уже упоминавшегося выше мода.

Ну и в третьих, тебе требуется научиться работе со скриптами, в частности создавать, запоминать объекты и в нужное время к ним обращаться.

Тот же объект окна ПДА ('oPda') - тебе не просто один раз нужно получать и аттачить к нему свое ('oShow_time'), но и деаттачить в конце. А для этого и окно ПДА нужно помнить и объект созданного окна ('oShow_time'), Так же потребуется и объект таймера помнить, чтобы от него время отсчитывать, а не каждый раз заново создавать..

Ты же пока идешь по тупиковому пути, плодя новые окна - так никаких ресурсов игры не хватит.

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

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

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

Ну так подскажешь проблему с вылетом?

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

так мб, если разница в не совпадении времени с погодой, стоит просто поправить погоду? это куда проще

Изменено пользователем Viнt@rь

Jein, извини мою тупость, но не пойму, как может картинка (некие искуственные цифирьки) в окне ПДА влиять на прохождение мода? :shok:

Время в игре и всё остальное подчиняется настоящему игровому времени и, если "сбитое время" тебе мешает иль помогает играть, то ... мне это не понять.

И если нервирует ранняя ночь иль день то, как сказано выше - нужно именно сместить циклы погоды, а не стрелки на своих часах переводить.

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

Вообще- то по жизни я очень дотошный. Поэтому видя на худе время 21:00, а в игре еще светло как днем то меня это начинает раздражать. Вот по этому весь этот сыр-бор из-за времени завелся. А потом по рысскав по теме моддинга, я наткнулся на твою же функцию времени (которую ты создал года два назад) и увидел как с помощью этой функции легко реализуется время на худе - ну и загорелся. А Ирбис кстати твою функцию и заюзал, в ЛВР через нее реализовал время на худ. Я то и решил что это можно будет сделать самому. Мне ведь и не в домек что разница между ХУДом и ПДА или ИНвентарем ой как велика. Хотя спасибо Ирбису, он в своем моде скриптами достаточно много переработал функций ПДА - чего и в помине нет в чистом СТалкере. Я вообще был удивлен что в чистом Сталкере нет даже скриптов ПДА


  •  

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

Jein, пора прекращать оффтопик...

Сочувствую твоей дотошности, но ... тут или твоя дотошность должна быть подкреплена твоими же действиями или ... не такой уж ты и дотошный :crazy:

Упомянутая старенькая функция выполняет именно то, что должна, т.е. отображать действительное время, и не предназначена для "смещения" (о том как врет при смещении - уже упоминал). Так что именно дотошность и должна заставить делать как нужно, а не как 'можется'.

И, если всего-то раздражает светлый вечер иль темное утро - то именно дотошность должна направить в сторону изменения временных циклов погоды, а не "замазывать" время, надевая себе шоры. Ведь, даже преодолев трудности со скриптами, ты то будешь видеть искаженное время, но боты в игре и все остальные события - все одно по действительному в игре времени будут работать. Меня бы гораздо больше раздражало бы, если я что-то видел/сделал в 7 часов вечера, а в том же ПДА была бы запись, что это было в 21:00 ...

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

Jein, только скриптами, только ХардКор

:grin2: :grin2: :grin2: :grin2: :crazy: :crazy:

 

ПДА - чего и в помине нет в чистом СТалкере. Я вообще был удивлен что в чистом Сталкере нет даже скриптов ПДАх

Потому что он вшит в двигло!

Изменено пользователем Viнt@rь

Ладно ребята, не буду больше офтопить, Спасибо вам за подсказки - придется как-нибудь самому вариться. А по-поводу шор, Artos, так это твое было предложение, сдвинуть время с помощью подмены. Вот этот пост http://www.amk-team....460#entry734985 Ну а я за твой совет и ухватился.

Еще раз спсибо за советы. Извините если что не так.

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

Ответ соответствовал вопросу и уже там же было сказано не просто так:

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

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

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

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

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

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

Войти

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

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

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