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

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


Halford

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

 

 

а в характере у него какая группировка?

В том-то и дело, что когда я спавню через  all.spawn, я указываю группировку (например, yan_zombied_veteran). А как сие скриптом прикрутить?

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

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


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

 

 

можно использовать для спавна секции из файла creatures\spawn_sections.ltx

Точно так, уже и сам допер :). Все вышло, как надо.

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

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


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

 

 

Хотя бы реакцию на звук пролетающей пули/топот гг, если сзади подбежать. И зрение/дальность обнаружения игрока совсем по другому работает, если правильно настроить конфиги

И не только. Даже сами звуки (комменты) много на что влияют.

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

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


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

Камрады, прошу помощи.

Спавню полтергейста.

Секция спавна:

[6380]



; cse_abstract properties
section_name = m_poltergeist_strong_flame
name = zaton_poltergeist_09
position = 22.802154541016, 11.935946464539, -382.63479614258
direction = 0, 0, 0
id = 65535
version = 118
script_version = 6
spawn_id = 5454

; cse_alife_object properties
game_vertex_id = 3683
distance = 0
level_vertex_id = 990472
object_flags = 0xffffffbf
custom_data = <<END
[smart_terrains]
none = true

[logic]
cfg = scripts\logic\zaton\poltergeist9.ltx
END

; cse_visual properties
visual_name = monsters\poltergeist\poltergeist

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

; cse_alife_monster_abstract properties
base_out_restrictors = zaton_polter_flame_no_out

 

 

; cse_ph_skeleton properties

; cse_alife_monster_base properties

; se_monster properties
upd:health = 1
upd:timestamp = 0
upd:creature_flags = 0
upd:position = 22.802154541016, 11.935946464539, -382.63479614258
upd:o_torso = 0,0,0
upd:g_squad = 0
upd:g_group = 0

 

 

Логика

[logic]
active = mob_walker

[mob_walker]
path_walk = zaton_polter9_walk

 

 

Путь

[zaton_polter9_walk]
points = p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10
p0:name = wp00
p0:position = 22.802154541016,11.935946464539,-382.63479614258
p0:game_vertex_id = 3683
p0:level_vertex_id = 990472
p0:links = p1(1)

p1:name = wp01
p1:position = 17.889888763428,11.416372299194,-378.27621459961
p1:game_vertex_id = 3683
p1:level_vertex_id = 980597
p1:links = p2(1)

p2:name = wp02
p2:position = 11.144721031189,10.823378562927,-375.94729614258
p2:game_vertex_id = 3678
p2:level_vertex_id = 966331
p2:links = p3(1)

p3:name = wp03
p3:position = 5.4176321029663,10.271119117737,-379.6369934082
p3:game_vertex_id = 3678
p3:level_vertex_id = 954769
p3:links = p4(1)

p4:name = wp04
p4:position = -0.38351851701736,10.072697639465,-388.4260559082
p4:game_vertex_id = 3678
p4:level_vertex_id = 942063
p4:links = p5(1)

p5:name = wp05
p5:position = -3.2485153675079,10.374574661255,-398.72760009766
p5:game_vertex_id = 3678
p5:level_vertex_id = 936493
p5:links = p6(1)

p6:name = wp06
p6:position = 2.3162746429443,12.313020706177,-409.98434448242
p6:game_vertex_id = 3678
p6:level_vertex_id = 947578
p6:links = p7(1)
 

p7:name = wp07
p7:position = 12.747953414917,13.685386657715,-412.78851318359
p7:game_vertex_id = 3678
p7:level_vertex_id = 969065
p7:links = p8(1)

p8:name = wp08
p8:position = 21.340915679932,13.940279006958,-407.92694091797
p8:game_vertex_id = 3683
p8:level_vertex_id = 986248
p8:links = p9(1)

p9:name = wp09
p9:position = 27.657661437988,13.431468963623,-400.20962524414
p9:game_vertex_id = 3683
p9:level_vertex_id = 1000455
p9:links = p10(1)

p10:name = wp10
p10:position = 26.807851791382,12.815635681152,-389.74807739258
p10:game_vertex_id = 3683
p10:level_vertex_id = 997594
p10:links = p0(1)

 

 


Полтер спавнится и летает по кругу, как в ЗП, в аномалии Цирк.

 

Но когда я пытаюсь его отреспить - вылет по патрульному пути. Вопрос: почему (координаты и вертексы идентичны)?

Код респавна:

local obj = alife():create("m_poltergeist_strong_flame",vector():set(22.802154541016,11.935946464539,-382.63479614258),990472,3683)
local params=amk.read_monster_params(obj)
params.custom="[logic]\ncfg = scripts\\logic\\zaton\\poltergeist9.ltx"
amk.write_monster_params(params,obj)

 

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

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

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


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

 

 

Что ты пытаешся его?.. От...чего?

Респавнить. То есть убиваю полтера и респавню нового по тем же координатам.

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

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


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

 

 

ну, показывай свой респавнер тогда. И "гулаг" заодно. И лог вылета не помешал бы...

Так я в посте #15458 все коды расписал. Полтер ни под каким гулагом не находится. А в логе все стандартно: any vertex patrol бла-бла-бла.

 

У меня уйма зверья респавнится таким макаром после их убийства, и все нормально. А с этим - непонятный затык.

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

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


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

 

 

Я бы спавнил прямо секцию из all.spawn. Для этого в секции полтергейста я бы добавил после END метку секции, например так:

Я думал об этом, но если таким макаром кучу зверья респавнить, кучу стори_ид надо создавать.

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

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


Ссылка на сообщение
я хоть и не работаю на ТЧ, но респавнер я бы сделал немного по другому.

