-
Публикаций
55 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные Tolich
-
-
Есть ли рабочий вариант двустволки full bm16 (не обреза) из ТЧ для ЗП?
-
Как добавить новые предметы торговцам? Стандартный вариант дописать новые предметы в gamedata\configs\misc\trade\trade_jup_b202_stalker_barmen.ltx и trade_zat_b30_stalker_trader.ltx вроде не работает. На примере даже тех же батареек, дописал их в продажу, но они не появляются.
Дополнено 17 минуты спустяНасколько реально добавить в gamedata\configs\mfs_team\mfs_weather_params.ltx "Базовую дальность тумана для каждого уровня"? По аналогии "[lowland_fog_params] ;Базовые высоты тумана в низинах для каждого уровня".
Размер локаций на Кордоне, Свалке... (т.е. в ранних уровнях STALKER) меньше, чем на Затоне и т.п. (т.е. в уровнях Зова Припяти) и настройки дальности тумана для Затона, не подходят для Кордона - горизонт будет четко выделяться. -
10 часов назад, play375dimaj сказал:как сделать что бы сыч торговался биноклем и ножом в зп
Добавить в gamedata\configs\misc\trade\trade_zat_b30_stalker_trader.ltx
нож - wpn_knife и бинокль - wpn_binoc в соответствующие разделы. -
Как вариант, новый подвид зомби - слепые зомби. Вместо глаз, чёрные впадины. Появляются только ночью, обладают телепортацией. Как только они ощущают ваше присутствие вдалеке, они растворяются в воздухе и появляются рядом у вас за спиной. Голос зомби может быть изменен - внутренний, гортанный (в аудиоредакторе типа adobe audition делается не сложно).
Можно вместо физического воздействия, сделать типа пси воздействие или что то подобное, главное атака на расстоянии.
При появлении их в темноте, слышен характерный звук (наподобие Silent Hill), возможно это будет особый детектор или счётчик гейгера, главное звук характерный, отличающийся от других. Можно попробовать ещё добавить помигивание вашего фонарика, при их присутствии где то рядом. -
Если не ошибаюсь, то до сих пор в зоне не реализованы мутанты комары. В камышах на локациях тишь да гладь. А ведь комаров много именно в камышах или на болотах. Их сильная активность начинается перед заходом солнца и так на пол часа - час (проверено на азовском море и не раз).
Предполагаю такую реализацию: ГГ идет сквозь камыши, появляются характерные комариные звуки и экран начинает окрашиваться в красный цвет, падает шкала здоровья. ГГ нужно использовать что то вроде крема против комаров или быстро пробежать-покинуть камыши (что то вроде этого).
Чем не хоррор? ))-
1
-
-
2 часа назад, ian98 сказал:Никто не будет делать ничего кроме тебя самого, даже если вокруг твоей идеи появится какая-нибудь команда, то никто кроме тебя самого ее не соберет, скорее всего...
Так и есть, 100% чистая правда )) Я со своим модом ношусь уже несколько лет (не скажу сколько), кроме меня он и нахрен никому не нужен. Иногда прошу помощи, если "повезёт", то что то решается.. но в основном самому приходится искать-химичить-лепить ))
-
1
-
1
-
-
Попытался адаптировать SGM 2.2 + G.S.W.R. Загрузка доходит почти до конца "Клиент синхронизация" и чёрный экран. Ошибка в логе..
Спойлер* WARNING: player not logged in
! default LevelMap used for level[digger_stash]
! default LevelMap used for level[l04u_labx18]
* phase time: 7076 ms
* phase cmem: 577381 K
* phase time: 18 ms
* phase cmem: 577377 K
* [win32]: free[3023704 K], reserved[172496 K], committed[998040 K]
* [ D3D ]: textures[1749644 K]
* [x-ray]: crt heap[577377 K], process heap[577377 K], game lua[83931 K], render[345 K]
* [x-ray]: economy: strings[77324 K], smem[95595 K]
! Unknown command: dump_infos
! Missing ogg-comment, file: d:\stalker sigerous 2.2 - gswr\gamedata\sounds\radio_music\megafon_7.ogg
stack trace:0023:0C2659CB XrGame.dll, CDialogHolder::`vftable'()
0023:0BFBC5B8 XrGame.dll, CDialogHolder::CDialogHolder()
Особенно важны последние две строчки. Это самая минимальная ошибка, которую мне удалось добиться. Просто обидно (((
Уже вроде всё что можно перелопатил в плане скрещивания. То что в G.S.W.R. внедрена погодная составляющая Atmosfear - это супер! Причем урезанная: удалены секции для dark_ medium_ bright_ - они и нафиг не нужны.. короче оставлен один и назван gswr_
Но догадываюсь, что адаптация у меня упирается в gamedata\scripts\bind_stalker.script и в частности в фрагремнтСпойлерif not(primary_objects_filled) then
pda.fill_primary_objects()
primary_objects_filled = true
end
pda.fill_sleep_zones()
--M.F.S. Team
--SWE
--swe_debug.update() --Вкл\выкл swe_debug
endЕсли после pda.fill_sleep_zones() вставлять строки из любых других модов, то видимо происходит конфликт и чёрный экран.
Так же не получилось скрестить fallout_manager.script из SGM c G.S.W.R. там разная скриптовая составляющая (извиняюсь, если не правильно выражаюсь.. я в скриптах только копи-паст).
В общем печальный результат. (( Но пока сборку SGM-G.S.W.R. у себя не удаляю, надеюсь может кто то ещё осилит.
-
16 часов назад, Paradox27kms сказал:чтобы он вообще не разговаривал в плане фраз
Как вариант, открываем sounds\characters_voice\... и заменяем все не понравившиеся фразы пустым .ogg файлом.
-
В 04.12.2021 в 13:44, SsenpaiBaka сказал:вдалеке всё зеленое
gamedata\levels\имя уровня\level_lods.dds
-
Доброго дня! Редактор погоды - просто шикарная вещь!!. Эх.. такую бы фишку, да на лет эдак 4-5 назад. ))
Но я так понимаю, что секции погоды корректно редактируются, которые идут в процессе (в данный момент) и плюс на 3-5 часов вперед или назад. Самому выбрать (по желанию) любую секцию и редактировать в игре не получится?.
Ещё бы (желательно) добавить возможность при активации панелек (определённого цветового параметра), переводить ползунок не только мышью, но стрелками влево-вправо (типа нажал мышью на нужную панельку и стрелки паралельно с мышью активны). Особенно это актуально для тумана на низинах (там небольшая погрешность в цветовой гаме - и "фасон уже не тот").
Ну и также (немного неудобно) остановить-вернуть время именно в стандартное (игровое). Мышкой не получается (так и хочется стрелками влево-вправо добить нужные цифры).
Это так, вроде пожеланий. Удачи Вам в дальнейшем совершенствовании и улучшении, да и в жизни в общем! :))-
1
-
-
Siderous mod 2.2 +Atmosfear 3 (адаптация под SGM 2.2).
Вопрос такой: При выбросе..
1. Резко меняется небо. Происходит резкий переход на другой скайбокс, другой секции погоды, но не на скайбокс начала выброса (из Atmosfear 3).
2. Далее всё как обычно (как и в Atmosfear 3): звук сирены, предупреждение сталкеров...
3. Далее начинается выброс и идёт оранжево-красная волна (как и в Atmosfear 3).
При этом скайбоксы секции погоды не меняются. Солнце или луна стоят на небе (в Atmosfear 3 они всегда "убегают" перед началом выброса). В итоге до конца выброса, скайбоксы из папки gamedata\textures\sky\af3_blowout\.. так и не подгружаются.
В чём может быть причина и есть ли решение? Может кто нибудь сталкивался с подобным?
Записал коротенький фрагмент. Там видно, как солнце начинает перемещаться (согласно Atmosfear 3) и потом резко оставливается чуть правее. В итоге скайбоксы выброса не подгружаются.Спойлер -
Всем привет! У меня стоит Siderous mod 2.2 +Atmosfear 3 (адаптация под SGM 2.2). Вопрос такой: При выбросе..
1. Резко меняется небо. Происходит резкий скачёк на любой другой скайбокс другого состояния погоды, но не на скайбокс начала выброса из Atmosfear 3.
2. Далее всё как обычно (как и в Atmosfear 3): звук сирены, предупреждение сталкеров...
3. Далее начинается выброс и идёт оранжево-красная волна (как и в Atmosfear 3).
При этом скайбоксы обычной погоды не меняются. Солнце или луна стоят на небе (в Atmosfear 3 они всегда "убегают" перед началом выброса). В итоге до конца выброса, скайбоксы из папки gamedata\textures\sky\af3_blowout\.. так и не появляются.
В чём может быть причина и есть ли решение? Может кто нибудь сталкивался с подобным? -
11 часов назад, yavaso сказал:Можно без правки в ЗП сделать такой лого загрузки?
Тестура файла загрузки уровня, находится по адресу gamedata\textures\ui\textures\ui\ui_actor_loadgame_screen.dds Вот и смотри что там тебе нужно править.
11 часов назад, yavaso сказал:Как можно убрать 100 советов ?
"Советы" находятся по адресу gamedata\configs\text\rus\ui_st_loadscreen.xml Править можно блокнотом.
11 часов назад, yavaso сказал:Есть ли улита для редактирования погоды прям в игре?
Открываешь папку gamedata\configs\environment\weathers\.. например default_clear.ltx (ясная погода) и редактируешь настройки погоды на каждый час. Править можно блокнотом.
Настроки частоты ясной погоды, дождливой, тумана и т.д. по адресу gamedata\configs\environmentdynamic_weather_graphs.ltx-
1
-
-
В 01.11.2021 в 11:51, Tolich сказал:Есть у кого детекторы как бы в "пластиковых" корпусах? В игре они как бы в затертом алюминиевом корпусе. Может кто то пробовал рисовать в фотошопе или эта идея уже реализована где то в модах. Оттенок корпуса не важен, главное как бы "пластиковые" .bump текстуры.
В общем как бы для себя решил этот вопрос..
СпойлерПосмотрел на просторах инета моды на детекторы и остановился на моде анимационные детекторы из Diad Air от автора Ferr-um. Немного допилил под себя: поменял цветовую гамму детекторов (в более бледных тонах, ближе к окружению), цвета индикаторов и озвучку сканеров. Детекторы (кроме Отклика) в итоге в пластиковых корпусах.
А потом "Остапа понесло" )) Захотелось цветовые варианты для каждой модели оставить в игре, решил сделать по три варианта для "Самодельного детектора", для "Отклик" и "Медведь". Например три варианта детектора "Отклик" (название ДО от Детектор Отклик):
ДО-1 обнаруживает самые простые арты (как у "Отклика" и есть по умолчанию),
ДО-2 обнаруживает арты второго уровня (от детектора Медведь),
ДО-3 редкие арты (от детектора Велес).
Тогда бы сканирование отличалось не самой как бы моделью детектора (устаревший - не устаревший), а удобством самого сканирования. Например с детекторами Медведь ДМ-3, Отклик ДО-3 можно было бы искать редкие арты, бегая с пищалкой по локациям. А почему бы и нет?!. ))
Но у меня в итоге "что то пошло не так"..
ДМ-3 и ДО-3 никак не хотят определять редкие арты и пришлось для них оставить увеличенную дальность сканирования (чем то они должны же отличаться от ДМ-1 и ДО-1) и оригинальное звучание для сканера (т.е. теперь звуки при обнаружении одного и того же арта, для каждой модели детекторов разные).


Тестовый ролик можно посмотреть тут
Тестил в Sigerous 2.2. Может чего то там в gamedata\configs\misc\.. не досмотрел?!. Попробую ещё потестить в Зове Припяти и ещё раз попробую прикрутить детекторы одной модели (например ДО-1, ДО-2, ДО-3) к разным видам артов. -
Зов Припяти? Sigeroud mod 2.2
Как добавить в инвентарь шкалу выносливости (Чуть выше здоровья). Примерно так..
Править видимо надо gamedata\configs\ui\actor_menu_16.xml и видимо код должен быть подобный как для шкалы здоровья, только перекрашено в синий.Спойлер<health_state x="11" y="31" width="171" height="16">
<hint_text delay="800">st_ui_health_sensor</hint_text>
<state_progress x="0" y="0" width="171" height="16" horz="1" min="0" max="1" pos="0">
<progress stretch="1">
<texture r="194" g="8" b="8" a="200">ui_inGame2_inventory_health_bar</texture>
</progress>
</state_progress>
</health_state>
1. Не могли бы мне подсказать полный кусок кода и куда его ставить (в actor_menu_16.xml)?
2. Может ещё какие файлы в этом должны быть задействованы?
По идее это должно помочь играть с чистым экраном (без худа), не считая оружия. Когда заглядываешь в рюкзак, видишь полоску здоровья, не хватает ещё выносливости.
-
4 часа назад, Hozar_2002 сказал:По идее это все что можно сделать (На вскидку)
При загрузке новой игры получил вылетСпойлер[error]Expression : !m_error_code
[error]Function : raii_guard::~raii_guard
[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
[error]Line : 748
[error]Description : ...call of pripyat\gamedata\scripts\bind_stalker.script:66: attempt to index global 'gunsl_thirst' (a nil value)
То что я дописал в actor_menu.scriptСпойлерlocal last_mode = 0
local current_mode = 0
xr_meet_dialog_closed = false
xr_meet_trade_closed = false
xr_meet_upgrade_closed = false
dead_body_searching = false
function actor_menu_mode(mode)
current_mode = mode
if(mode==0) then
if(last_mode==1) then
inventory_wnd_closed()
elseif(last_mode==2) then
trade_wnd_closed()
elseif(last_mode==3) then
upgrade_wnd_closed()
elseif(last_mode==4) then
dead_body_search_wnd_closed()
end
last_mode = 0
elseif(mode==1) then
last_mode = 1
inventory_wnd_opened()
elseif(mode==2) then
last_mode = 2
trade_wnd_opened()
elseif(mode==3) then
last_mode = 3
upgrade_wnd_opened()
elseif(mode==4) then
last_mode = 4
dead_body_search_wnd_opened()
elseif(mode==10) then
dialog_wnd_showed()
elseif(mode==11) then
dialog_wnd_closed()
end
endfunction inventory_wnd_opened()
give_info("inventory_wnd_opened")
printf("---:>Inventory opened")
endfunction inventory_wnd_closed()
disable_info("inventory_wnd_opened")
printf("---:>Inventory closed")
endfunction trade_wnd_opened()
give_info("inventory_wnd_opened")
xr_meet_dialog_closed = false
printf("---:>Trade opened")
endfunction trade_wnd_closed()
disable_info("inventory_wnd_opened")
printf("---:>Trade closed")
xr_meet_trade_closed = true
endfunction upgrade_wnd_opened()
give_info("inventory_wnd_opened")
xr_meet_dialog_closed = false
printf("---:>Upgrade opened")
endfunction upgrade_wnd_closed()
disable_info("inventory_wnd_opened")
printf("---:>Upgrade closed")
xr_meet_upgrade_closed = true
endfunction dead_body_search_wnd_opened()
give_info("inventory_wnd_opened")
printf("---:>DeadBodySearch opened")
dead_body_searching = true
endfunction dead_body_search_wnd_closed()
disable_info("inventory_wnd_opened")
printf("---:>DeadBodySearch closed")
dead_body_searching = false
endfunction dialog_wnd_showed()
give_info("inventory_wnd_opened")
printf("---:>Talk Dialog show")
endfunction dialog_wnd_closed()
disable_info("inventory_wnd_opened")
printf("---:>Talk Dialog hide")
xr_meet_dialog_closed = true
endfunction is_render_ui()
if db.actor then
local active = db.actor:active_item()
if active and active:weapon_is_scope()
and db.actor:accuracy() * 1000 < 1 then
return false
end
end
return current_mode == 0
end
.. и в gunsl_thirst.scriptСпойлер--gunsl_thirst.script
--Description: реализация жажды и всего, что с ней связано
--Creator: Sin!
--Last Edit: 07 Mar 2020local PSTOR_THIRST_PARAM_NAME = "gunsl_thirst"
local idle_decrement = 0.00001 --уменьшение состояния в игровую секунду при идле; 0.00001 - хватит на 27.77 часов
local move_decrement = 0.00003 --при ходьбе, хватит примерно на 9 часов
local sprint_decrement = 0.0001 --при беге, 2.7 часаlocal max_delta_time = 5400 --время между двумя апдейтами не больше этого
local sleep_decrement = 0.3 --при сне более max_delta_time
local teleport_decrement = 0.15 --при телепорте/проводнике со сдвигом времениlocal bleeding_koef = 0.0001 --дополнительное уменьшение состояние при кровотечении равном 1
local health_decrement = 0.00043 --минимальная величина, на которую будет уменьшаться здоровье за секунду в случае сильной жажды
local power_decrement = 0.00350 --минимальная величина, на которую будет уменьшаться выносливость за секунду в случае сильной жаждыlocal ppe_rem_time = 10000 --время, через которое удалится постэффект
local ini = system_ini()
local aid = db.actor:id()local lasttime
local lastpos
local thirst_indicator
local thirst_ppe
local pp_start_time
local pp_startrem_timefunction OnItemUsed(sect)
--Тут проверяем, является ли использованный предмет утолителем жажды. Если является - то улучшаем состояние актора.
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] or 1
if ini:line_exist(sect, "thirst_factor") then
local factor = ini:r_float(sect, "thirst_factor")
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] + factor
if db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]>1 then db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]=1 end
if db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]<-0.15 then db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]=-0.15 end
end
endfunction UpdateState(delta1)
--вызывается из апдейта актора, тут анализируем его текущее состояние и в зависимости от него уменьшаем количество воды в организме.
--убеждаемся, что количество воды в организме и последние данные корректны
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] or 1
lasttime = lasttime or game.get_game_time()
lastpos = lastpos or db.actor:position()
local newtime = game.get_game_time()
local delta = newtime:diffSec(lasttime)
local hit_allowed = true
if delta>max_delta_time then
--ограничиваем время - чтобы не убивало при сне/переходах
delta = max_delta_time
hit_allowed = false
end
local newpos = db.actor:position()
local speed = newpos:distance_to(lastpos)/delta1
speed = math.ceil(speed*10000)
--уменьшаем количество воды, учитывая прошедшее время и состояние перемещения актора
if speed<6 then
--сейчас мы в идле
if hit_allowed then
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - idle_decrement*delta
else
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - sleep_decrement
end
elseif speed<50 then
--мы идём
if hit_allowed then
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - move_decrement*delta
else
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - sleep_decrement
end
else
--мы бежим
if hit_allowed then
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - sprint_decrement*delta
else
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - teleport_decrement
end
end
if db.actor.bleeding>0.005 then
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - bleeding_koef*db.actor.bleeding*delta
end
--проверим, не достигнуто ли критическое состояние
if db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] < -0.15 then db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = -0.15 end
--Теперь будем назначать всякие нехорошие эффекты, если у нас критически малое содержание жидкости в организме
if (db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] < 0.2) and hit_allowed then
--назначаем постпроцесс жажды/меняем его интенсивность в зависимости от её степени
if thirst_ppe == nil then
thirst_ppe = 13
--level.add_pp_effector("contrast.ppe", thirst_ppe, true)
level.add_pp_effector("black.ppe", thirst_ppe, true)
level.set_pp_effector_factor(thirst_ppe, 0.001)
pp_start_time = device():time_global()
else
local pp_factor = (1-((db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]+0.15)/0.35)^3)/2.5
local pp_dt = device():time_global() - pp_start_time
local phase = (math.sin(pp_dt / 1000)-0.66) * 5;
if phase < 0 then
phase = 0
end;pp_factor = pp_factor * phase
level.set_pp_effector_factor(thirst_ppe, pp_factor, 0.8)
end
if db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] < 0 then
--Уменьшаем здоровье актора
local hlth_factor = (db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]-1) * health_decrement*delta
if db.actor.health+hlth_factor<0.005 then
if db.actor.health>0.004 then
db.actor.health = 0.004-db.actor.health
end
else
db.actor.health = hlth_factor
end
db.actor.power = (db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]-1) * power_decrement*delta
end
else
--Состояние улучшилоcь, удаляем постпроцесс
if thirst_ppe~=nil then
if pp_startrem_time==nil then
pp_startrem_time = device():time_global()
level.set_pp_effector_factor(thirst_ppe, 0, 0.4)
end
if device():time_global()-ppe_rem_time>pp_startrem_time then
level.remove_pp_effector(thirst_ppe)
thirst_ppe = nil
pp_startrem_time = nil
end
end
end--messenger.gwr_messenger(tostring(db.actor.bleeding), 100)
--messenger.gwr_messenger(tostring(db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]), 100)
lasttime = newtime
lastpos = newpos
endfunction on_netspawn()
thirst_indicator = gunsl_thirst_indicator()
level.add_dialog_to_render(thirst_indicator)
endfunction on_netdestroy()
level.remove_dialog_to_render(thirst_indicator)
thirst_indicator = nil
end--Индикатор жажды
class "gunsl_thirst_indicator" (CUIScriptWnd)
function gunsl_thirst_indicator:__init() super()
local xml = CScriptXmlInit()
xml:ParseFile("ui_gunsl_thirst_indicator.xml")
self.main_static = xml:InitStatic("main_static", self)
endfunction gunsl_thirst_indicator:Update()
--Проверяем, надо ли вообще показывать что-то
local curstate = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]
if curstate==nil then
return
end
local hd = get_console():get_bool("hud_draw")
local curfov = device().fov
--log1(curfov) level.is_ui_shown() and need_hide_indicators
--if (db.actor~=nil) and db.actor:alive() and level.is_ui_shown() and hd and level.get_game_difficulty()<game_difficulty.master and curfov>50 and xr_effects.ui_active_slot~=0 and travel_manager.init_time==nil and curstate < 0.7 then
if (db.actor~=nil) and db.actor:alive() and hd and (level.get_game_difficulty()<game_difficulty.master or level.inventory_shown()) actor_menu.is_render_ui() and curstate < 0.7 then
--Надо показывать
self.main_static:Show(true)
--***********************************************************************************
--т.к. непонятно, как отловить скриптовое сокрытие движковых индикаторов худа,
--то просто покажем их принудительно
--level.show_indicators()
--***********************************************************************************
--Назначим текстуру в зависимости от текущего состояния
if curstate > 0.5 then
self.main_static:InitTexture("ui_gunsl_thirst_indicator_green")
elseif curstate > 0.3 then
self.main_static:InitTexture("ui_gunsl_thirst_indicator_yellow")
elseif curstate > 0.1 then
self.main_static:InitTexture("ui_gunsl_thirst_indicator_orange")
else
self.main_static:InitTexture("ui_gunsl_thirst_indicator_red")
end
else
self.main_static:Show(false)
end
end
Мой bind_stalker.script (еще раз, на всякий случай)Спойлерfunction init(obj)
xr_motivator.AddToMotivator(obj)
end
function actor_init(npc)
npc:bind_object(actor_binder(npc))
end
game_difficulty_by_num = {
[0] = "gd_novice",
[1] = "gd_stalker",
[2] = "gd_veteran",
[3] = "gd_master"
}
local weapon_hide = {}
local primary_objects_filled = false
------------------------------------>
class "actor_binder" (object_binder)
------------------------------------>
function actor_binder:__init (obj) super(obj)
self.bCheckStart = false
self.weather_manager = level_weathers.get_weather_manager()
self.surge_manager = surge_manager.get_surge_manager()
self.last_level_name = nil
self.deimos_intensity = nil
self.loaded_active_slot = 3
self.loaded_slot_applied = false
self.last_detective_achievement_spawn_time = nil
self.last_mutant_hunter_achievement_spawn_time = nil
-- AtmosFear
self.atmosfear=atmosfear.get_atmosfear()
self.fallout_manager = fallout_manager.get_fallout_manager()end
------------------------------------>
function actor_binder:net_spawn(data)
level.show_indicators()
self.bCheckStart = true
self.weapon_hide = false
self.weapon_hide_in_dialog = false
weapon_hide = {}
if object_binder.net_spawn(self,data) == false then
return false
end
db.add_actor(self.object)
db.actor.deimos_intensity = self.deimos_intensity
self.deimos_intensity = nil
if self.st.disable_input_time == nil then
level.enable_input()
end
xr_s.on_game_load()
--VSm
VScallback.OnGameLoad()
--VSm
self.weather_manager:reset()
death_manager.init_drop_settings()
self.task_manager = task_manager.get_task_manager()
self.spawn_frame = device().frame
self.already_jumped = false
self.loaded = false
benchmark.main() --' Distemper 06.2008 --
ts_mod_cop.ts_on_net_spawn() --TS_MOD--
--/ SGM in
sgm_callbacks.on_game_load()
--/ SGM out
--Gunslinger mod
gunsl_thirst.on_netspawn()
return true
end
------------------------------------>
function actor_binder:net_destroy()
--Gunslinger mod
gunsl_thirst.on_netdestroy()
xr_sound.stop_sounds_by_id(self.object:id())
local board_factions = sim_board.get_sim_board().players
if(board_factions) then
for k,v in pairs (board_factions) do
xr_sound.stop_sounds_by_id(v.id)
end
end
if(actor_stats.remove_from_ranking~=nil)then
actor_stats.remove_from_ranking(self.object:id())
end
level.show_weapon(true)
db.del_actor(self.object)
self.object:set_callback(callback.inventory_info, nil)
self.object:set_callback(callback.article_info, nil)
self.object:set_callback(callback.on_item_take, nil)
self.object:set_callback(callback.on_item_drop, nil)
self.object:set_callback(callback.task_state, nil)
self.object:set_callback(callback.level_border_enter, nil)
self.object:set_callback(callback.level_border_exit, nil)
self.object:set_callback(callback.take_item_from_box, nil)
self.object:set_callback(callback.use_object, nil)
log("--------->"..tostring(_G.amb_vol))
log("--------->"..tostring(_G.mus_vol))
if(_G.amb_vol~=0) then
get_console():execute("snd_volume_eff "..tostring(_G.amb_vol))
_G.amb_vol = 0
end
if(_G.mus_vol~=0) then
get_console():execute("snd_volume_music "..tostring(_G.mus_vol))
_G.mus_vol = 0
end
if sr_psy_antenna.psy_antenna then
sr_psy_antenna.psy_antenna:destroy()
sr_psy_antenna.psy_antenna = false
end
xrs_dyn_music.finish_theme()
xr_s.on_actor_destroy()
object_binder.net_destroy(self)
end
------------------------------------>
function actor_binder:reinit()
object_binder.reinit(self)
local npc_id = self.object:id()
db.storage[npc_id] = { }
self.st = db.storage[npc_id]
self.st.pstor = nil
self.object:set_callback(callback.inventory_info, self.info_callback, self)
self.object:set_callback(callback.on_item_take, self.on_item_take, self)
self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
self.object:set_callback(callback.task_state, self.task_callback, self)
self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)
self.object:set_callback(callback.use_object, self.use_inventory_item, self)
end
------------------------------------>
function actor_binder:take_item_from_box(box, item)
--/ SGM in
local box_name = box:name()
ts_mod_cop.ts_on_item_take(item) --TS_MOD--
sgm_callbacks.on_take_item_from_box(box,item)
--/ SGM out
end
------------------------------------>
function actor_binder:info_callback(npc, info_id)
printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id)
--/ SGM in
sgm_callbacks.on_enterring_info(npc,info_id)
--/ SGM out
end
------------------------------------>
function actor_binder:on_trade(item,sell_bye,money)
--/ SGM in
if sell_bye == true then
sgm_callbacks.on_trade(item,money,1)
game_stats.money_trade_update(money)
else
sgm_callbacks.on_trade(item,money,2)
game_stats.money_trade_update(-money)
end
--/ SGM out
end
------------------------------------>
function actor_binder:article_callback(npc, group, name)
end
------------------------------------>
function actor_binder:on_item_take (obj)
printf("on_item_take [%s]", obj:name())
if isArtefact(obj) then
local anomal_zone = bind_anomaly_zone.parent_zones_by_artefact_id[obj:id()]
if anomal_zone ~= nil then
anomal_zone:on_artefact_take(obj)
else
bind_anomaly_zone.artefact_ways_by_id[obj:id()] = nil
end
local artefact = obj:get_artefact()
artefact:FollowByPath("NULL",0,vector():set(500,500,500))
xr_statistic.inc_founded_artefacts_counter(obj:id())
end
treasure_manager.get_treasure_manager():on_item_take(obj:id())
ts_mod_cop.ts_on_item_take(obj) --TS_MOD--
--/ SGM in
sgm_callbacks.on_item_take(obj)
--/ SGM out
end
------------------------------------>
function actor_binder:on_item_drop (obj)
ts_mod_cop.ts_on_item_drop(obj) --TS_MOD--
--/ SGM in
sgm_callbacks.on_item_drop(obj)
--/ SGM out
end
------------------------------------>
function actor_binder:use_inventory_item(obj)
if(obj) then
local item_name=obj:section()
local s_obj = alife():object(obj:id())
if (s_obj) and (s_obj:section_name()=="drug_anabiotic") then
xr_effects.disable_ui_only(db.actor, nil)
level.add_cam_effector("camera_effects\\surge_02.anm", 10, false, "bind_stalker.anabiotic_callback")
level.add_pp_effector("surge_fade.ppe", 11, false)
give_info("anabiotic_in_process")
_G.mus_vol = get_console():get_float("snd_volume_music")
_G.amb_vol = get_console():get_float("snd_volume_eff")
get_console():execute("snd_volume_music 0")
get_console():execute("snd_volume_eff 0")
end
-- AtmosFear Booster Check
if (s_obj) and (s_obj:section_name() == "drug_psy_blockade" or s_obj:section_name() == "drug_radioprotector" or s_obj:section_name() == "drug_antidot") then
local boost_time = system_ini():r_float(s_obj:section_name(),"boost_time")
xr_logic.pstor_store(db.actor,s_obj:section_name().."_expiration",atmosfear.CTimeAddSec(game.get_game_time(),boost_time*level.get_time_factor()))
end
-- End AtmosFear Booster Check
--******************************GWR****************************************
local sect = obj:section()
gunsl_thirst.OnItemUsed(sect)
--*****************************/GWR****************************************
--/ SGM in
sgm_callbacks.on_use_item(obj)
if find_in_string(item_name,"dv_") and find_in_string(item_name,"_case") then
sgm_callbacks.on_use_deserve(obj)
end
if find_in_string(item_name,"skill_book") then
sgm_callbacks.on_use_skill_book(obj)
end
if find_in_string(item_name,"sleeping_bag") then
sgm_callbacks.on_use_sleeping_bag(obj)
end
--/ SGM out
end
end
------------------------------------>
function anabiotic_callback()
--/ SGM in
sgm_flags.is_ui_disabled=true
--/ SGM out
level.add_cam_effector("camera_effects\\surge_01.anm", 10, false, "bind_stalker.anabiotic_callback2")
local rnd = math.random(35,45)
local m = surge_manager.get_surge_manager()
if(m.started) then
local tf = level.get_time_factor()
local diff_sec = math.ceil(game.get_game_time():diffSec(m.inited_time)/tf)
if(rnd>(m.surge_time-diff_sec)*tf/60) then
m.time_forwarded = true
m.ui_disabled = true
m:kill_all_unhided()
m:end_surge()
end
end
--/ SGM in
sgm_callbacks.on_forward_game_time(0,rnd)
--/ SGM out
level.change_game_time(0,0,rnd)
level_weathers.get_weather_manager():forced_weather_change()
end
------------------------------------>
function anabiotic_callback2()
--/ SGM in
sgm_flags.is_ui_disabled=false
--/ SGM out
xr_effects.enable_ui(db.actor, nil)
get_console():execute("snd_volume_music "..tostring(_G.mus_vol))
get_console():execute("snd_volume_eff "..tostring(_G.amb_vol))
_G.amb_vol = 0
_G.mus_vol = 0
disable_info("anabiotic_in_process")
end
------------------------------------>
function actor_binder:task_callback(_task, _state)
if _state ~= task.fail then
if _state == task.completed then
news_manager.send_task(db.actor, "complete", _task)
else
news_manager.send_task(db.actor, "new", _task)
end
end
task_manager.task_callback(_task, _state)
end
------------------------------------>
function actor_binder:update(delta)
object_binder.update(self, delta)
if string.find(command_line(), "-designer") then
return
end
if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then
jump_level.try_to_jump()
self.already_jumped = true
return
end
-- Вызов апдейта переноса игрока проводником
if travel_func ~= nil then
travel_func()
end
-- DEBUG slowdown
--slowdown.update()
local time = time_global()
game_stats.update (delta, self.object)
-- апдейт погоды
self.weather_manager:update()
self:check_detective_achievement()
self:check_mutant_hunter_achievement()
-----------------------makdm
self:check_weapon_help_achievement()
----------------------------
--' Апдейт саундменеджера
xr_sound.update(self.object:id())
-- Обновление отключения ввода с клавиатуры.
if self.st.disable_input_time ~= nil and
game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle
then
level.enable_input()
self.st.disable_input_time = nil
end
-- Апдейт прятание оружия игрока во время диалога
if self.object:is_talking() then
if self.weapon_hide_in_dialog == false then
self.object:hide_weapon()
printf("hiding weapon!!!")
self.weapon_hide_in_dialog = true
end
else
if self.weapon_hide_in_dialog == true then
printf("restoring weapon!!!")
self.object:restore_weapon()
self.weapon_hide_in_dialog = false
end
end
-- Апдейт прятание оружия игрока в зоне sr_no_weapon
if check_for_weapon_hide_by_zones() == true then
if self.weapon_hide == false then
printf("hiding weapon!!!")
self.object:hide_weapon()
self.weapon_hide = true
end
else
if self.weapon_hide == true then
printf("restoring weapon!!!")
self.object:restore_weapon()
self.weapon_hide = false
end
end
if sr_psy_antenna.psy_antenna then
sr_psy_antenna.psy_antenna:update(delta)
end
if self.bCheckStart then
printf("SET DEFAULT INFOS")
if dont_has_alife_info("global_dialogs") then
self.object:give_info_portion("global_dialogs")
end
if dont_has_alife_info("level_changer_icons") then
self.object:give_info_portion("level_changer_icons")
end
self.bCheckStart = false
end
if not self.loaded_slot_applied then
self.object:activate_slot(self.loaded_active_slot)
self.loaded_slot_applied = true
end
xr_s.on_actor_update(delta)
--VSm
VScallback.OnActorUpdate(self,delta)
--VSm
if(self.surge_manager) then
if(self.f_surge_manager_loaded ~= true) then
self.surge_manager:initialize()
self.f_surge_manager_loaded = true
end
if(self.surge_manager.levels_respawn[level.name()]) then
self.surge_manager:respawn_artefacts_and_replace_anomaly_zone()
end
self.surge_manager:update()
end
-- AtmosFear
if(self.fallout_manager) then
self.fallout_manager:update()
end
if(self.atmosfear) then
self.atmosfear:update()
end
if not db.actor:has_info("atmosfear_default_console_settings_loaded") then
self.atmosfear:loadDefaultConsoleSettings()
db.actor:give_info_portion("atmosfear_default_console_settings_loaded")
end
-- End AtmosFear
simulation_objects.get_sim_obj_registry():update_avaliability(alife():actor())
if not self.loaded then
get_console():execute("dump_infos")
self.loaded = true
end
treasure_manager.get_treasure_manager():update()
if not(primary_objects_filled) then
pda.fill_primary_objects()
primary_objects_filled = true
end
pda.fill_sleep_zones()gunsl_thirst.UpdateState(delta)
--/ SGM in
if mod_update() then
sgm_loader.sigerous_mod_main()
end
--/ SGM out
end
------------------------------------>
function actor_binder:save(packet)
--/ SGM in
if get_game_unique_id() then
data_param_save_all()
end
--/ SGM out
set_save_marker(packet, "save", false, "actor_binder")
object_binder.save(self, packet)
packet:w_u8(level.get_game_difficulty())
if self.st.disable_input_time == nil then
packet:w_bool(false)
else
packet:w_bool(true)
utils.w_CTime(packet, self.st.disable_input_time)
end
xr_logic.pstor_save_all(self.object, packet)
self.weather_manager:save(packet)
release_body_manager.get_release_body_manager():save(packet)
-- AtmosFear
self.atmosfear:save(packet)
self.fallout_manager:save(packet)
-- End AtmosFear
self.surge_manager:save(packet)
--/ SGM in
sgm_loader.save(packet)
--/ SGM out
sr_psy_antenna.save( packet )
packet:w_bool(sim_board.get_sim_board().simulation_started)
xr_sound.actor_save(packet)
packet:w_stringZ(tostring(self.last_level_name))
xr_statistic.save(packet)
treasure_manager.get_treasure_manager():save(packet)
local n = 0
for k,v in pairs(db.script_ids) do
n = n + 1
end
packet:w_u8(n)
for k,v in pairs (db.script_ids) do
packet:w_u16(k)
packet:w_stringZ(v)
end
task_manager.get_task_manager():save(packet)
packet:w_u8(self.object:active_slot())
local deimos_exist = false
for k,v in pairs(db.zone_by_name) do
if(db.storage[v:id()] and db.storage[v:id()].active_scheme=="sr_deimos") then
deimos_exist = true
packet:w_bool(true)
packet:w_float(db.storage[v:id()].sr_deimos.intensity)
end
end
if not deimos_exist then
packet:w_bool(false)
end
if self.last_detective_achievement_spawn_time == nil then
packet:w_bool(false)
else
packet:w_bool(true)
utils.w_CTime(packet, self.last_detective_achievement_spawn_time)
end
if self.last_mutant_hunter_achievement_spawn_time == nil then
packet:w_bool(false)
else
packet:w_bool(true)
utils.w_CTime(packet, self.last_mutant_hunter_achievement_spawn_time)
end
-------------------------------makdm
if self.last_weapon_help_achievement_spawn_time == nil then
packet:w_bool(false)
else
packet:w_bool(true)
utils.w_CTime(packet, self.last_weapon_help_achievement_spawn_time)
end
-------------------------------------
set_save_marker(packet, "save", true, "actor_binder")
end
------------------------------------>
function actor_binder:load(reader)
set_save_marker(reader, "load", false, "actor_binder")
object_binder.load(self, reader)
local game_difficulty = reader:r_u8()
if game_difficulty~=nil and game_difficulty>=0 and game_difficulty<=3 then
get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])
else
mod_abort("SGM: cохранение накрылось кармой. Попробуйте загрузится c раннего сохранения.")
get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])
end
local stored_input_time = reader:r_u8()
if stored_input_time == true then
self.st.disable_input_time = utils.r_CTime(reader)
end
xr_logic.pstor_load_all(self.object, reader)
self.weather_manager:load(reader)
release_body_manager.get_release_body_manager():load(reader)
-- AtmosFear
self.atmosfear:load(reader)
self.fallout_manager:load(reader)
-- End AtmosFear
self.surge_manager:load(reader)
--/ SGM in
sgm_loader.load(reader)
--/ SGM out
self.f_surge_manager_loaded = true
sr_psy_antenna.load(reader)
sim_board.get_sim_board().simulation_started = reader:r_bool()
xr_sound.actor_load(reader)
local n = reader:r_stringZ()
if(n~="nil") then
self.last_level_name = n
end
xr_statistic.load(reader)
treasure_manager.get_treasure_manager():load(reader)
n = reader:r_u8()
for i = 1,n do
db.script_ids[reader:r_u16()] = reader:r_stringZ()
end
task_manager.get_task_manager():load(reader)
self.loaded_active_slot = reader:r_u8()
self.loaded_slot_applied = false
local b = reader:r_bool()
if(b) then
self.deimos_intensity = reader:r_float()
end
local stored_achievement_time = reader:r_bool()
if stored_achievement_time == true then
self.last_detective_achievement_spawn_time = utils.r_CTime(reader)
end
stored_achievement_time = reader:r_bool()
if stored_achievement_time == true then
self.last_mutant_hunter_achievement_spawn_time = utils.r_CTime(reader)
end
----------------------------makdm
stored_achievement_time = reader:r_bool()
if stored_achievement_time == true then
self.last_weapon_help_achievement_spawn_time = utils.r_CTime(reader)
end
---------------------------------
set_save_marker(reader, "load", true, "actor_binder")
end
local detective_achievement_items = {"medkit","antirad","bandage"}
local mutant_hunter_achievement_items = {"ammo_5.45x39_ap","ammo_5.56x45_ap","ammo_9x39_ap","ammo_5.56x45_ap","ammo_12x76_zhekan"}
----------------------------------------------------makdm
local weapon_help_achievement_items = {"af_fire","af_gravi","af_gold_fish","af_baloon","af_glass"}
---------------------------------------------------------
local function spawn_achivement_items(items_table, count, inv_box_story_id)
local inv_box = alife():object(get_story_object_id(inv_box_story_id))
for i = 1,count do
alife():create(items_table[math.random(#items_table)],inv_box.position,inv_box.m_level_vertex_id,inv_box.m_game_vertex_id,inv_box.id)
end
end
function actor_binder:check_detective_achievement()
if dont_has_alife_info("detective_achievement_gained") then
return
end
if self.last_detective_achievement_spawn_time == nil then
self.last_detective_achievement_spawn_time = game.get_game_time()
end
if game.get_game_time():diffSec(self.last_detective_achievement_spawn_time) > 43200 then
spawn_achivement_items(detective_achievement_items, 4, "zat_a2_actor_treasure")
xr_effects.send_tip(db.actor, nil, {"st_detective_news","got_medicine"})
self.last_detective_achievement_spawn_time = game.get_game_time()
end
end
function actor_binder:check_mutant_hunter_achievement()
if dont_has_alife_info("mutant_hunter_achievement_gained") then
return
end
if self.last_mutant_hunter_achievement_spawn_time == nil then
self.last_mutant_hunter_achievement_spawn_time = game.get_game_time()
end
if game.get_game_time():diffSec(self.last_mutant_hunter_achievement_spawn_time) > 43200 then
spawn_achivement_items(mutant_hunter_achievement_items, 5, "jup_b202_actor_treasure")
xr_effects.send_tip(db.actor, nil, {"st_mutant_hunter_news","got_ammo"})
self.last_mutant_hunter_achievement_spawn_time = game.get_game_time()
endend
-------------------------------------------makdm
function actor_binder:check_weapon_help_achievement()
if dont_has_alife_info("pri_a17_actor_has_gauss_rifle") then
return
end
if self.last_weapon_help_achievement_spawn_time == nil then
self.last_weapon_help_achievement_spawn_time = game.get_game_time()
end
if game.get_game_time():diffSec(self.last_weapon_help_achievement_spawn_time) > 43200 then
spawn_achivement_items(weapon_help_achievement_items, 2, "pri_a16_actor_treasure")
xr_effects.send_tip(db.actor, nil, {"st_weapon_help_news","got_artefact"})
self.last_weapon_help_achievement_spawn_time = game.get_game_time()
endend
--------------------------------------------------
------------------------------------>
function check_for_weapon_hide_by_zones()
for k,v in pairs(weapon_hide) do
if v == true then
return true
end
end
return false
end
-- Weapon functions
function hide_weapon(zone_id)
--/printf("[WEAPON_CONTROL]:hiding weapon from zone [%s] in section [%s]!!!", zone_id, db.storage[zone_id].active_section)
weapon_hide[zone_id] = true
endfunction restore_weapon(zone_id)
--/printf("[WEAPON_CONTROL]:restoring weapon from zone [%s] in section [%s]!!!", zone_id, db.storage[zone_id].active_section)
weapon_hide[zone_id] = false
end
-
Зов Припяти, Sigerous mod 2.2, как сделать чтобы иконка "жажды" отображалась только в hud (как и остальные иконки)?
Попробовал вставить "жажду" в мод. Мне помог товарищь на соседнем форуме выдернуть её из Sigerous-Gunslinger mod (я в скриптах ноль, только копи-паст). Ниже метод переноса..Спойлер1. Добавляем в мод файлы с описанием статика:
configs\ui\ui_gunsl_thirst_indicator.xml
configs\ui\ui_gunsl_thirst_indicator_16.xml2. Добавляем описание текстур для статика:
configs\ui\textures_descr\gunsl_thirst_indicator.xml3. Добавляем файл скрипта, обрабатывающий жажду:
scripts\gunsl_thirst.scriptСтрока 184, удалить это:
and level.indicators_shown()4. Прописываем вызов функций скрипта в файл:
scripts\bind_stalker.script
Функций всего четыре:
gunsl_thirst.on_netspawn()
gunsl_thirst.on_netdestroy()
gunsl_thirst.OnItemUsed(sect)
gunsl_thirst.UpdateState(delta)
Прописаны они в соответствующих функциях bind_stalker:
actor_binder:net_spawn(data)
actor_binder:net_destroy()
gunsl_thirst.OnItemUsed(sect)
gunsl_thirst.UpdateState(delta)5. Добавить в "продукты" параметр "thirst_factor", что бы они меняли жажду при "съедании".
На всякий случай мой bind_stalker.script с "жаждой".Спойлерfunction init(obj)
xr_motivator.AddToMotivator(obj)
end
function actor_init(npc)
npc:bind_object(actor_binder(npc))
end
game_difficulty_by_num = {
[0] = "gd_novice",
[1] = "gd_stalker",
[2] = "gd_veteran",
[3] = "gd_master"
}
local weapon_hide = {}
local primary_objects_filled = false
------------------------------------>
class "actor_binder" (object_binder)
------------------------------------>
function actor_binder:__init (obj) super(obj)
self.bCheckStart = false
self.weather_manager = level_weathers.get_weather_manager()
self.surge_manager = surge_manager.get_surge_manager()
self.last_level_name = nil
self.deimos_intensity = nil
self.loaded_active_slot = 3
self.loaded_slot_applied = false
self.last_detective_achievement_spawn_time = nil
self.last_mutant_hunter_achievement_spawn_time = nil
-- AtmosFear
self.atmosfear=atmosfear.get_atmosfear()
self.fallout_manager = fallout_manager.get_fallout_manager()end
------------------------------------>
function actor_binder:net_spawn(data)
level.show_indicators()
self.bCheckStart = true
self.weapon_hide = false
self.weapon_hide_in_dialog = false
weapon_hide = {}
if object_binder.net_spawn(self,data) == false then
return false
end
db.add_actor(self.object)
db.actor.deimos_intensity = self.deimos_intensity
self.deimos_intensity = nil
if self.st.disable_input_time == nil then
level.enable_input()
end
xr_s.on_game_load()
--VSm
VScallback.OnGameLoad()
--VSm
self.weather_manager:reset()
death_manager.init_drop_settings()
self.task_manager = task_manager.get_task_manager()
self.spawn_frame = device().frame
self.already_jumped = false
self.loaded = false
benchmark.main() --' Distemper 06.2008 --
ts_mod_cop.ts_on_net_spawn() --TS_MOD--
--/ SGM in
sgm_callbacks.on_game_load()
--/ SGM out
--Gunslinger mod
gunsl_thirst.on_netspawn()
return true
end
------------------------------------>
function actor_binder:net_destroy()
--Gunslinger mod
gunsl_thirst.on_netdestroy()
xr_sound.stop_sounds_by_id(self.object:id())
local board_factions = sim_board.get_sim_board().players
if(board_factions) then
for k,v in pairs (board_factions) do
xr_sound.stop_sounds_by_id(v.id)
end
end
if(actor_stats.remove_from_ranking~=nil)then
actor_stats.remove_from_ranking(self.object:id())
end
level.show_weapon(true)
db.del_actor(self.object)
self.object:set_callback(callback.inventory_info, nil)
self.object:set_callback(callback.article_info, nil)
self.object:set_callback(callback.on_item_take, nil)
self.object:set_callback(callback.on_item_drop, nil)
self.object:set_callback(callback.task_state, nil)
self.object:set_callback(callback.level_border_enter, nil)
self.object:set_callback(callback.level_border_exit, nil)
self.object:set_callback(callback.take_item_from_box, nil)
self.object:set_callback(callback.use_object, nil)
log("--------->"..tostring(_G.amb_vol))
log("--------->"..tostring(_G.mus_vol))
if(_G.amb_vol~=0) then
get_console():execute("snd_volume_eff "..tostring(_G.amb_vol))
_G.amb_vol = 0
end
if(_G.mus_vol~=0) then
get_console():execute("snd_volume_music "..tostring(_G.mus_vol))
_G.mus_vol = 0
end
if sr_psy_antenna.psy_antenna then
sr_psy_antenna.psy_antenna:destroy()
sr_psy_antenna.psy_antenna = false
end
xrs_dyn_music.finish_theme()
xr_s.on_actor_destroy()
object_binder.net_destroy(self)
end
------------------------------------>
function actor_binder:reinit()
object_binder.reinit(self)
local npc_id = self.object:id()
db.storage[npc_id] = { }
self.st = db.storage[npc_id]
self.st.pstor = nil
self.object:set_callback(callback.inventory_info, self.info_callback, self)
self.object:set_callback(callback.on_item_take, self.on_item_take, self)
self.object:set_callback(callback.on_item_drop, self.on_item_drop, self)
self.object:set_callback(callback.trade_sell_buy_item, self.on_trade, self) -- for game stats
self.object:set_callback(callback.task_state, self.task_callback, self)
self.object:set_callback(callback.take_item_from_box, self.take_item_from_box, self)
self.object:set_callback(callback.use_object, self.use_inventory_item, self)
end
------------------------------------>
function actor_binder:take_item_from_box(box, item)
--/ SGM in
local box_name = box:name()
ts_mod_cop.ts_on_item_take(item) --TS_MOD--
sgm_callbacks.on_take_item_from_box(box,item)
--/ SGM out
end
------------------------------------>
function actor_binder:info_callback(npc, info_id)
printf("*INFO*: npc='%s' id='%s'", npc:name(), info_id)
--/ SGM in
sgm_callbacks.on_enterring_info(npc,info_id)
--/ SGM out
end
------------------------------------>
function actor_binder:on_trade(item,sell_bye,money)
--/ SGM in
if sell_bye == true then
sgm_callbacks.on_trade(item,money,1)
game_stats.money_trade_update(money)
else
sgm_callbacks.on_trade(item,money,2)
game_stats.money_trade_update(-money)
end
--/ SGM out
end
------------------------------------>
function actor_binder:article_callback(npc, group, name)
end
------------------------------------>
function actor_binder:on_item_take (obj)
printf("on_item_take [%s]", obj:name())
if isArtefact(obj) then
local anomal_zone = bind_anomaly_zone.parent_zones_by_artefact_id[obj:id()]
if anomal_zone ~= nil then
anomal_zone:on_artefact_take(obj)
else
bind_anomaly_zone.artefact_ways_by_id[obj:id()] = nil
end
local artefact = obj:get_artefact()
artefact:FollowByPath("NULL",0,vector():set(500,500,500))
xr_statistic.inc_founded_artefacts_counter(obj:id())
end
treasure_manager.get_treasure_manager():on_item_take(obj:id())
ts_mod_cop.ts_on_item_take(obj) --TS_MOD--
--/ SGM in
sgm_callbacks.on_item_take(obj)
--/ SGM out
end
------------------------------------>
function actor_binder:on_item_drop (obj)
ts_mod_cop.ts_on_item_drop(obj) --TS_MOD--
--/ SGM in
sgm_callbacks.on_item_drop(obj)
--/ SGM out
end
------------------------------------>
function actor_binder:use_inventory_item(obj)
if(obj) then
local item_name=obj:section()
local s_obj = alife():object(obj:id())
if (s_obj) and (s_obj:section_name()=="drug_anabiotic") then
xr_effects.disable_ui_only(db.actor, nil)
level.add_cam_effector("camera_effects\\surge_02.anm", 10, false, "bind_stalker.anabiotic_callback")
level.add_pp_effector("surge_fade.ppe", 11, false)
give_info("anabiotic_in_process")
_G.mus_vol = get_console():get_float("snd_volume_music")
_G.amb_vol = get_console():get_float("snd_volume_eff")
get_console():execute("snd_volume_music 0")
get_console():execute("snd_volume_eff 0")
end
-- AtmosFear Booster Check
if (s_obj) and (s_obj:section_name() == "drug_psy_blockade" or s_obj:section_name() == "drug_radioprotector" or s_obj:section_name() == "drug_antidot") then
local boost_time = system_ini():r_float(s_obj:section_name(),"boost_time")
xr_logic.pstor_store(db.actor,s_obj:section_name().."_expiration",atmosfear.CTimeAddSec(game.get_game_time(),boost_time*level.get_time_factor()))
end
-- End AtmosFear Booster Check
--******************************GWR****************************************
local sect = obj:section()
gunsl_thirst.OnItemUsed(sect)
--*****************************/GWR****************************************
--/ SGM in
sgm_callbacks.on_use_item(obj)
if find_in_string(item_name,"dv_") and find_in_string(item_name,"_case") then
sgm_callbacks.on_use_deserve(obj)
end
if find_in_string(item_name,"skill_book") then
sgm_callbacks.on_use_skill_book(obj)
end
if find_in_string(item_name,"sleeping_bag") then
sgm_callbacks.on_use_sleeping_bag(obj)
end
--/ SGM out
end
end
------------------------------------>
function anabiotic_callback()
--/ SGM in
sgm_flags.is_ui_disabled=true
--/ SGM out
level.add_cam_effector("camera_effects\\surge_01.anm", 10, false, "bind_stalker.anabiotic_callback2")
local rnd = math.random(35,45)
local m = surge_manager.get_surge_manager()
if(m.started) then
local tf = level.get_time_factor()
local diff_sec = math.ceil(game.get_game_time():diffSec(m.inited_time)/tf)
if(rnd>(m.surge_time-diff_sec)*tf/60) then
m.time_forwarded = true
m.ui_disabled = true
m:kill_all_unhided()
m:end_surge()
end
end
--/ SGM in
sgm_callbacks.on_forward_game_time(0,rnd)
--/ SGM out
level.change_game_time(0,0,rnd)
level_weathers.get_weather_manager():forced_weather_change()
end
------------------------------------>
function anabiotic_callback2()
--/ SGM in
sgm_flags.is_ui_disabled=false
--/ SGM out
xr_effects.enable_ui(db.actor, nil)
get_console():execute("snd_volume_music "..tostring(_G.mus_vol))
get_console():execute("snd_volume_eff "..tostring(_G.amb_vol))
_G.amb_vol = 0
_G.mus_vol = 0
disable_info("anabiotic_in_process")
end
------------------------------------>
function actor_binder:task_callback(_task, _state)
if _state ~= task.fail then
if _state == task.completed then
news_manager.send_task(db.actor, "complete", _task)
else
news_manager.send_task(db.actor, "new", _task)
end
end
task_manager.task_callback(_task, _state)
end
------------------------------------>
function actor_binder:update(delta)
object_binder.update(self, delta)
if string.find(command_line(), "-designer") then
return
end
if self.already_jumped==false and jump_level.need_jump==true and (device().frame > self.spawn_frame+2000) then
jump_level.try_to_jump()
self.already_jumped = true
return
end
-- Вызов апдейта переноса игрока проводником
if travel_func ~= nil then
travel_func()
end
-- DEBUG slowdown
--slowdown.update()
local time = time_global()
game_stats.update (delta, self.object)
-- апдейт погоды
self.weather_manager:update()
self:check_detective_achievement()
self:check_mutant_hunter_achievement()
-----------------------makdm
self:check_weapon_help_achievement()
----------------------------
--' Апдейт саундменеджера
xr_sound.update(self.object:id())
-- Обновление отключения ввода с клавиатуры.
if self.st.disable_input_time ~= nil and
game.get_game_time():diffSec(self.st.disable_input_time) >= self.st.disable_input_idle
then
level.enable_input()
self.st.disable_input_time = nil
end
-- Апдейт прятание оружия игрока во время диалога
if self.object:is_talking() then
if self.weapon_hide_in_dialog == false then
self.object:hide_weapon()
printf("hiding weapon!!!")
self.weapon_hide_in_dialog = true
end
else
if self.weapon_hide_in_dialog == true then
printf("restoring weapon!!!")
self.object:restore_weapon()
self.weapon_hide_in_dialog = false
end
end
-- Апдейт прятание оружия игрока в зоне sr_no_weapon
if check_for_weapon_hide_by_zones() == true then
if self.weapon_hide == false then
printf("hiding weapon!!!")
self.object:hide_weapon()
self.weapon_hide = true
end
else
if self.weapon_hide == true then
printf("restoring weapon!!!")
self.object:restore_weapon()
self.weapon_hide = false
end
end
if sr_psy_antenna.psy_antenna then
sr_psy_antenna.psy_antenna:update(delta)
end
if self.bCheckStart then
printf("SET DEFAULT INFOS")
if dont_has_alife_info("global_dialogs") then
self.object:give_info_portion("global_dialogs")
end
if dont_has_alife_info("level_changer_icons") then
self.object:give_info_portion("level_changer_icons")
end
self.bCheckStart = false
end
if not self.loaded_slot_applied then
self.object:activate_slot(self.loaded_active_slot)
self.loaded_slot_applied = true
end
xr_s.on_actor_update(delta)
--VSm
VScallback.OnActorUpdate(self,delta)
--VSm
if(self.surge_manager) then
if(self.f_surge_manager_loaded ~= true) then
self.surge_manager:initialize()
self.f_surge_manager_loaded = true
end
if(self.surge_manager.levels_respawn[level.name()]) then
self.surge_manager:respawn_artefacts_and_replace_anomaly_zone()
end
self.surge_manager:update()
end
-- AtmosFear
if(self.fallout_manager) then
self.fallout_manager:update()
end
if(self.atmosfear) then
self.atmosfear:update()
end
if not db.actor:has_info("atmosfear_default_console_settings_loaded") then
self.atmosfear:loadDefaultConsoleSettings()
db.actor:give_info_portion("atmosfear_default_console_settings_loaded")
end
-- End AtmosFear
simulation_objects.get_sim_obj_registry():update_avaliability(alife():actor())
if not self.loaded then
get_console():execute("dump_infos")
self.loaded = true
end
treasure_manager.get_treasure_manager():update()
if not(primary_objects_filled) then
pda.fill_primary_objects()
primary_objects_filled = true
end
pda.fill_sleep_zones()gunsl_thirst.UpdateState(delta)
--/ SGM in
if mod_update() then
sgm_loader.sigerous_mod_main()
end
--/ SGM out
end
------------------------------------>
function actor_binder:save(packet)
--/ SGM in
if get_game_unique_id() then
data_param_save_all()
end
--/ SGM out
set_save_marker(packet, "save", false, "actor_binder")
object_binder.save(self, packet)
packet:w_u8(level.get_game_difficulty())
if self.st.disable_input_time == nil then
packet:w_bool(false)
else
packet:w_bool(true)
utils.w_CTime(packet, self.st.disable_input_time)
end
xr_logic.pstor_save_all(self.object, packet)
self.weather_manager:save(packet)
release_body_manager.get_release_body_manager():save(packet)
-- AtmosFear
self.atmosfear:save(packet)
self.fallout_manager:save(packet)
-- End AtmosFear
self.surge_manager:save(packet)
--/ SGM in
sgm_loader.save(packet)
--/ SGM out
sr_psy_antenna.save( packet )
packet:w_bool(sim_board.get_sim_board().simulation_started)
xr_sound.actor_save(packet)
packet:w_stringZ(tostring(self.last_level_name))
xr_statistic.save(packet)
treasure_manager.get_treasure_manager():save(packet)
local n = 0
for k,v in pairs(db.script_ids) do
n = n + 1
end
packet:w_u8(n)
for k,v in pairs (db.script_ids) do
packet:w_u16(k)
packet:w_stringZ(v)
end
task_manager.get_task_manager():save(packet)
packet:w_u8(self.object:active_slot())
local deimos_exist = false
for k,v in pairs(db.zone_by_name) do
if(db.storage[v:id()] and db.storage[v:id()].active_scheme=="sr_deimos") then
deimos_exist = true
packet:w_bool(true)
packet:w_float(db.storage[v:id()].sr_deimos.intensity)
end
end
if not deimos_exist then
packet:w_bool(false)
end
if self.last_detective_achievement_spawn_time == nil then
packet:w_bool(false)
else
packet:w_bool(true)
utils.w_CTime(packet, self.last_detective_achievement_spawn_time)
end
if self.last_mutant_hunter_achievement_spawn_time == nil then
packet:w_bool(false)
else
packet:w_bool(true)
utils.w_CTime(packet, self.last_mutant_hunter_achievement_spawn_time)
end
-------------------------------makdm
if self.last_weapon_help_achievement_spawn_time == nil then
packet:w_bool(false)
else
packet:w_bool(true)
utils.w_CTime(packet, self.last_weapon_help_achievement_spawn_time)
end
-------------------------------------
set_save_marker(packet, "save", true, "actor_binder")
end
------------------------------------>
function actor_binder:load(reader)
set_save_marker(reader, "load", false, "actor_binder")
object_binder.load(self, reader)
local game_difficulty = reader:r_u8()
if game_difficulty~=nil and game_difficulty>=0 and game_difficulty<=3 then
get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])
else
mod_abort("SGM: cохранение накрылось кармой. Попробуйте загрузится c раннего сохранения.")
get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])
end
local stored_input_time = reader:r_u8()
if stored_input_time == true then
self.st.disable_input_time = utils.r_CTime(reader)
end
xr_logic.pstor_load_all(self.object, reader)
self.weather_manager:load(reader)
release_body_manager.get_release_body_manager():load(reader)
-- AtmosFear
self.atmosfear:load(reader)
self.fallout_manager:load(reader)
-- End AtmosFear
self.surge_manager:load(reader)
--/ SGM in
sgm_loader.load(reader)
--/ SGM out
self.f_surge_manager_loaded = true
sr_psy_antenna.load(reader)
sim_board.get_sim_board().simulation_started = reader:r_bool()
xr_sound.actor_load(reader)
local n = reader:r_stringZ()
if(n~="nil") then
self.last_level_name = n
end
xr_statistic.load(reader)
treasure_manager.get_treasure_manager():load(reader)
n = reader:r_u8()
for i = 1,n do
db.script_ids[reader:r_u16()] = reader:r_stringZ()
end
task_manager.get_task_manager():load(reader)
self.loaded_active_slot = reader:r_u8()
self.loaded_slot_applied = false
local b = reader:r_bool()
if(b) then
self.deimos_intensity = reader:r_float()
end
local stored_achievement_time = reader:r_bool()
if stored_achievement_time == true then
self.last_detective_achievement_spawn_time = utils.r_CTime(reader)
end
stored_achievement_time = reader:r_bool()
if stored_achievement_time == true then
self.last_mutant_hunter_achievement_spawn_time = utils.r_CTime(reader)
end
----------------------------makdm
stored_achievement_time = reader:r_bool()
if stored_achievement_time == true then
self.last_weapon_help_achievement_spawn_time = utils.r_CTime(reader)
end
---------------------------------
set_save_marker(reader, "load", true, "actor_binder")
end
local detective_achievement_items = {"medkit","antirad","bandage"}
local mutant_hunter_achievement_items = {"ammo_5.45x39_ap","ammo_5.56x45_ap","ammo_9x39_ap","ammo_5.56x45_ap","ammo_12x76_zhekan"}
----------------------------------------------------makdm
local weapon_help_achievement_items = {"af_fire","af_gravi","af_gold_fish","af_baloon","af_glass"}
---------------------------------------------------------
local function spawn_achivement_items(items_table, count, inv_box_story_id)
local inv_box = alife():object(get_story_object_id(inv_box_story_id))
for i = 1,count do
alife():create(items_table[math.random(#items_table)],inv_box.position,inv_box.m_level_vertex_id,inv_box.m_game_vertex_id,inv_box.id)
end
end
function actor_binder:check_detective_achievement()
if dont_has_alife_info("detective_achievement_gained") then
return
end
if self.last_detective_achievement_spawn_time == nil then
self.last_detective_achievement_spawn_time = game.get_game_time()
end
if game.get_game_time():diffSec(self.last_detective_achievement_spawn_time) > 43200 then
spawn_achivement_items(detective_achievement_items, 4, "zat_a2_actor_treasure")
xr_effects.send_tip(db.actor, nil, {"st_detective_news","got_medicine"})
self.last_detective_achievement_spawn_time = game.get_game_time()
end
end
function actor_binder:check_mutant_hunter_achievement()
if dont_has_alife_info("mutant_hunter_achievement_gained") then
return
end
if self.last_mutant_hunter_achievement_spawn_time == nil then
self.last_mutant_hunter_achievement_spawn_time = game.get_game_time()
end
if game.get_game_time():diffSec(self.last_mutant_hunter_achievement_spawn_time) > 43200 then
spawn_achivement_items(mutant_hunter_achievement_items, 5, "jup_b202_actor_treasure")
xr_effects.send_tip(db.actor, nil, {"st_mutant_hunter_news","got_ammo"})
self.last_mutant_hunter_achievement_spawn_time = game.get_game_time()
endend
-------------------------------------------makdm
function actor_binder:check_weapon_help_achievement()
if dont_has_alife_info("pri_a17_actor_has_gauss_rifle") then
return
end
if self.last_weapon_help_achievement_spawn_time == nil then
self.last_weapon_help_achievement_spawn_time = game.get_game_time()
end
if game.get_game_time():diffSec(self.last_weapon_help_achievement_spawn_time) > 43200 then
spawn_achivement_items(weapon_help_achievement_items, 2, "pri_a16_actor_treasure")
xr_effects.send_tip(db.actor, nil, {"st_weapon_help_news","got_artefact"})
self.last_weapon_help_achievement_spawn_time = game.get_game_time()
endend
--------------------------------------------------
------------------------------------>
function check_for_weapon_hide_by_zones()
for k,v in pairs(weapon_hide) do
if v == true then
return true
end
end
return false
end
-- Weapon functions
function hide_weapon(zone_id)
--/printf("[WEAPON_CONTROL]:hiding weapon from zone [%s] in section [%s]!!!", zone_id, db.storage[zone_id].active_section)
weapon_hide[zone_id] = true
endfunction restore_weapon(zone_id)
--/printf("[WEAPON_CONTROL]:restoring weapon from zone [%s] in section [%s]!!!", zone_id, db.storage[zone_id].active_section)
weapon_hide[zone_id] = false
end
.. и мой gunsl_thirst.scriptСпойлер--gunsl_thirst.script
--Description: реализация жажды и всего, что с ней связано
--Creator: Sin!
--Last Edit: 07 Mar 2020local PSTOR_THIRST_PARAM_NAME = "gunsl_thirst"
local idle_decrement = 0.00001 --уменьшение состояния в игровую секунду при идле; 0.00001 - хватит на 27.77 часов
local move_decrement = 0.00003 --при ходьбе, хватит примерно на 9 часов
local sprint_decrement = 0.0001 --при беге, 2.7 часаlocal max_delta_time = 5400 --время между двумя апдейтами не больше этого
local sleep_decrement = 0.3 --при сне более max_delta_time
local teleport_decrement = 0.15 --при телепорте/проводнике со сдвигом времениlocal bleeding_koef = 0.0001 --дополнительное уменьшение состояние при кровотечении равном 1
local health_decrement = 0.00043 --минимальная величина, на которую будет уменьшаться здоровье за секунду в случае сильной жажды
local power_decrement = 0.00350 --минимальная величина, на которую будет уменьшаться выносливость за секунду в случае сильной жаждыlocal ppe_rem_time = 10000 --время, через которое удалится постэффект
local ini = system_ini()
local aid = db.actor:id()local lasttime
local lastpos
local thirst_indicator
local thirst_ppe
local pp_start_time
local pp_startrem_timefunction OnItemUsed(sect)
--Тут проверяем, является ли использованный предмет утолителем жажды. Если является - то улучшаем состояние актора.
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] or 1
if ini:line_exist(sect, "thirst_factor") then
local factor = ini:r_float(sect, "thirst_factor")
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] + factor
if db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]>1 then db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]=1 end
if db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]<-0.15 then db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]=-0.15 end
end
endfunction UpdateState(delta1)
--вызывается из апдейта актора, тут анализируем его текущее состояние и в зависимости от него уменьшаем количество воды в организме.
--убеждаемся, что количество воды в организме и последние данные корректны
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] or 1
lasttime = lasttime or game.get_game_time()
lastpos = lastpos or db.actor:position()
local newtime = game.get_game_time()
local delta = newtime:diffSec(lasttime)
local hit_allowed = true
if delta>max_delta_time then
--ограничиваем время - чтобы не убивало при сне/переходах
delta = max_delta_time
hit_allowed = false
end
local newpos = db.actor:position()
local speed = newpos:distance_to(lastpos)/delta1
speed = math.ceil(speed*10000)
--уменьшаем количество воды, учитывая прошедшее время и состояние перемещения актора
if speed<6 then
--сейчас мы в идле
if hit_allowed then
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - idle_decrement*delta
else
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - sleep_decrement
end
elseif speed<50 then
--мы идём
if hit_allowed then
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - move_decrement*delta
else
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - sleep_decrement
end
else
--мы бежим
if hit_allowed then
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - sprint_decrement*delta
else
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - teleport_decrement
end
end
if db.actor.bleeding>0.005 then
db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] - bleeding_koef*db.actor.bleeding*delta
end
--проверим, не достигнуто ли критическое состояние
if db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] < -0.15 then db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] = -0.15 end
--Теперь будем назначать всякие нехорошие эффекты, если у нас критически малое содержание жидкости в организме
if (db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] < 0.2) and hit_allowed then
--назначаем постпроцесс жажды/меняем его интенсивность в зависимости от её степени
if thirst_ppe == nil then
thirst_ppe = 13
--level.add_pp_effector("contrast.ppe", thirst_ppe, true)
level.add_pp_effector("black.ppe", thirst_ppe, true)
level.set_pp_effector_factor(thirst_ppe, 0.001)
pp_start_time = device():time_global()
else
local pp_factor = (1-((db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]+0.15)/0.35)^3)/2.5
local pp_dt = device():time_global() - pp_start_time
local phase = (math.sin(pp_dt / 1000)-0.66) * 5;
if phase < 0 then
phase = 0
end;pp_factor = pp_factor * phase
level.set_pp_effector_factor(thirst_ppe, pp_factor, 0.8)
end
if db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME] < 0 then
--Уменьшаем здоровье актора
local hlth_factor = (db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]-1) * health_decrement*delta
if db.actor.health+hlth_factor<0.005 then
if db.actor.health>0.004 then
db.actor.health = 0.004-db.actor.health
end
else
db.actor.health = hlth_factor
end
db.actor.power = (db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]-1) * power_decrement*delta
end
else
--Состояние улучшилоcь, удаляем постпроцесс
if thirst_ppe~=nil then
if pp_startrem_time==nil then
pp_startrem_time = device():time_global()
level.set_pp_effector_factor(thirst_ppe, 0, 0.4)
end
if device():time_global()-ppe_rem_time>pp_startrem_time then
level.remove_pp_effector(thirst_ppe)
thirst_ppe = nil
pp_startrem_time = nil
end
end
end--messenger.gwr_messenger(tostring(db.actor.bleeding), 100)
--messenger.gwr_messenger(tostring(db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]), 100)
lasttime = newtime
lastpos = newpos
endfunction on_netspawn()
thirst_indicator = gunsl_thirst_indicator()
level.add_dialog_to_render(thirst_indicator)
endfunction on_netdestroy()
level.remove_dialog_to_render(thirst_indicator)
thirst_indicator = nil
end--Индикатор жажды
class "gunsl_thirst_indicator" (CUIScriptWnd)
function gunsl_thirst_indicator:__init() super()
local xml = CScriptXmlInit()
xml:ParseFile("ui_gunsl_thirst_indicator.xml")
self.main_static = xml:InitStatic("main_static", self)
endfunction gunsl_thirst_indicator:Update()
--Проверяем, надо ли вообще показывать что-то
local curstate = db.storage[aid].pstor[PSTOR_THIRST_PARAM_NAME]
if curstate==nil then
return
end
local hd = get_console():get_bool("hud_draw")
local curfov = device().fov
--log1(curfov) level.is_ui_shown() and need_hide_indicators
--if (db.actor~=nil) and db.actor:alive() and level.is_ui_shown() and hd and level.get_game_difficulty()<game_difficulty.master and curfov>50 and xr_effects.ui_active_slot~=0 and travel_manager.init_time==nil and curstate < 0.7 then
if (db.actor~=nil) and db.actor:alive() and hd and (level.get_game_difficulty()<game_difficulty.master or level.inventory_shown()) and curstate < 0.7 then
--Надо показывать
self.main_static:Show(true)
--***********************************************************************************
--т.к. непонятно, как отловить скриптовое сокрытие движковых индикаторов худа,
--то просто покажем их принудительно
--level.show_indicators()
--***********************************************************************************
--Назначим текстуру в зависимости от текущего состояния
if curstate > 0.5 then
self.main_static:InitTexture("ui_gunsl_thirst_indicator_green")
elseif curstate > 0.3 then
self.main_static:InitTexture("ui_gunsl_thirst_indicator_yellow")
elseif curstate > 0.1 then
self.main_static:InitTexture("ui_gunsl_thirst_indicator_orange")
else
self.main_static:InitTexture("ui_gunsl_thirst_indicator_red")
end
else
self.main_static:Show(false)
end
end
В итоге жажда работает. Но есть косяк, иконка жажды (бутылка в кружочке, на скринах слева, внизу) появляется буквально везде (ниже скрины).Добавлю что при загрузке следующего уровня (во время автосейва), иконка так же отображается.
При попытке перенести содержимое configs\ui\textures_descr\gunsl_thirst_indicator.xml в configs\ui\textures_descr\ui_actor_hint_wnd.xml получаю ошибку.
-
Зов Припяти, Sigerous mod 2.2 (чистый). Хотелось бы в gamedata\configs\text\rus\ui_st_keybinding.xml повесить горячую клавишу на команду "показать-скрыть интерфейс".
Кроме level.hide_indicators() и level.hide_indicators_safe() ничего не нашел. Там еще вдобавок убирается ограничение веса рюкзака или добавляется бессмертие. Но мне нужно просто показать-скрыть интерфейс быстрым нажатием, не заходя в настройки игры.
Скажите, есть на данный момент определённое решение? -
В 07.11.2021 в 15:30, TMM team сказал:какое-то здания которого нет
Возможно оно есть в файле level_lods.dds (смотрим gamedata\levels\ выбираем папку с соответствующей локацией)
-
1
-
-
57 минут назад, TMM team сказал:Что отвечает за дальность прорисовки мира? Как в атмосфере?
Папка gamedata\configs\environment\weathers\ там файлы пораметров погоды. По умолчанию смотрим af3_slight_ например af3_slight_clear_4 и т.д.
Для каждого часа смотрим параметры far_plane и fog_distance
Дальность (fog_distance): при тумане обычно 150-300, в ясную 800-100057 минут назад, TMM team сказал:Что это за текстура призрак на фото?
Вот чего не понял, где там призрак отображен? Или ты имеешь ввиду как бы эффект линзы (шестигранника) от солнца?
Дополнено 2 минуты спустя14 минут назад, TMM team сказал:спасибо за ответ, буду искать
Да искать особо не надо. Открой любой скай-бокс, (для начала) ясную погоду, в дневное время (папка af3_clear) и посмотри фотошопом в самом низу любого фрагмента.
Дополнено 49 минуты спустя19 часов назад, Hoperise сказал:но стеклянный шкаф на базе ученых (именно стекла) сместились со своих мест
Скрин хоть покажи..
-
39 минут назад, TMM team сказал:Какие текстуры отвечают за ЧАЭС на горизонте ( в небе типо )?
Это нарисовано на самом скай-боксе, которые разделены по часам. Для каждого скай-бокса, свой рисунок ЧАЭС и пр. того что отображается на горизонте.
-
2 минуты назад, Policai сказал:Редактировать движок...
Ну это понятно, что функции зашиты в движок )) Я имел ввиду скриптовую часть. Собственно вопрос был к знающим в скриптописании. На положительный ответ особо не надеялся. Мысль была, может кто то уже пробовал это реализовать.
-
Всем привет! Пара вопросов по детекторам..
1. Есть у кого детекторы как бы в "пластиковых" корпусах? В игре они как бы в затертом алюминиевом корпусе. Может кто то пробовал рисовать в фотошопе или эта идея уже реализована где то в модах. Оттенок корпуса не важен, главное как бы "пластиковые" .bump текстуры.
2. Как "заставить" детекторы veres, svarog, omega издавать звуки при обнаружении артов, как это реализовано в отклике и медведь? Мне не важен сам тон звучания, главное что бы они это делали.
Прописывание в gamedata\configs\misc\devices.ltx для каждого из трех детекторов параметров типа
af_class_1 = af_cristall
af_sound_1_ = detectors\art_beep1
и т.д. (для нужных артов) ни к чему не привели, детекторы продолжают молчать и отображают на дисплее обнаруженные арты.
-
53 минуты назад, MrSol0 сказал:вот скрин их папки
Да, всё верно. Эту папку надо периодически чистить вручную.
46 минут назад, KERIXFIX337X сказал:нету такого мода
То же пробовал разные варианты, что находил в инете.. не помогает. У меня 8 ядер и 16 оперативки. Вылеты только из за движка. Только чаще сохранятся или чистить мод от всяких примочек, наподобие оригинального Sigerous 2.2
Хотя, как вариант.. можно попробовать распаковать все .db архивы и по новой запаковать уже вместе с модом, без лишних оригинальных файлов Зова Припяти. Может поможет. Ведь игра при загрузке читает оригинальные архивы, а потом gamedata с модом. И так каждый раз, при загрузке следующей локации.

Global Stalker Weather Rework
в Моды Зов Припяти
Опубликовано
Курсором не пробовал поводить чуть выше-ниже (главное по центру панельки "опции")?