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

[SoC] Ковыряемся в файлах


Halford

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

Прошу помощи. На Агро Крот уходит в оффлайн по выдаче определенного поршня. Я условие закомментировал, теперь он постоянно в онлайне. Но мне хочется, чтобы он уходил на Свалку. Вот секция логики:

[walker@well3]


path_walk = agr_krot_well_walk
path_look = agr_krot_well_look
meet = meet@well2
on_info = {!actor_enemy +agr_find_gunslinger_cache_found} walker@well4
combat_ignore_cond = {!actor_enemy !fighting_actor}
danger = danger_condition

[walker@well4]
path_walk = gar_krot_well_walk
path_look = gar_krot_well_look
meet = meet@well2
combat_ignore_cond = {!actor_enemy !fighting_actor}
danger = danger_condition

 

Но проблема в том, что он не хочет идти на Свалку, а прется севернее фабрики на Агро и там остается. Хотя координаты указаны правильные. Но если указать какую-нибудь точку на Агро - он туда идет без проблем. Почему так?

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

Вопрос: если в секции НПС указан смарт

[smart_terrain]

none = true

 

можно ли его приписать к какому-нибудь другому смарту при выдаче инфорпоршня?

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

 

 

А почему сам не попробуешь сделать примерно так:

То есть, если сделать так:

[smart_terrains]

none = {-agr_find_gunslinger_cache_found}

gar_angar = {+agr_find_gunslinger_cache_found}

 

то искомый перс пойдет в другой гулаг? А как мне его на конкретную точку посадить?

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

В смарте есть гулаг. У гулага есть конфиг. В конфиге есть работы. У работы есть путь. Вот в первую точку этого пути непись и бежит.

В том-то и дело, что мне не хочется его под смарт пихать. Хотелось его с одной локи на другую по поршню пересадить.

 

 

Ну, можно извратиться с CALifeSmartTerrainTask() - писал уже. Но это - dirty hack.

Причем логику придется прописывать нетривиально, а все переключения всего делать отдельным скриптом. dc

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

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

Тогда пояните, кто-нибудь (если вопросы нубские - сильно не бейте):

1. есть смарт, есть гулаг и в нем свободная работа. Если к этому смарту ни один НПС не приписан - работа будет свободна, или другой НПС на нее придет?

 

Идея такая: заспавнить смарт-террейн, в гулаге прописать одного волкера, а в секции [smart_terrains] написать:

[smart_terrains]

none = {-agr_find_gunslinger_cache_found}

gar_angar = {+agr_find_gunslinger_cache_found}

 

Так вот этот перс до выдачи поршня будет под СВОЕЙ логикой, прописанной в конфиге, а по выдаче поршня пойдет на работу в указанный гулаг, или нет? Или на эту работу придет любой другой НПС?

 

В gar_angar для работы, зарезервированной под непися, прописать предикат. dc

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

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

В gar_angar для работы, зарезервированной под непися, прописать предикат. dc

Что есть предикат? Это в имя_локи.скрипт надо прописывать? И как? Если можно, примерчик..

 

Хрестоматийный пример из gulag_escape.script:

if type == "esc_lager" then

...

-- Волк, собственной персоной.

t = { section = "logic@esc_lager_volk",

idle = 0, prior = 16, state = {0,1},

in_rest = "", out_rest = "esc_lager_guard_kill_zone",

predicate = function(obj_info) return obj_info.profile_name == "esc_wolf" end }

 

Кроме него эту работу ни кто не займет. dc

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

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

По перемещению Крота на Свалку. Вроде все сделал, как советовали. Но на Свалку Крот идти не хочет, ошивается в комплексе. Почему?

 

Секция спавна Крота:

; cse_abstract properties


section_name = stalker
name = agr_krot
position = 36.3475799560547, 2.50003337860107, -14.4879312515259
direction = -3.63589037988277e-007, 0, 0
id = 65535
version = 118
script_version = 6

; cse_alife_trader_abstract properties
money = 5000
character_profile = agr_krot

; cse_alife_object properties
game_vertex_id = 663
distance = 9.0999994
level_vertex_id = 274908
object_flags = 0xfffffeff
custom_data = <<END
;[spawner]
;cond = {-agr_find_gunslinger_cache_found}

