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

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


Halford

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

@"StreloK", распаковываешь all.spawn и меняешь координаты, затем запаковываешь. :ny_use_search:

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


Ссылка на сообщение
Starter, в папке ambient их найдешь... хотя это немного другое! Глянь в nature! :ny_dry:

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


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

FLIKER, с наступающим Новым Годом! Вот код из скрипта amk_mod.script:

-- БТР на блокпосту
function spawn_military_btr()
    spawn_military_tech_pack( alife():create("vehicle_btr",vector():set(-168.11, -29.71, -303.21),81808,38 ) ,"vehicle_btr")
    spawn_military_tech_pack( alife():create("vehicle_btr",vector():set(-237.85, -26.23, -378.81),17147,14 ) ,"vehicle_btr")
    spawn_military_tech_pack( alife():create("helicopter",vector():set(-150.0,-40.0,-620.0),128298,11 ) ,"helicopter")
end

function spawn_military_tech_pack(obj, spawn_item)    
    local packet = net_packet()
    obj:STATE_Write(packet)

    -- свойства cse_alife_object
    local game_vertex_id = packet:r_u16()
    local cse_alife_object__unk1_f32 = packet:r_float()
    local cse_alife_object__unk2_s32 = packet:r_s32()
    local level_vertex_id = packet:r_s32()
    local object_flags = packet:r_s32()
    local custom_data = packet:r_stringZ()
    local story_id = packet:r_s32()
    local cse_alife_object__unk3_s32 = packet:r_s32()

    -- свойства cse_visual
    local model_visual = packet:r_stringZ()
    local cse_visual__unk1_u8 = packet:r_u8()
    local motion_name
    if spawn_item == "helicopter" then
        -- свойства cse_motion
        motion_name = packet:r_stringZ()
    end

    -- свойства cse_ph_skeleton
    local skeleton_name = packet:r_stringZ()
    local cse_ph_skeleton__unk1_u8 = packet:r_u8()
    local cse_ph_skeleton__unk2_u16 = packet:r_u16()
    local health 
    local cse_alife_helicopter__unk1_sz 
    local engine_sound 
        
    if spawn_item == "helicopter" then
        -- свойства cse_alife_helicopter
        cse_alife_helicopter__unk1_sz = packet:r_stringZ()
        engine_sound = packet:r_stringZ()
    elseif    spawn_item == "vehicle_btr" then
        health = packet:r_float()
    end
    
    -- теперь заполняем нужные параметры
    -- свойства cse_alife_object
    packet:w_begin(game_vertex_id)
    packet:w_float(cse_alife_object__unk1_f32)
    packet:w_s32(cse_alife_object__unk2_s32)
    packet:w_s32(level_vertex_id)
    object_flags = bit_not(5)    -- ~5 = 0xfffffffa
    packet:w_s32(object_flags)
    if spawn_item == "helicopter" then
        packet:w_stringZ("[logic]\ncfg = scripts\\esc\\esc_blockpost_heli.ltx")
    elseif    spawn_item == "vehicle_btr" then
        packet:w_stringZ("[logic]\ncfg = scripts\\esc\\esc_blockpost_btr.ltx")
    end
    packet:w_s32(-1)
    packet:w_s32(cse_alife_object__unk3_s32)

    -- свойства cse_visual
    packet:w_stringZ(model_visual)
    packet:w_u8(cse_visual__unk1_u8)
    
    if spawn_item == "helicopter" then
        packet:w_stringZ(motion_name)        
    end 
    
    -- свойства cse_ph_skeleton
    skeleton_name = "idle"
    packet:w_stringZ(skeleton_name)
    packet:w_u8(cse_ph_skeleton__unk1_u8)
    packet:w_u16(cse_ph_skeleton__unk2_u16)

    if spawn_item == "helicopter" then
        -- свойства cse_alife_helicopter
        cse_alife_helicopter__unk1_sz = "idle"
        engine_sound = "alexmx\\helicopter"
        packet:w_stringZ(cse_alife_helicopter__unk1_sz)
        packet:w_stringZ(engine_sound)
    elseif  spawn_item == "vehicle_btr" then
        health = 1
        packet:w_float(health)
    end    
    -- считываем скорректированные параметры
    packet:r_seek(0)
    obj:STATE_Read(packet, packet:w_tell())
end

 

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


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

Snork_7171, с наступающим Новым Годом!

1. Тебе нужно либо прописать их в textures.ltx в папке текстур, либо генерировать с помощью SDK .thm файлы для этих текстур;

