Сергей Шубин
-
Публикаций
95 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные Сергей Шубин
-
-
23 минуты назад, AziatkaVictor сказал:makdm простите, если глупый вопрос, но писать через exclusive вот так?
[exclusive] имя_сквада = путь к логике
Я правильно понял?
Нет.
Пример - смарт наемников Тесака из Зова Припяти.
[smart_terrain];zat_b103_merc_smart
squad_id = 50
max_population = 3
;safe_restr = zat_b103_sr_safety_zone
def_restr = zat_b103_sr_def_restr[exclusive]
lost_merc_leader = zaton\zat_b103_lost_merc_leader.ltx
lost_merc_1 = zaton\zat_b103_lost_mercs.ltx
lost_merc_2 = zaton\zat_b103_lost_mercs.ltx
lost_merc_3 = zaton\zat_b103_lost_mercs.ltx
lost_merc_4 = zaton\zat_b103_lost_mercs.ltx
lost_merc_5 = zaton\zat_b103_lost_mercs.ltx
lost_merc_6 = zaton\zat_b103_lost_mercs.ltx
lost_merc_7 = zaton\zat_b103_lost_mercs.ltxВ данном смарте 8 эксклюзивных работ для 8 НПС.
В файлах логики - ссылки выше - логика НПС.
[logic@lost_merc_leader]
suitable = {=check_npc_name(zat_b103_lost_merc_leader) !surge_started}
active = walker@leader
prior = 200
on_death = deathНа эту работу встанет НПС с определенным именем. Если поменяете условие, как выше писал Дмитрий, то на работу встанет НПС из определенного сквада.
- 1
-
В 23.09.2020 в 09:03, Winzor сказал:Есть ли мод на потребность сна у ГГ? Желательно на версию 1.6.02
Я делал так. Взял функции из СГМ.
Спойлер
_g.scripts-- 'Прибавить к pstor-счетчику цифру.
function Inc_Counter(counter_name,add_value)
if Read_Variable(counter_name)==nil then Write_Variable(counter_name,0) end
if add_value==nil then add_value=1 end
if Read_Variable(counter_name)~=nil then
local counter=Read_Variable(counter_name)
Write_Variable(counter_name,counter+add_value)
end
end-- 'Отнять от pstor-счетчика цифру.
function Dec_Counter(counter_name,add_value)
if Read_Variable(counter_name)==nil then Write_Variable(counter_name,0) end
if add_value==nil then add_value=1 end
if Read_Variable(counter_name)~=nil then
local counter=Read_Variable(counter_name)
Write_Variable(counter_name,counter-add_value)
end
end-- 'Запись pstor переменной.
function Write_Variable(params_name,value)
if value==nil then
Clear_Variable(params_name)
else
local opt=Reload_Params(params_name)
Pstor_Store(db.actor,opt,value)
end
end-- 'Чтение pstor переменной.
function Read_Variable(params_name)
local opt=Reload_Params(params_name)
return Pstor_Retrieve(db.actor,opt)
end-- 'Удаление pstor переменной.
function Clear_Variable(params_name)
local opt=Reload_Params(params_name)
if db.storage[db.actor:id()].pstor[opt] then
db.storage[db.actor:id()].pstor[opt]=nil
end
endfunction Pstor_Store(obj,varname,val)
if obj==nil then return nil end
local sub_id=obj:id()
if db.storage[sub_id].pstor==nil then
db.storage[sub_id].pstor={}
end
db.storage[sub_id].pstor[varname]=val
end
function Pstor_Retrieve(obj,varname)
if obj==nil then return nil end
local sub_id=obj:id()
if db.storage[sub_id].pstor~=nil then
local val=db.storage[sub_id].pstor[varname]
if val~=nil then
return val
end
end
return nil
end
function Reload_Params(params)
return params
end2. bind_stalker.scripts
Вызов всего процесса.
self:check_detective_achievement()
self:check_mutant_hunter_achievement()self:actor_universal_binder()
function actor_binder:actor_universal_binder()
if self.actor_universal_binder_time == nil then
self.actor_universal_binder_time = game.get_game_time()
end
if game.get_game_time():diffSec(self.actor_universal_binder_time) > 10 then
actor_sleep_control()
self.actor_universal_binder_time = game.get_game_time()
end
endfunction actor_sleep_control()
if Read_Variable("actor_active_time") == nil then
Write_Variable("actor_active_time",0)
else
Inc_Counter("actor_active_time")
end
actor_sleep_control2()
endfunction actor_sleep_control2()
if Read_Variable("actor_active_time") == nil then
Write_Variable("actor_active_time",0)
end
if Read_Variable("actor_active_time") > 20*60*6 and Read_Variable("actor_active_time") < 21*60*6 then
local rnd_ppe11=math.random(1,12)
local rnd_ppe12=math.random(1,12)
if rnd_ppe11==1 then
level.add_pp_effector("shock_hit.ppe",91350,false)
end
if rnd_ppe12==1 then
level.add_pp_effector("surge_shock.ppe",331510,false)
end
if db.actor.power > 0.8 then db.actor.power = 0.8 - db.actor.power end
end
if Read_Variable("actor_active_time") > 21*60*6 and Read_Variable("actor_active_time") < 22*60*6 then
local rnd_ppe21=math.random(1,10)
local rnd_ppe22=math.random(1,10)
if rnd_ppe21==1 then
level.add_pp_effector("actor_hit.ppe",91350,false)
end
if rnd_ppe22==1 then
level.add_pp_effector("surge_shock.ppe",331510,false)
end
if db.actor.power > 0.6 then db.actor.power = 0.6 - db.actor.power end
end
if Read_Variable("actor_active_time") > 22*60*6 and Read_Variable("actor_active_time") < 23*60*6 then
local rnd_ppe31=math.random(1,8)
local rnd_ppe32=math.random(1,8)
local rnd_ppe33=math.random(1,8)
if rnd_ppe31==1 then
level.add_pp_effector("actor_hit.ppe",510,false)
end
if rnd_ppe32==1 then
level.add_pp_effector("shock_hit.ppe",91350,false)
end
if rnd_ppe33==1 then
level.add_pp_effector("deimos1.ppe",11315,false)
end
if db.actor.power > 0.4 then db.actor.power = 0.4 - db.actor.power end
end
if Read_Variable("actor_active_time") > 23*60*6 and Read_Variable("actor_active_time") < 24*60*6 then
local rnd_ppe41=math.random(1,6)
local rnd_ppe42=math.random(1,6)
local rnd_ppe43=math.random(1,6)
if rnd_ppe41==1 then
level.add_pp_effector("shock_hit.ppe",91350,false)
end
if rnd_ppe42==1 then
level.add_pp_effector("actor_hit.ppe",510,false)
end
if rnd_ppe43==1 then
level.add_pp_effector("deimos1.ppe",11315,false)
end
if db.actor.power > 0.2 then db.actor.power = 0.2 - db.actor.power end
end
if Read_Variable("actor_active_time") > 24*60*6 then
xr_effects.disable_ui(db.actor, nil)
level.add_cam_effector("camera_effects\\sleep.anm", 10, false, "bind_stalker.dream_callback")
level.add_pp_effector("sleep_fade.ppe", 11, false)
db.actor:give_info_portion("actor_is_sleeping")
_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")
surge_manager.resurrect_skip_message()
Write_Variable("actor_active_time",19*60*6)
end
endfunction dream_callback()
level.add_cam_effector("camera_effects\\sleep.anm", 10, false, "bind_stalker.dream_callback2")
local hours = math.random(6,10)
level.change_game_time(0,hours,0)
level_weathers.get_weather_manager():forced_weather_change()
surge_manager.get_surge_manager().time_forwarded = true
if (surge_manager.is_started() and level_weathers.get_weather_manager().weather_fx) then
level.stop_weather_fx()
-- level_weathers.get_weather_manager():select_weather(true)
level_weathers.get_weather_manager():forced_weather_change()
end
db.actor.power = 1
printf("dream_callback: time forwarded on [%d]", hours)
Write_Variable("actor_active_time",0)
endfunction dream_callback2()
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
db.actor.power = 1
db.actor:give_info_portion("tutorial_sleep")
disable_info("actor_is_sleeping")
disable_info("sleep_active")
end3. ui_sleep_dialog.scripts
function dream_callback()
level.add_cam_effector("camera_effects\\sleep.anm", 10, false, "ui_sleep_dialog.dream_callback2")
local hours = sleep_control.time_track:GetIValue()
level.change_game_time(0,hours,0)
level_weathers.get_weather_manager():forced_weather_change()
surge_manager.get_surge_manager().time_forwarded = true
if (surge_manager.is_started() and level_weathers.get_weather_manager().weather_fx) then
level.stop_weather_fx()
-- level_weathers.get_weather_manager():select_weather(true)
level_weathers.get_weather_manager():forced_weather_change()
end
db.actor.power = 1
printf("dream_callback: time forwarded on [%d]", hours)
if Read_Variable("actor_active_time") == nil then
Write_Variable("actor_active_time",0)
end
if hours >= 6 then
Write_Variable("actor_active_time",0)
else
if Read_Variable("actor_active_time") > hours*60*6 then
Dec_Counter("actor_active_time",hours*60*6)
else
Write_Variable("actor_active_time",0)
end
end
end
4. xr_effects.scripts
function set_game_time(actor, npc, p)
local real_hours = level.get_time_hours()
local real_minutes = level.get_time_minutes()
local hours = tonumber(p[1])
local minutes = tonumber(p[2])
if p[2] == nil then
minutes = 0
end
local hours_to_change = hours - real_hours
if hours_to_change <= 0 then
hours_to_change = hours_to_change + 24
end
local minutes_to_change = minutes - real_minutes
if minutes_to_change <= 0 then
minutes_to_change = minutes_to_change + 60
hours_to_change = hours_to_change - 1
elseif hours == real_hours then
hours_to_change = hours_to_change - 24
end
level.change_game_time(0,hours_to_change,minutes_to_change)
level_weathers.get_weather_manager():forced_weather_change()
surge_manager.get_surge_manager().time_forwarded = true
printf("set_game_time: time changed to [%d][%d]", hours_to_change, minutes_to_change)
if Read_Variable("actor_active_time") == nil then
Write_Variable("actor_active_time",0)
end
Inc_Counter("actor_active_time",hours_to_change*60*6+minutes_to_change*6)
endfunction forward_game_time(actor, npc, p)
if not p then
abort("Insufficient or invalid parameters in function 'forward_game_time'!")
endlocal hours = tonumber(p[1])
local minutes = tonumber(p[2])if p[2] == nil then
minutes = 0
end
level.change_game_time(0,hours,minutes)
level_weathers.get_weather_manager():forced_weather_change()
surge_manager.get_surge_manager().time_forwarded = true
printf("forward_game_time: time forwarded on [%d][%d]", hours, minutes)
if Read_Variable("actor_active_time") == nil then
Write_Variable("actor_active_time",0)
end
Inc_Counter("actor_active_time",hours*60*6+minutes*6)
endfunction sleep(actor, npc)
local sleep_zones = {
"zat_a2_sr_sleep",
"jup_a6_sr_sleep",
"pri_a16_sr_sleep",
"actor_surge_hide_2"
}
for k,v in pairs (sleep_zones) do
if utils.npc_in_zone(db.actor, db.zone_by_name[v]) then
if Read_Variable("actor_active_time") == nil then
Write_Variable("actor_active_time",0)
end
if Read_Variable("actor_active_time") > 12*60*6 then
ui_sleep_dialog.sleep()
give_info("sleep_active")
else
game.start_tutorial("actor_no_sleep_use")
end
end
end
end
- 1
-
-
1 час назад, Stgs сказал:В основном жалуется на несвязанные друг с другом участки нодов:
Что странно, учитывая то, что подобные места были и на оригинальных локациях трилогии. Крыши со снайперами, например.
Если загрузить локи из оригинала в СДК, то можно увидеть, что несвязанных участков там нет. Участки сетки на крышах связаны с наземной сеткой. Обычно ставят на крыше один квадрат, соединенный с квадратом внизу. Или квадрат ставят вертикально и растягивают по стене.
-
Если верить Яндексу
Спойлер! Cannot build GAME path! (object esc_tutorial_wounded0826) !
CURRENT LEVEL : escape !
CURRENT game point position : [-146.011078][-20.711269][-147.502380]
FATAL ERROR [error]Expression : I != levels().end() [error]Function : GameGraph::CHeader::level [error]File : f:\project\home\stalker\borscht\src_engine\xray\xrgame\game_graph_inline.h [error]Line : 153 [error]Description : there is no specified level in the game graph : 205
Такая ошибка возникла после того, как была прервана компиляция ИИ-сетки. Видимо, испортился игровой граф, нужно перекомпилировать его (xrAI -f)
Проверь, что не так в точках, на которые ругается консоль.
- 1
-
В 03.09.2020 в 22:04, Igor_Misery сказал:Разработчики на текстуры натянули маску "БУДЕТ УДАЛЕНО", которую не видно, если открыть текстуру. Что делать?
Просматривать текстуры в соответствующей программе.
Пример - crete_truba_ch. Слева текстура из Зова Припяти. Её украшает желтая надпись. Справа текстура Чистого Неба - без надписи. Нужно текстуру Зова Припяти заменить одноименной чистонебовской.
- 1
-
7 часов назад, Gerbys сказал:Создал файл логики в config/scripts (и в config/scripts/имя_локации пробовал), в spawn_sections прописал custom_data с путём к файлу логики. В чем может быть проблема?
Не помешало бы сам файл логики выложить.
-
Если воспользуетесь Яндексом, то узнаете, что
default_to_ruck = false - значит, если при пустой ячейке под автомат, подобрать автомат он будет помещён в ячейку; если true автомат в ячейку помещён не не будет.
-
Идеи пока закончились. Выложи полностью файлы ui_sleep_dialoog и xr_effects из gamedata/scripts
-
Это не тот sr_sleep. Это файл логики спального места. Раз у вас надпись появляется, значит с логикой всё нормально. Дальше надо проверять game_tutorial из папки gamedata/configs/ui и xr_effects из папки gamedata/scripts. В каком то из них сбой. Предполагаю, что в game_tutorial. Он, вероятнее всего, не вызывает функцию сна из xr_effects. Без запятой игра, вероятнее всего, вылетела бы.
-
-
-
28 минут назад, Gerbys сказал:local sleep_zones = {
"raz_sleep_1"
"zat_a2_sr_sleep",В функции прямо так и написано?
"raz_sleep_1"
"zat_a2_sr_sleep",Должна быть запятая
"raz_sleep_1",
"zat_a2_sr_sleep", -
5 минут назад, Gerbys сказал:Я пользуюсь Level эдитором
Тогда покажи, как выглядит секция зоны сна. В алл.спавн или в эдиторе.
-
2 минуты назад, Gerbys сказал:А по функции у меня вот так, и всё равно не спит:
Проверь, правильно ли прописана зона raz_sleep_1 в алл.спавн.
-
1 час назад, Gerbys сказал:Ещё вопрос. Необходимо сделать сквад враждебным после получения определённого инфопоршня. Однако через условия в relationship в настройках сквада этого сделать не получается..
Как - то так.
on_info = {+zat_b103_merc_fight} %=set_squad_goodwill(zat_b103_lost_merc_squad1:enemy)%
relationship кондлист не поддерживает.
1 час назад, Gerbys сказал:Всё сделал по инструкции, есть надпись "Спать" в этом месте в игре, но при нажатии ничего не происходит
Видимо, не все. Функция засыпания.
Спойлерfunction sleep(actor, npc)
local sleep_zones = {
"zat_a2_sr_sleep",
"jup_a6_sr_sleep",
"pri_a16_sr_sleep",
"actor_surge_hide_2"
}for k,v in pairs(sleep_zones) do
if utils.npc_in_zone(db.actor, db.zone_by_name[v]) then
ui_sleep_dialog.sleep()
give_info("sleep_active")
end
endend
- 1
-
9 часов назад, detoxe сказал:Создать предмет - рюкзак ( на основе чего лучше сделать, пока не знаю)
Если не редактировать движок, то есть следующие возможности влиять на грузоподъемность ГГ.
1. Бустер - энергетик. Выпили его, грузоподъемность повысилась. Для рюкзака в принципе подходит. Время действия ограничено.
2. Костюм. У костюма есть параметр, влияющий на переносимый вес. Тут можно сделать примерно так. Использовали вы свой рюкзак. Прошла подмена бронекостюма через скрипт на похожий костюм с повышенной грузоподъемностью. Будут сложности с переносом апгрейдов с костюма на костюм.
3. Артефакт, влияющий на вес. Рюкзак, который можно поставить в слот. Зато никаких дополнительных проблем.
Выберите один из вариантов и пробуйте.
-
5 часов назад, Крим сказал:Мне нужно, чтобы группа нпс, бандитов например, не трогала нпс другой группировки - сталкер, например?
Можно сделать, как в СГМ. Там даже три группировки бандитов. Просто бандиты из оригинала - враги сталкерам, нейтралы к игроку. bandit_enemy - враги ГГ и сталкерам. bandit_alies - нейтралы к сталкерам и ГГ. Сделайте вашей группе отдельную группировку и пропишите нейтралитет.
-
34 минуты назад, Крим сказал:Как убрать начальные заставки AMD, ATI, GSC?
Заставки прописаны в intro_logo в game_tutorials. Они ниоткуда из скриптов не вызываются. Значит, вызов движковый.
Можно попробовать закоментировать содержимое intro_logo. Или попробовать прописать свое. Но тут нужна аккуратность. Чтобы избежать вылетов.
[CoP] Модострой: вопросница
в Уроки, вопросы и советы по созданию модов
Опубликовано
Добрый день. Возник вопрос. Есть функция
function killed_by_actor(actor, npc)
local t = db.storage[npc:id()].death
local killed_by_actor = t ~= nil and t.killer == actor:id()
printf("_bp: killed_by_actor: %s", if_then_else(killed_by_actor, "true", "false"))
return killed_by_actor
end
В СГМ есть бомбы с дистанционным подрывом. Я сделал похожие бомбы в чистой игре. Они отлично работают. Но в зачет не идут. Как доработать функцию, чтобы она срабатывала на бомбу?
Бомба. У бомбы есть СТОРИ-ИД.
[remote_explosive_bomb_1]:explosive_grenade
$spawn = "devices\remote_explosive_bomb_1"
story_id = remote_explosive_bomb_1
visual = dynamics\devices\dev_bomb_c4\bomb_c4.ogf
explode_particles = explosions\explosion_barrel
blast = 6.5
blast_r = 15.0
frags = 50
frags_r = 25.0
frag_hit = 1.5