[logic]
cfg = scripts\agr\agr_krot.ltx

[smart_terrains]
none = {-freeplay}
gar_ost = {+freeplay}

[known_info]
agr_krot_secret_info
END
story_id = 302

; cse_visual properties
visual_name = actors\neytral\stalker_neytral_rukzak_4

; cse_alife_creature_abstract properties
g_team = 0
g_squad = 3
g_group = 1
health = 2
dynamic_out_restrictions =
dynamic_in_restrictions =

; cse_alife_monster_abstract properties
equipment_preferences = 0, 1, 0, 2, 2
main_weapon_preferences = 2, 2, 0, 1

; cse_ph_skeleton properties

; se_stalker properties
upd:health = 2
upd:timestamp = 0
upd:creature_flags = 0
upd:position = 36.3475799560547, 2.50003337860107, -14.4879312515259
upd:g_squad = 3
upd:g_group = 1

; cse_alife_human_stalker properties
upd:start_dialog =


 

 

Его логика из чистой игры:

[logic]
active = walker@hold
combat_ignore = combat_ignore
on_death = death

[walker@hold]
path_walk = agr_krot_hold_fake_walk
path_look = agr_krot_hold_fake_look
combat_ignore_cond = {!actor_enemy !fighting_actor}
meet = meet@hold
on_info = {!actor_enemy +agr_krot_skirmish_start} walker@combat
on_info2 = {!actor_enemy +agr_help_stalkers_done} walker@hold2
danger = danger_condition

[walker@hold2]
path_walk = agr_krot_hold_fake_walk
path_look = agr_krot_hold_fake_look
combat_ignore_cond = {!actor_enemy !fighting_actor}
meet = meet@hold
on_info = {!actor_enemy +agr_krot_skirmish_start} walker@combat
on_timer = 30000 |{!actor_enemy} %+agr_krot_skirmish_start%
danger = danger_condition

[meet@hold]
meet_state = 0 | hide_na@speech1
meet_state_wpn = 0 | hide_na@speech1
victim = actor
victim_wpn = actor
use = true
use_wpn = true
meet_dialog = agr_krot_help

[walker@combat]
path_walk = agr_krot_hold_fake_walk
path_look = agr_krot_hold_fake_look
on_info = {!actor_enemy =agr_factory_hold_inactive} %+agr_help_krot_done% walker@wait_after_hold
;on_info = {+agr_help_krot_done +agr_help_stalkers_done} walker@wait_after_hold, {+agr_help_krot_done +agr_help_stalkers_assault_dead} walker@wait_after_hold
meet = meet@no_use
;danger = {+agr_help_krot_done +agr_help_stalkers_assault_dead} danger_condition@combat
danger = danger_condition
combat_ignore_cond = {!actor_enemy !fighting_actor}
on_actor_dist_le = 8 | {!actor_enemy} remark@hold2

[remark@hold2]
anim = guard
snd = agr_krot_fear
target = actor
on_info = {=actor_enemy} walker@combat_2
on_signal = sound_end | walker@combat_2
combat_ignore_cond = {!actor_enemy !fighting_actor}
danger = danger_condition

[walker@combat_2]
path_walk = agr_krot_hold_fake_walk
path_look = agr_krot_hold_fake_look_2
on_info = {=agr_factory_hold_inactive !actor_enemy} %+agr_help_krot_done% walker@wait_after_hold
meet = meet@no_use
danger = danger_condition
combat_ignore_cond = {!actor_enemy !fighting_actor}

[walker@wait_after_hold]
path_walk = agr_krot_hold_walk
path_look = agr_krot_hold_look
meet = no_meet
combat_ignore_cond = {!actor_enemy !fighting_actor}
on_actor_dist_le_nvis = 5 |{!actor_enemy} %+agr_krot_met% remark@thank
on_info = {=actor_enemy -agr_factory_spawn_spetsnaz} %+agr_factory_spawn_spetsnaz%
danger = danger_condition

[meet@wait_after_hold]
meet_state = 10 | hello_wpn@talk_hello
meet_state_wpn = 10 | hello_wpn@talk_hello
victim = 10 | actor
victim_wpn = 10 | actor
use = false
use_wpn = false