2. Горят красным поскольку не синхронизированы в SDK;

3. Каким образом?;

Что значит "быстрее находил"? Обычно для моделей конкретные пути прописываются.

4. Возможно подвисание на стадии "Синхронизация..." и при открытии окна торговли этого торговца.

 

5. Для чего дублировать? Добавляешь очень много нового?

6. Вот в теме про арсенал, тутор "как добавить новый ствол в игру"

Изменено пользователем Куфзук

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


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

TRAMP14, привет! Вот смотри:

В диалоге в самом начале поставь прекондишен на отсутствие инфопорции, а в последней фразе поставь эту самую инфопорцию

<dialog id="escape_trader_talk_info">
        <dont_has_info>block_info</dont_has_info>
        <phrase_list>
            <phrase id="0">
            </phrase>
            ...
            <phrase id="1">
            <give_info>block_info</give_info>
            </phrase>
        </phrase_list>
</dialog>

В файле esc_trader.ltx в папке config\scripts, в самом начале, есть вот такое:

; Ждем немного
[mob_trader@new_start_wait]
anim_global = chair_hack_idle
on_timer = 5000| mob_trader@new_start_intro1
can_talk = false
tip_text =

поменяй на вот это:

; Ждем немного
[mob_trader@new_start_wait]
anim_global = chair_hack_idle
on_timer = 5000| mob_trader@new_start_intro4
can_talk = false
tip_text =

 

В файле esc_trader_door.ltx в папке config\scripts есть такая строка

active = ph_door@locked

сделай так

active = ph_door@closed

 

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


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

AKKK1, а зачем так-то куролесить?

Вообще-то в чистом 1004 этот файл выглядит так:

[logic]
active = ph_door@locked

[ph_door@locked]
locked = true
snd_open_start = trader_door_unlock
on_info = {+esc_trader_can_leave} ph_door@closed %=play_snd(device\door_servomotor)%

[ph_door@closed]
closed = true
locked = false
on_use = ph_door@open %-esc_close_door%
snd_open_start = trader_door_open_start
snd_close_start = trader_door_close_start
snd_close_stop = trader_door_close_stop

[ph_door@open]
closed = false
locked = false
on_use = ph_door@closed
on_info = {+esc_close_door} ph_door@closed
snd_open_start = trader_door_open_start
snd_close_start = trader_door_close_start
snd_close_stop = trader_door_close_stop

Вот эта логика ph_door@closed описывает закрытую но не запертую дверь, а эта ph_door@open, дверь в открытом виде, и открытой она останеться до тех пор, пока ГГ не войдет в рестриктор esc_close_door_restrictor.

Ну а вот это ph_door@locked, запирает дверь до прибытия к ГГ инфопоршня esc_trader_can_leave, который в свою очередь выдается после слов Сидора:

Да всё пока. Принесёшь мне флешку, и будем считать, что частично за своё спасение ты расплатился.
;)
Изменено пользователем Куфзук

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


Ссылка на сообщение
@"StreloK", процентов на 90 уверен, что дело в логике или путях. Покажи и то и другое.

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


Ссылка на сообщение
FANAT, к спавну артефактов причастна аномалия к которой относиться данный артефакт. Загляни в файлы zone_ в папке config/misc.

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


Ссылка на сообщение
FANAT, в чистом АМК 1.4.1 в amk_anoms.script нет не единого слова artefact. :russian_ru:

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


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

Ребята, привет!

Сейчас копаюся в all.spawn на предмет не изученых секций логики и увидел, что в файлах alife_ присутствует большое количество "пустых" space_restrictor. Вот например три подряд в файле alife_l08u_brainlab.ltx:

[7345]
; cse_abstract properties
section_name = space_restrictor
name = controller_scream
position = -93.697868347168,21.6993865966797,-31.2365989685059
direction = -0.0381378531455994,-0.00329170795157552,0.0057837157510221

; cse_alife_object properties
game_vertex_id = 1529
distance = 0
level_vertex_id = 365
object_flags = 0xffffff3e

; cse_shape properties
shapes = shape0
shape0:type = box
shape0:axis_x = 12.4542026519775,0,0
shape0:axis_y = 0,2.63979911804199,0
shape0:axis_z = 0,0,2.49696040153503
shape0:offset = 0,0,0

; cse_alife_space_restrictor properties
restrictor_type = 0