Я, сделав по твоему, почему-то словил вылет.

 

FATAL ERROR

 

[error]Expression : fatal error

[error]Function : CScriptEngine::lua_error

[error]File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp

[error]Line : 73

[error]Description :

[error]Arguments : LUA error: ...l.k.e.r\gamedata\scripts\uzi_monsters_respawn.script:9131: attempt to call global 'spawn_ids_object' (a nil value)

 

stack trace:

 

 

 

ругань идет на строчку в скрипте:

 

spawn_ids_object("zaton_poltergeist_09")

 

Сама функция записана ниже в файле скрипта, если что.

 

upd: все заработало, не туда вставил функцию респавна. Спасибо за совет.

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

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

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


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

Сталкеры, нужна помощь.

Спавню скриптом предмет в рюкзак:

function spawn_card()


local obj = alife():object("pred_rukzak")
if obj then
alife():create( "access_card", vector(), 0, 0, obj.id )
end
end

 

 

Предмет спавнится, но если сохраниться, то состояние рюкзака не сохраняется и предмет после загрузки сейва пропадает.

 

Пробовал делать так:

function spawn_card()
local obj = alife():object("pred_rukzak")
if obj then
alife():create( "access_card", vector(), 0, 0, obj.id )
local params = amk.get_invbox_data(obj)
params.custom = "[logic]\ncfg = scripts\\treasure_inventory_box.ltx"
amk.set_invbox_data(params, obj)
end
end

 

 

Но предмет все равно пропадает. Я что-то не так делаю, или что?

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

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

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


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

 

 

вот соляночная функция для спауна вещей кому угодно:

Кому угодно - это очень хорошо. Но мой случай - inventory_box. Для ящика будет работать?

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

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


Ссылка на сообщение
AndrewMor, вот соляночная функция для спауна вещей кому угодно:

Чего-то не догоняю, как в твоей функции npc заменить на inventory_box, точнее, как прикрутить мою строчку

 

local obj = alife():object("pred_rukzak")

 

к Соляночной функции?

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

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

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


Ссылка на сообщение
Для спавна во что-нибудь надо id этого самого чегo-нибудь.дальше - alife():create( "чегонадо", vector(), 0, 0, id )

Да так и делаю. Только при сейв/лоад содержимое пропадает. Спавню вот так:

function spawn_card()

local obj = alife():object("pred_rukzak")

if obj then

alife():create( "access_card", vector(), 0, 0, obj.id )

end

end

 

 

 

 

 

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

А это вот как сделать?

Dennis_Chikin, и вдогонку вопрос: если спавн в тайник происходит на текущей локации, тайник всегда в онлайне, даже если далеко от ГГ, или нет?

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

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

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


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

 

 

ну и где-то как-то потом выполнить обратный процесс

А если сразу сей процесс выполнить? Или надо какое-то время конкретное подождать?

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

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


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

 

 

А вообще можно - самое простое - добавить ящику custom_data в секцию, в файле которой прописать в секции spawn нужные предметы.

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

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

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


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

Сама идея понятна, но как енто воплотить  - для меня темный лес, надеюсь, пока. А почитать об ентом возможно где-нибудь, желательно с подробным разбором, а лучше на примере? Возможно, многим было бы интересно.

 

П.С. А ведь предметы в игровых тайниках тоже спавнятся по факту выдачи инфы о тайнике, каким образом инфа о них сохраняется и не пропадает при сейв/лоаде? Хотя, это наверно не здесь пишу.

 

Оффтоп: Pascal и Delphi  сам постигал, но с Lua - беда. Неудобен факт: чтоб какую-нибудь мысль проверить, надо кучу всего городить и Сталкер полдня мучить. Компилятор бы какой иметь под рукой...

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

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

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


Ссылка на сообщение
ой, точно, забыл. Привык к анонимным функциям и даже не посмотрел.

Сделал так, как ты написал.

function spawn_card()

local obj = alife():object("pred_inventory_box")

if obj then

spawn_item_in_inv("access_card", obj)

end

end

 

function spawn_item_in_inv(spawn_item,npc)

if not npc then

npc = db.actor

end

local item = alife():create(spawn_item,

npc:position(),

npc:level_vertex_id(),

npc:game_vertex_id(),

npc:id())

 

if npc:id() ~= db.actor:id() then

-- Фикс пропадания доспавненного предмета при сейв/лоаде

level.client_spawn_manager():add(item.id, -1, fix_spawn_item_in_inv, npc) -- Калбек на выход item в онлайн

end

 

return item

end

 

function fix_spawn_item_in_inv(npc, id, item)

npc:transfer_item(item, npc)

end

 

 

При вызове функции вылет:

Expression : fatal error

Function : CScriptEngine::lua_error

File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp

Line : 73

Description :

Arguments : LUA error: No such operator defined

 

 

 

Чего я сделал не так? И скрипт этот я в Закоулках правды увидал.

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

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

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


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

 

 

ты в spawn_item_in_inv() серверный объект передал, как минимум. А эта функция ожидает клиентский объект в качестве npc. Вот так вот делай, тогда уж:

Спасибо, попробую. Через alife():create() поначалу делал, так не сохраняются вещи после s/l.

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

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


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

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

 

upd: насчет хита - вспомнил :) on_hit = hit

 

А on_death = death будет работать?

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

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

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


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

Сталкеры, а можно ли прописать вертолету не story_id-ы НПС, а скажем, конкретную группировку? Чтобы он не конкретного НПС обстреливал, а искал врагов в определенном радиусе?

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

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


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

 

 

Советую глянуть в сторону AI вертолетов от Kirag-а, там есть подобное...

Я и сам так подумал, а спросил на всякий случай.

  • Согласен 1

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

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


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

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