ColR_iT 171 Опубликовано 24 Декабря 2010 @"StreloK", распаковываешь all.spawn и меняешь координаты, затем запаковываешь. :ny_use_search: Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 24 Декабря 2010 Starter, в папке ambient их найдешь... хотя это немного другое! Глянь в nature! :ny_dry: Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 26 Декабря 2010 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 Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 28 Декабря 2010 (изменено) Snork_7171, с наступающим Новым Годом! 1. Тебе нужно либо прописать их в textures.ltx в папке текстур, либо генерировать с помощью SDK .thm файлы для этих текстур; 2. Горят красным поскольку не синхронизированы в SDK; 3. Каким образом?; Что значит "быстрее находил"? Обычно для моделей конкретные пути прописываются. 4. Возможно подвисание на стадии "Синхронизация..." и при открытии окна торговли этого торговца. 5. Для чего дублировать? Добавляешь очень много нового? 6. Вот в теме про арсенал, тутор "как добавить новый ствол в игру" Изменено 28 Декабря 2010 пользователем Куфзук Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 20 Января 2011 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 Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 20 Января 2011 (изменено) 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, который в свою очередь выдается после слов Сидора: Да всё пока. Принесёшь мне флешку, и будем считать, что частично за своё спасение ты расплатился. Изменено 20 Января 2011 пользователем Куфзук Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 7 Февраля 2011 @"StreloK", процентов на 90 уверен, что дело в логике или путях. Покажи и то и другое. Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 7 Февраля 2011 FANAT, к спавну артефактов причастна аномалия к которой относиться данный артефакт. Загляни в файлы zone_ в папке config/misc. Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 7 Февраля 2011 FANAT, в чистом АМК 1.4.1 в amk_anoms.script нет не единого слова artefact. Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 8 Февраля 2011 (изменено) Ребята, привет! Сейчас копаюся в 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 И таких достаточно много. Для чего они? Изменено 8 Февраля 2011 пользователем Куфзук Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 8 Февраля 2011 Так, так, так! А что за такие ограничения in_rest и out_rest? И как отследить попадание актора в рестриктор не помеченый стори_айди? Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 9 Февраля 2011 (изменено) Scarabay, спасибо, конечно! Но миникарта как не менялась от уровня, так и не меняется! А где ты в ТЧ видел такую штуку-дрюку? Ладно, не об этом. Все, что я нашел по этому рестриктору 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 в гулагах, и как отследить попадание ГГ в рестриктор, который без логики и не помеченый стори_айди? Изменено 9 Февраля 2011 пользователем Куфзук Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 11 Февраля 2011 (изменено) Хантер, привет! Wiki тебе в помощь: >>Click Me<< Хантер, а наличие инфопоршня проверял? Просто тут только в этом загвоздка может быть. Изменено 11 Февраля 2011 пользователем Cyclone Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 11 Февраля 2011 (изменено) Хантер, вероятно - да! Делаеться это через нет_пакеты, сказать как, наверняка не скажу, углубленно не ковырял, но где-то видел, как скриптами добавляли 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 метра. Да, нет! Пример со спейс рестриктором я тебе привел, для того, чтобы показать (приблизительно), как объекту заспавненому через скрипт приписать, туже кустом_дату или стори_айди. Изменено 11 Февраля 2011 пользователем Cyclone Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 11 Февраля 2011 (изменено) Хантер, напиши условия через запятую 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)} то необходимостью станет наличие сразу двух ключей. Изменено 11 Февраля 2011 пользователем Куфзук Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 12 Февраля 2011 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 только оружие должно быть по крайней мере просто в слоте. Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 12 Февраля 2011 (изменено) PGU_tk, по сути, если у тебя оружие уже активно, то restore_weapon ни чего не даст, но если оно спрятано!? И почему это он не спешит, при пустом магазине он вроде сам перезарежается. Если не хочет, то надо заставить его выстрелить, но вот как? Изменено 12 Февраля 2011 пользователем Куфзук Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 12 Февраля 2011 (изменено) PGU_tk, использование wpn:restore_weapon() приведет минимум к неправильной работе, функция restore_weapon() применима исключительно для ГГ. По поводу перезарядки при использовании unload_magazine() или set_ammo_elapsed(0) возможно ты прав, по описанию, эти функции эквиваленты, они просто ставят колличество патронов в ноль и не определяют, что патронов более нет. Поэтому, для того, чтобы определить, что патронов и прям ноль, нужно сделать выстрел через скрипт, что как мне кажеться - проблематично, или я ошибаюся!? Изменено 12 Февраля 2011 пользователем Куфзук Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 13 Февраля 2011 @"StreloK", для НПС amk_bariga_1, ты используешь уже зарезервированый story_id. Попробуй поменять на другой. P.S. Перевод Google: Указанный объект истории уже в реестре история! Поделиться этим сообщением Ссылка на сообщение
ColR_iT 171 Опубликовано 15 Февраля 2011 Каких именно? Если ключевых или уникальных, то в файле stable_bio_name.xml в папке config\text\rus. Если повсеместных, тех которые генеряться, то в файлах stable_generate_fnames.xml и stable_generate_snames.xml, той же папки. Поделиться этим сообщением Ссылка на сообщение