[7346]
; cse_abstract properties
section_name = space_restrictor
name = floor_3_space_restrictor
position = -45.2709274291992,11.4312038421631,-12.4295129776001
direction = -9.32646253204439e-006,-0.0001644172007218,2.56123512372142e-005

; cse_alife_object properties
game_vertex_id = 1529
distance = 0
level_vertex_id = 365
object_flags = 0xffffff3e

; cse_shape properties
shapes = shape0
shape0:type = box
shape0:axis_x = 17.1586017608643,0,0
shape0:axis_y = 0,1,0
shape0:axis_z = 0,0,17.1586017608643
shape0:offset = 0,0,0

; cse_alife_space_restrictor properties
restrictor_type = 0


[7347]
; cse_abstract properties
section_name = space_restrictor
name = floor_1_space_restrictor
position = -44.920726776123,-3.99480009078979,-10.3698482513428
direction = -9.32646253204439e-006,-0.0001644172007218,2.56123512372142e-005

; cse_alife_object properties
game_vertex_id = 1529
distance = 0
level_vertex_id = 365
object_flags = 0xffffff3e

; cse_shape properties
shapes = shape0
shape0:type = box
shape0:axis_x = 23.5882110595703,0,0
shape0:axis_y = 0,1,0
shape0:axis_z = 0,0,23.5882110595703
shape0:offset = 0,0,0

; cse_alife_space_restrictor properties
restrictor_type = 0

И таких достаточно много. Для чего они?

Изменено пользователем Куфзук

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


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

Так, так, так! А что за такие ограничения in_rest и out_rest? И как отследить попадание актора в рестриктор не помеченый стори_айди?

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


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

Scarabay, спасибо, конечно! Но миникарта как не менялась от уровня, так и не меняется! :huh: А где ты в ТЧ видел такую штуку-дрюку?

Ладно, не об этом. Все, что я нашел по этому рестриктору floor_3_space_restrictor, так это запись у зомби в all.spawn следующего вида: base_out_restrictors = floor_3_space_restrictor. Вот на всякий случай он весь:

[4567]
; cse_abstract properties
section_name = stalker_zombied
name = x16_zombied_0007
position = -40.9127502441406,11.5656766891479,-18.7846279144287
direction = 3.96806353819557e-005,4.32763913593703e-009,-0.000109061744296923

; cse_alife_trader_abstract properties
money = 5000
character_profile = yan_zombied

; cse_alife_object properties
game_vertex_id = 1530
distance = 69.2999954223633
level_vertex_id = 2714
object_flags = 0xffffffff
custom_data = <<END
[smart_terrains]
none = true

[logic]
active = walker

[walker]
path_walk = x16_zombied_5_walk
sound_idle = state
END

; cse_visual properties
visual_name = actors\stalker_zombi\stalker_zombie2

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

upd:health = 1
upd:timestamp = 0
upd:creature_flags = 0
upd:position = -40.9127502441406,11.5656766891479,-18.7846279144287
upd:o_model = 0
upd:o_torso = 4.32763913593703e-009,3.96806353819557e-005,0
upd:g_team = 0
upd:g_squad = 0
upd:g_group = 0

; cse_alife_monster_abstract properties
base_out_restrictors = floor_3_space_restrictor

upd:next_game_vertex_id = 65535
upd:prev_game_vertex_id = 65535
upd:distance_from_point = 0
upd:distance_to_point = 0

; cse_alife_human_abstract properties
predicate5 = 1,0,2,2,0
predicate4 = 2,2,2,0

; cse_ph_skeleton properties

upd:start_dialog = 

; se_stalker properties

Вообще не понятно, для чего эти пустые рестрикторы. По совету Kiragа поиск в скриптах так же ничего не дал.

Еще обратил внимание, что для костров, те которые в all.spawn, также существует "пустой" рестриктор, вот один для примера:

[584]
; cse_abstract properties
section_name = space_restrictor
name = camp_fire_0001
position = 115.827072143555,-6.96181488037109,9.30737209320068
direction = -2.27373675443232e-013,0,0

; cse_alife_object properties
game_vertex_id = 0
distance = 0
level_vertex_id = 594270
object_flags = 0xffffff3e

; cse_shape properties
shapes = shape0
shape0:type = box
shape0:axis_x = 1.7837952375412,0,0
shape0:axis_y = 0,1.93420171737671,0
shape0:axis_z = 0,0,1.7837952375412
shape0:offset = 0,0,0

; cse_alife_space_restrictor properties
restrictor_type = 2

