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

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

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

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

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

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

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

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

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

Войти

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

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

×
×
  • Создать...