[remark@thank]
snd = speech
on_signal = sound_end | %+agr_krot_go_to_well +agr_factory_spawn_spetsnaz% walker@go_to_well
anim = guard
combat_ignore_cond = {!actor_enemy !fighting_actor}
target = actor
danger = danger_condition
on_info = {=actor_enemy} walker@wait_after_hold
meet = no_meet

[walker@go_to_well]
path_walk = agr_krot_to_well_walk
def_state_moving1 = assault
def_state_moving2 = assault
def_state_moving3 = assault
on_signal = well | {!actor_enemy} walker@well
danger = danger_condition
combat_ignore_cond = {!actor_enemy !fighting_actor}
meet = no_meet

[walker@well]
path_walk = agr_krot_well_walk
path_look = agr_krot_well_look
meet = no_meet
on_actor_dist_le = 5 |{!actor_enemy} remark@thanks_2 ;%+agr_find_gunslinger_cache_start%
combat_ignore_cond = {!actor_enemy !fighting_actor}
danger = danger_condition

[remark@thanks_2]
anim = guard
snd = agr_krot_thanks_2
target = actor
on_signal = sound_end | walker@well2
danger = danger_condition
meet = no_meet
combat_ignore_cond = always
on_info = {=actor_enemy} walker@wait_after_hold

[walker@well2]
path_walk = agr_krot_well_walk
path_look = agr_krot_well_look
meet = meet@well
on_info = {!actor_enemy +agr_find_gunslinger_cache_start} walker@well3
combat_ignore_cond = {!actor_enemy !fighting_actor}
danger = danger_condition

[walker@well3]
path_walk = agr_krot_well_walk
path_look = agr_krot_well_look
meet = meet@well2
combat_ignore_cond = {!actor_enemy !fighting_actor}
danger = danger_condition

[meet@well]
meet_state = 30|hello@wait|15|wait@wait|5|wait
meet_state_wpn = 30|hello@wait|15|wait@wait|5|wait
victim = 30 | actor
victim_wpn = 30 | actor
use = true
use_wpn = true
meet_dialog = agr_factory_krot_start

[meet@well2]
meet_state = 30|hello@wait|15|wait@wait|5|wait
meet_state_wpn = 30|hello@wait|15|wait@wait|5|wait
victim = 30 | actor
victim_wpn = 30 | actor
use = true
use_wpn = true

[meet@no_use]
use = false
use_wpn = false
abuse = false

[death]
on_info = %+agr_krot_dead +sar2_death_19%

[known_info]
agr_krot_secret_info

[danger_condition]
ignore_distance = 0

[danger_condition@combat]
danger_expiration_time = 9000
danger_inertion_time = 9000
ignore_distance_corpse = 0

 

 


Новый смарт на Свалке:

; cse_abstract properties
section_name = smart_terrain
name = gar_ost
position = 18.255748748779,0.4110446870327,-16.711252212524
direction = 0, 0, 0
id = 65535
version = 118
script_version = 6

; cse_alife_object properties
game_vertex_id = 293
level_vertex_id = 191002
object_flags = 0xffffff3e
custom_data = <<END
[smart_terrain]
type = gar_ost
capacity = 1
cond = {+freeplay}
END

; cse_shape properties
shapes = 1
shape_0:type = sphere
shape_0:offset = 0,0,0
shape_0:radius = 1

; cse_alife_space_restrictor properties
restrictor_type = 3

; se_smart_terrain properties


 

 

Секции в gulag_garbage.script:

if type == "gar_ost" then

t = { section = "logic@gar_ost_post1",
idle = 0,
prior = 10, state = {0},
in_rest = "", out_rest = "",
predicate = function(obj_info)
return obj_info.profile_name == "agr_krot"
end
}
table.insert(sj, t)
end

if type == "gar_ost" then
return function(gulag)
return 0
end
end

if gulag_type == "gar_ost" then
return npc_community == "stalker"
end

 

 


Секции в gulag_garbage.ltx:

[logic@gar_ost_post1]
active = walker@gar_ost_post1

[walker@gar_ost_post1]
path_walk = post1_walk
path_look = post1_look

 

 

waypoint'ы в way_l02_garbage.ltx:

[gar_ost_post1_walk]
points = p0
p0:name = wp00
p0:flags = 0x1
p0:position = 18.255748748779,0.4110446870327,-16.711252212524
p0:game_vertex_id = 293
p0:level_vertex_id = 191002

[gar_ost_post1_look]
points = p0
p0:name = wp00|a=sit_ass
p0:flags = 0x1
p0:position = 11.646841049194,0.29557731747627,-12.039144515991
p0:game_vertex_id = 293
p0:level_vertex_id = 185183

 

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

[smart_terrain]

type = gar_ost

capacity = 1

cond = {+freeplay}

 

Ну и где этот самый freeplay выдается ?

Этот самый freeplay выдается вручную, для проверки.

 

 

путь напиши, и проверь существующие.

Написать - в каком смысле? А существующие пути вроде правильны. Или их надо в way_l03_agroprom.ltx прописывать?

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

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

 

 

Зачем оно вообще в смарте ?

Крот должен пойти под этот смарт после выдачи поршня. До его выдачи он должен быть под своей сюжетной логикой.

 

 

 

Если убрать все переключения отовсюду, крота сразу прописать эксклюзивом в смарт, он с начала игры в него пойдет ?

Не проверял, поэтому не знаю.

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

Всем привет!)) Подскажите, если не сложно, что нужно прописать в логику заспавненному через скрипт НПС, который принадлежит к враждебной ГГ группировке (например, бандиты), чтобы в дальнейшем можно было вступить с ним диалог (т.е. чтобы не кидался на ГГ раньше времени).