И если можно ответе на мой предыдущий вопрос: для чего нужны два параметра in_rest и out_rest в гулагах, и как отследить попадание ГГ в рестриктор, который без логики и не помеченый стори_айди?

Изменено пользователем Куфзук

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


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

Хантер, привет! Wiki тебе в помощь: >>Click Me<<

 

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

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

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


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

Хантер, вероятно - да! Делаеться это через нет_пакеты, сказать как, наверняка не скажу, углубленно не ковырял, но где-то видел, как скриптами добавляли space_restrictor, можно посмотреть и сделать по аналогии, правда, где видел, чего-то запамятовал...

---------

Вот нашел! Статья с СП:

Первое обновление. Теперь можно выбирать, какой формы будет рестриктор, Шар или Куб.

Для Куба устанавливаются размеры по x,y,z.

 

Второе обновление. Теперь, в качестве кастом даты, можно указывать ltx файлы, из папки config. Путь указывается таким образом:

 

local ltx = "scripts\имя_файла.ltx"

 

Итак. Создаём файл _new_create.script, если такового ещё нет, и добавляем в него нашу функцию:

 

function create_restr(storid, pos_restr, lvid_restr, gvid_restr, custom_restr, radius_restr, ax_x, ax_y, ax_z)

local obj = alife():create("space_restrictor", pos_restr, lvid_restr, gvid_restr)

 

local packet = net_packet()

obj:STATE_Write(packet)

----------------------- load ------------------------------

local game_vertex_id = packet:r_u16()

local cse_alife_object__unk1_f32 = packet:r_float()

local cse_alife_object__unk2_u32 = packet:r_u32()

local level_vertex_id = packet:r_u32()

local object_flags = packet:r_u32()

local custom_data = packet:r_stringZ()

local story_id = packet:r_u32()

local spawn_story_id = packet:r_u32()

local shape_count = packet:r_u8()

for i=1,shape_count do

local shape_type = packet:r_u8()

if shape_type == 0 then

local center = packet:r_vec3()

local radius = packet:r_float()

else

local axis_x = packet:r_vec3()

local axis_y = packet:r_vec3()

local axis_z = packet:r_vec3()

local offset = packet:r_vec3()

end

end

 

local restrictor_type = packet:r_u8()

-------------------------- save -----------------------------

packet:w_begin(game_vertex_id)

packet:w_float(cse_alife_object__unk1_f32)

packet:w_u32(cse_alife_object__unk2_u32)

packet:w_u32(level_vertex_id)

packet:w_u32( bit_not(193) )

 

if custom_restr ~= nil then

if string.find (custom_restr, '.ltx') ~= nil then

custom_restr = '[logic]\n cfg = '..custom_restr..'\n'

end

packet:w_stringZ(custom_restr)

else

packet:w_stringZ(custom_data)

end

 

if storid ~= nil then

packet:w_u32(storid)

else

packet:w_u32(story_id)

end

 

packet:w_u32(spawn_story_id)

 

packet:w_u8(1)

if radius_restr ~= nil then

packet:w_u8(0)

packet:w_vec3(vector():set(0, 0, 0))

packet:w_float(radius_restr)

elseif radius_restr == nil and ax_x == nil then

packet:w_u8(0)

packet:w_vec3(vector():set(0, 0, 0))

packet:w_float(2.5)

else

packet:w_u8(1)

packet:w_vec3(vector():set(ax_x, 0, 0))

packet:w_vec3(vector():set(0, ax_y, 0))

packet:w_vec3(vector():set(0, 0, ax_z))

packet:w_vec3(vector():set(0, 0, 0))

end

 

packet:w_u8(restrictor_type)

-----------------------------------------------------

packet:r_seek(0)

obj:STATE_Read(packet, packet:w_tell())

end

 

Вызов спавна будет производиться из других функций, других файлов, таким образом:

 

для формы Шар:

_new_create.create_restr(sid, pos, lv, gv, ltx, radius)

 

для Формы Куб:

_new_create.create_restr(sid, pos, lv, gv, ltx, nil, x, y, z)

 

Где:

sid --стори айди рестриктора (или nil, если не используется)

pos --позиция спавна рестриктора vector():set(x,y,z)

lv --левел вертекс позиции спавна

gv --гейм вертекс позиции спавна

ltx --кастом дата рестриктора

radius --радиус зоны рестриктора (в метрах) (или nil, если используется форма куба)

x,y,z --размеры куба, по x,y,z соответственно.

 

Теперь разберём такие настройки как, ltx и sid.

 