Прописывала "combat_ignore_cond = always", похоже это не то, что нужно((

Пропиши "combat_ignore_cond = {-имя_твоего_поршня =fighting_actor} и с врагами можно говорить, если конечно, у них прописан хоть один диалог. А когда надо будет, чтобы они стреляли, выдай этот твой поршень - и все.

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

Кто может подсказать, в чем дело.
Ставлю метку на рестриктор через нажатие кнопки в главном меню, все прекрасно работает, метка ставится.


function test()
   local obj = alife():object( "generators_mess_doc_2" )
   if obj then
        level.map_add_object_spot_ser(obj.id, "find_item_location", "Неизвестный КПК")
  end
end


 
Пытаюсь сделать то же самое, вызвав функцию в xr_effects из рестриктора:

function end_peleng()
 local obj = alife():object( "generators_mess_doc_2" )
 if obj then
   level.map_add_object_spot_ser(obj.id, "find_item_location", "Неизвестный КПК")
 end
 amk.g_start_timer("pel",0, 0, 3)
end


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

Вывести в лог что-нибудь сразу после if obj then
dc

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

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

Подскажите, кто знает, каким образом можно отловить момент обыска конкретного трупа? Если в биндере - то в какой функции?

xr_motivator/bind_monster: function motivator_binder:use_callback( obj, who )
dc

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

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

Всем привет, прошу помощи.

Почему работает такая логика переключателя:

[logic]


active = ph_button@active


[ph_button@active]
on_info = {+warlab_antenna_1_off} ph_idle@nil
anim = lab_primary_switcher_idle
tooltip = tips_warlab_press
on_press = ph_button@deactivate %=yan_gluk%

[ph_button@deactivate]
anim = lab_primary_switcher_off
on_timer = 500 | ph_idle@nil %+warlab_antenna_1_off =play_snd_from_obj(908:ambient\switch_1) %

[ph_idle@nil]

 

 

и не работает вот такая:

[logic]
active = ph_button@active

[ph_button@active]
on_info = {+generators_message_doctor_2} ph_button@activate

[ph_button@activate]
on_info = {+warlab_antenna_1_off} ph_idle@nil
anim = lab_primary_switcher_idle
tooltip = tips_warlab_press
on_press = ph_button@deactivate %=yan_gluk%
 

[ph_button@deactivate]
anim = lab_primary_switcher_off
on_timer = 500 | ph_idle@nil %+warlab_antenna_1_off =play_snd_from_obj(908:ambient\switch_1) %

[ph_idle@nil]

 

 

хотя поршень "generators_message_doctor_2" выдается совершенно точно? В чем тут дело?

 

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


 

 

Могу ошибаться, но чтоб объект в игре разваливался он должен быть на классе P_DSTRBL. А для "physic_object" прописан класс O_PHYS_S(у меня по крайней мере). Визуала такого "physics\decor\stol_sher" у меня нет, не могу потестить. Возьми другой для пробы из physics\stol.

Такая же байда и у меня. Стол, стул, кровать разваливаются. Для всяких кружек, тарелок, ложек еще пишу строку "fixed_bones = link", но для стола, стула, кровати такой способ не катит - вылет с руганью на wrong fixed bones, видать, без костей модели.

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

 

 

А как именно не работает ? Переключатель не становится активным ? Или что там у тебя происходит ?

Именно, не активен. И подсказка не появляется. Но я уже разобрался.

 

В секции

 

[ph_button@active]
on_info = {+generators_message_doctor_2} ph_button@activate

надо было дописать анимку и все заработало, как надо.


А кто пояснит, что такое в all.spawn секция с названием "breakable_object"? Есть еще "climable_object", но это вроде невидимый объект, чтобы ГГ мог забираться по вертикальным лестницам.

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

Вот еще вопрос назрел. В АМК были так называемые рюкзаки-схроны. Их можно было купить и в нужном месте выбросить, они превращались в обычный рюкзак, который невозможно обратно подобрать.

 

Собственно, вопрос: возможно ли их подбирать обратно/уничтожать совсем? Смысл: я эту фишку вытащил, и на нее метку повесил. Теперь рюкзак-схрон имеет метку, по которой его легко найти. Но идея состоит в следующем: если он мне в этом месте больше не нужен, как его обратно подобрать (или чтоб он вообще пропал, типа, хочешь в другом месте - покупай новый)?

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

@AndreySol, вот функция спавна такого рюкзака:

function use_rukzak(pid)


local obj
local pos = db.actor:position()
obj = alife():create("m_inventory_box", pos, db.actor:level_vertex_id(), db.actor:game_vertex_id())
   if (obj) then
     local t = amk.get_invbox_data(obj)
     t.custom = "[logic]\ncfg = scripts\\treasure_inventory_box.ltx"
     amk.set_invbox_data(t, obj)
     level.map_add_object_spot_ser(obj.id, "my_treasure", "Мой тайник")
  end
end

 

 

А как его подобрать/уничтожить при наведении курсора? Там же выводится "Обыскать тайник"? А если мне нужно именно обыскать, а не убрать его совсем?


А вот еще вопросец: можно ли при обыске конкретного тайника выдавать подсказку не "Обыскать тайник", а при обыске пня, например, выводить "Обшарить пень", а при обыске рюкзака - "Обыскать рюкзак"? Аналогично при обыске сейфа и т.д. - выводить свое сообщение?

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

@AndrewMor,

в scripts\\treasure_inventory_box.ltx меняешь tips на нужный текст

Это и ежу понятно. Я ж говорил, чтобы для разных тайников свою подсказку выдавать. Для пней - свою, для сейфов - свою. Ну и так далее. А если tips сменить - у всех тайников она опять же одинаковая будет.

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

Подскажите, кто знает, как при заходе на локацию подсчитать количество находящихся в онлайне зверей, желательно по видам. Ну к примеру, сколько гуляет плотей. Или кабанов.
 
С чего начать-то надо? Вызывать функцию подсчета надо, я так понимаю, из "function actor_binder:net_spawn(data)". А дальше с чего начинать? Сам принцип хотя бы объясните.

В момент захода на локацию онлайновых зверей там нет. Вообще. Появляются через какое-то время после actor_binder:net_spawn(), в зависимости от условий. То есть, тебе надо явно что-то другое. dc

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

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

dc, я наверно неправильно выразился. Мне нужно узнать, сколько на данной локации живых (не трупов), скажем, плотей. Заспавнено, причем неважно, скриптом или через all.spawn. Или сие в момент захода невозможно узнать в принципе?


Или, если на то пошло, сколько тех же плотей находится под гулагами на данной локации?

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

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение

Ну хорошо. И все же я так не въехал, как определить принадлежность монстра к конкретной локации. По вертексам?

 

gvid = obj.m_game_vertex_id
if gg:valid_vertex_id( gvid ) then  map = gg:vertex( gvid ):level_id()

 

dc

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

Сталкер - наше всё!

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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