---------------------------------

ltx

 

Кастом дата рестриктора. Тобишь, логика по которой будет работать данный рестриктор.

Чтобы указать логику из статитеского файла ltx, находящегося в папке config, нужно прописать так:

 

local ltx = "scripts\\имя_файла.ltx"

 

или

 

local ltx = "misc\\имя_файла.ltx"

 

или

 

local ltx = "имя_файла.ltx"

 

В зависимости от того, где лежит требуемый файл, относительно папки config.

 

Если нас статический ltx не устраивает. То можно прописать логику динамически.

Тобишь, в той же функции, от куда и будет вызываться спавн рестриктора.

Итак, пред вызовом спавна создаём локальную переменную ltx, и в значении данной переменной прописываем всю логику нашего рестриктора.

Например, установим эффект активации слота "ножь", при входе ГГ в рестриктор:

 

local ltx = "[logic]\n"..

"active = sr_idle@in\n"..

 

"[sr_idle@in]\n"..

"on_actor_inside = %=activate_knife% sr_idle@out\n"..

 

"[sr_idle@out]\n"..

"on_actor_outside = sr_idle@in\n"

 

 

Разберём особенности динамического ltx:

 

\n -прописать в новой строке, динамического файла ltx.

.. -привязать следующую строку к общей схеме динамического ltx.

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

В последней строке, двоеточие запрещается ставить категорически.

 

Если логика рестриктора, не предусмотрена, то вместо неё ставить nil.

 

-------------------------------------------------------

sid

 

Стори айди рестриктора. Используется при отслеживании попадания неписей под рестриктор. Если не используется, то ставить значение nil.

 

-------------------------------------------------------

 

Есть возможность использовать значения по умолчанию:

 

_new_create.create_restr(sid, pos, lv, gv, ltx)

 

или

 

_new_create.create_restr(sid, pos, lv, gv)

если custom_data не предусматривается.

 

По умолчанию рестриктор имеет форму Шара, с радиусом 2.5 метра.

 

 

Да, нет! Пример со спейс рестриктором я тебе привел, для того, чтобы показать (приблизительно), как объекту заспавненому через скрипт приписать, туже кустом_дату или стори_айди.

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

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


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

Хантер, напиши условия через запятую

usable = {=actor_has_item(niva_keys_1)}, {=actor_has_item(niva_keys_2)}

Проверка будет происходить слева на право, если у актора появиться ключ 1, то проверка прикартиться, если его не будет, то провериться наличие ключа 2.

Если напишешь так

usable = {=actor_has_item(niva_keys_1) =actor_has_item(niva_keys_2)}

то необходимостью станет наличие сразу двух ключей.

Изменено пользователем Куфзук

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


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

PGU_tk, как вариант, ты можешь разрядить нужное тебе оружие, и потом его активировать, ГГ сам его перезарядит.

Что-то на подобие такого:

function actor_mast_reload()
    local actor = db.actor
    local wpn = actor:item_in_slot(2)
    if actor and wpn then
        wpn:unload_magazine()
        actor:activate_slot(2)
        actor:restore_weapon()
    end
end

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

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


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

PGU_tk, по сути, если у тебя оружие уже активно, то restore_weapon ни чего не даст, но если оно спрятано!?

И почему это он не спешит, при пустом магазине он вроде сам перезарежается. Если не хочет, то надо заставить его выстрелить, но вот как?

Изменено пользователем Куфзук

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


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

PGU_tk, использование wpn:restore_weapon() приведет минимум к неправильной работе, функция restore_weapon() применима исключительно для ГГ.

По поводу перезарядки при использовании unload_magazine() или set_ammo_elapsed(0) возможно ты прав, по описанию, эти функции эквиваленты, они просто ставят колличество патронов в ноль и не определяют, что патронов более нет. Поэтому, для того, чтобы определить, что патронов и прям ноль, нужно сделать выстрел через скрипт, что как мне кажеться - проблематично, или я ошибаюся!?

Изменено пользователем Куфзук

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


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

@"StreloK", для НПС amk_bariga_1, ты используешь уже зарезервированый story_id. Попробуй поменять на другой.

P.S. Перевод Google:

Указанный объект истории уже в реестре история!

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


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

Каких именно? Если ключевых или уникальных, то в файле stable_bio_name.xml в папке config\text\rus. Если повсеместных, тех которые генеряться, то в файлах stable_generate_fnames.xml и stable_generate_snames.xml, той же папки.

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


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

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