Zander_driver 10 333 Опубликовано 30 Ноября 2013 Поделиться Опубликовано 30 Ноября 2013 (изменено) @Artos, а есть с 'smart_terrain' (clsid.smart_terrain). Этот же сид и регистрируются в class_registrator.script. Действительно, так и есть. видимо поменьше надо заниматься скриптописанием среди ночи Что касается комьюнити - помню, что при описании смарта general_lager в алл.спавне, там задавался параметр community. Вот и предположил, что ему какой то ключ в нет-пакете соответствует. Что повидимому так и есть - community в алл.спавне так же позволяет указывать список через запятую, видимо accepted_communities в нет-пакете ему соответствует. Upd. Похоже, я ошибаюсь. вот нет-пакет из лога [13:53:18] NETPACKET_BY [13:53:18] TABLE:; [13:53:18] { [13:53:18] [KEY: STRING:gvid] = VALUE: NUMBER:3905; [13:53:18] [KEY: STRING:spawn_story_id] = VALUE: NUMBER:-1; [13:53:18] [KEY: STRING:population_locked] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:duration_end_present] = VALUE: USERDATA; [13:53:18] [KEY: STRING:gulag] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:population] = VALUE: NUMBER:19; [13:53:18] [KEY: STRING:jobs] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: NUMBER:1] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:2071655680; [13:53:18] } [13:53:18] [KEY: NUMBER:2] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:2071655680; [13:53:18] } [13:53:18] [KEY: NUMBER:3] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:2071655680; [13:53:18] } [13:53:18] [KEY: NUMBER:4] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:2071655680; [13:53:18] } [13:53:18] [KEY: NUMBER:5] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:2071655680; [13:53:18] } [13:53:18] [KEY: NUMBER:6] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:2071655680; [13:53:18] } [13:53:18] [KEY: NUMBER:7] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:2071655680; [13:53:18] } [13:53:18] [KEY: NUMBER:8] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:0; [13:53:18] } [13:53:18] [KEY: NUMBER:9] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:2071655680; [13:53:18] } [13:53:18] [KEY: NUMBER:10] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:0; [13:53:18] } [13:53:18] [KEY: NUMBER:11] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:2071655680; [13:53:18] } [13:53:18] [KEY: NUMBER:12] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:2071655680; [13:53:18] } [13:53:18] [KEY: NUMBER:13] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:2071655680; [13:53:18] } [13:53:18] [KEY: NUMBER:14] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:2071655680; [13:53:18] } [13:53:18] [KEY: NUMBER:15] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:2071655680; [13:53:18] } [13:53:18] [KEY: NUMBER:16] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:2071655680; [13:53:18] } [13:53:18] [KEY: NUMBER:17] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:2071655680; [13:53:18] } [13:53:18] [KEY: NUMBER:18] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:2071655680; [13:53:18] } [13:53:18] [KEY: NUMBER:19] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:fill_idle] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:idle_after_death_end] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:begin] = VALUE: NUMBER:2071655680; [13:53:18] } [13:53:18] } [13:53:18] [KEY: STRING:population_non_exclusive] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:population_comed] = VALUE: NUMBER:17; [13:53:18] [KEY: STRING:state] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:stateBegin] = VALUE: USERDATA; [13:53:18] [KEY: STRING:casualities] = VALUE: NUMBER:0; [13:53:18] } [13:53:18] [KEY: STRING:distance] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:restrictor_type] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:custom_data] = VALUE: STRING:[smart_terrain] [13:53:18] [KEY: STRING:shapes] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: NUMBER:1] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:type] = VALUE: NUMBER:0; [13:53:18] [KEY: STRING:center] = VALUE: USERDATA; [13:53:18] [KEY: STRING:radius] = VALUE: NUMBER:25; [13:53:18] } [13:53:18] } [13:53:18] [KEY: STRING:npc_info] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: NUMBER:12654] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:9; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] [KEY: NUMBER:12608] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:1; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] [KEY: NUMBER:12585] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:4; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] [KEY: NUMBER:12632] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:12; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] [KEY: NUMBER:12640] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:7; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] [KEY: NUMBER:12617] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:11; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] [KEY: NUMBER:12718] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:19; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] [KEY: NUMBER:12672] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:14; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] [KEY: NUMBER:12680] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:16; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] [KEY: NUMBER:12688] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:17; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] [KEY: NUMBER:12696] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:15; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] [KEY: NUMBER:12704] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:8; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] [KEY: NUMBER:12623] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:13; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] [KEY: NUMBER:12647] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:6; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] [KEY: NUMBER:12663] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:5; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] [KEY: NUMBER:12601] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] [KEY: NUMBER:12711] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:18; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] [KEY: NUMBER:12727] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:10; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] [KEY: NUMBER:12594] = VALUE: TABLE:; [13:53:18] Table value: [13:53:18] { [13:53:18] [KEY: STRING:exclusive] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:didnt_begin_job] = VALUE: BOOLEAN:false; [13:53:18] [KEY: STRING:jobN] = VALUE: NUMBER:3; [13:53:18] [KEY: STRING:begin_job] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:stay_end] = VALUE: USERDATA; [13:53:18] [KEY: STRING:o_group] = VALUE: NUMBER:2; [13:53:18] [KEY: STRING:o_squad] = VALUE: NUMBER:1; [13:53:18] } [13:53:18] } [13:53:18] [KEY: STRING:object_flags] = VALUE: NUMBER:-66; [13:53:18] [KEY: STRING:idle_end_present] = VALUE: USERDATA; [13:53:18] [KEY: STRING:gulag_working] = VALUE: BOOLEAN:true; [13:53:18] [KEY: STRING:lvid] = VALUE: NUMBER:249711; [13:53:18] [KEY: STRING:story_id] = VALUE: NUMBER:-1; [13:53:18] [KEY: STRING:direct_control] = VALUE: NUMBER:1; [13:53:18] } Почему я тут не нахожу никаких упоминаний accepted_communities... хотя смарт выбирался из числа тех, у которых в all.spawn явно прописано community. тут об этом никаких упоминаний... Изменено 30 Ноября 2013 пользователем Zander_driver Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Artos 99 Опубликовано 30 Ноября 2013 Поделиться Опубликовано 30 Ноября 2013 (изменено) @Zander_driver, и вновь очень неаккуратно излагаешь... В алл.спавне задается параметр 'communities', который относится к гулагу для этого смарттерейна и который как раз и считывается в 'accepted_communities'. В net-пакете этот параметр, как уже выше указал, нужно искать в кастомдате, и конечно же под тем же именем (communities), который и указан в алл.спавне. Изменено 30 Ноября 2013 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Zander_driver 10 333 Опубликовано 30 Ноября 2013 Поделиться Опубликовано 30 Ноября 2013 Теперь уже вы неточно излагаете) пока шла переписка, предположил что это параметр серверного объекта. А не параметр в нет-пакете, как можно было понять с ваших слов. так и оказалось. obj.accepted_communities оказался таким: TABLE:; [14:07:22] { [14:07:22] [KEY: STRING:military_nato] = VALUE: BOOLEAN:true; [14:07:22] } Вот и разобрались. Надеюсь это кому то кроме меня пригодится Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Artos 99 Опубликовано 30 Ноября 2013 Поделиться Опубликовано 30 Ноября 2013 (изменено) @Zander_driver, зачем же свои предполагалки мне приписывать? С самого начало было сказано: Имеется возможность задать параметр 'accepted_communities' - табличку в которой перечислены допустимые/разрешенные для гулага группировки. - т.е. было сказано, что этот параметр может быть добавлен к серверному объекту смарттерейна. А про нет-пакет, как и про кастом-дату, говорилось именно о 'communities'. И как раз(!), этот параметр ('accepted_communities'), отсутствующий у движкового объекта(!), объявляется из параметра 'communities', берущегося скриптом из кастомдаты объекта (т.е. может быть прочитан и нет-пакетом). Т.о. ответ на твой вопрос "как изменить" уже и был дан ранее... Примечание: Прямое изменение параметра 'obj.accepted_communities' конечно возможно, но(!) будет действовать только на текущей локации, т.е. после перезапуска игры все вернется к значению 'communities' из кастомдаты(net-пакета). Изменено 30 Ноября 2013 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Artos 99 Опубликовано 30 Ноября 2013 Поделиться Опубликовано 30 Ноября 2013 (изменено) Информация в контексте вопроса о максимальном объеме net-пакета (см. #5412 и далее): (по некоторым причинам... излагать приходится несколько косноязычно... но вроде как достаточно понятно ) Имеется значение NET_PacketSizeLimit = 8192; //16384 Т.е. для ТЧ (SHoC) размер net-пакета должен быть не более 8192 байт, а для ЧН/ЗП соответственно 16384, однако(!) допустимые значения меньше объявленных/указанных. Это обусловлено тем, что для "склеивания в сэйв" - при обработке net-пакетов каждого игрового объекта для включения его данных в общий сэйв используются аналогичные функции имеющие те же ограничения и расходуются доп.байты... Эмпирическим путем определено, что расходуется порядка 512 байт (или менее). Т.о. при расчете допустимых размеров для элементов универсальных хранилищ (и вообще как ограничение для всех других объектов) следует использовать следующие значения: SHoC: NET_PacketSizeLimit = 8192 - 512 = 7680 bytes CS|CoP: NET_PacketSizeLimit = 2x8192 - 512 = 15872 bytes Примечание: Признаком переполнения net-пакета(ов) является зависание или фатальное прерывание игры на стадии записи сэйва игры. При этом лог-файл пуст(!), т.е. в лог-файле отсутствует какая-либо информация. В продвинутых способах записи в лог последней строкою будет упоминание о начале сохранений '* Saving objects': $ DBG: se_stor:save_storehouse: size(1)=[7951]+[0] $ DBG: se_stor:save_storehouse: size(2)=[7976]+[7951] $ DBG: se_stor:save_storehouse: size(3)=[7967]+[15927] ... $ DBG: se_stor:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $ DBG: se_stor:Save Storehouse: size(5)=[31442], keys=[1882] $ DBG: se_stor:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Saving spawns... * Saving objects... а вот дебаг-движок игры дополнительно к выше указанной записи ругнулся бы фатальной ошибкою: FATAL ERROR [error]Expression : assertion failed [error]Function : NET_Packet::w [error]File : ../../xrNetServer/net_utils.h [error]Line : 47 [error]Description : B.count + count < NET_PacketSizeLimit Резюме: При необходимости контролируйте максимальный размер записанного в net-пакеты игровых объектов по указанным выше значениям. В скрипте se_stor.script можно изменить так: --/#!# лимит (bytes) на один stor-объект (мах.длина строк) local MAX_PACKET_LENGHT = 8192 - 512 --/ for SHoC if iSSVer > 7 then MAX_PACKET_LENGHT = MAX_PACKET_LENGHT + 8192 end --/ for CS&CoP! Изменено 30 Ноября 2013 пользователем Artos 1 "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Zander_driver 10 333 Опубликовано 18 Декабря 2013 Поделиться Опубликовано 18 Декабря 2013 Изучая соответствие серверных и клиентских классов, находим: cse_alife_item_ammo | CWeaponAmmo Очевидно, что этой паре в конфигах соответствует class = AMMO. cse_alife_item_explosive | CExplosiveItem cse_alife_item_grenade | CF1 | CRGD5 Тоже в общем-то, все понятно. Непонятно куда относятся конфиговые идентификаторы классов A_OG7B, A_VOG25, A_M209, G_FAKE. Как правильно называются их клиентские классы? ведь, следуя логике, раз в конфиге у них свой class id, значит должен быть свой класс. И соответствует ли им какой-то/какие-то свои серверные классы или они соответствуют одному из вышеназванных? Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Malandrinus 615 Опубликовано 19 Декабря 2013 Поделиться Опубликовано 19 Декабря 2013 @Zander_driver, серверный класс | клиентский класс | clsid (скриптовая| class | (С++) | (С++) | таблица) | (ltx) | CSE_ALifeItemAmmo | CWeaponAmmo | wpn_ammo_vog25 | A_VOG25 | Граната для подствольника "Костёр" CSE_ALifeItemAmmo | CWeaponAmmo | wpn_ammo_og7b | A_OG7B | Заряд для РПГ CSE_ALifeItemAmmo | CWeaponAmmo | wpn_ammo_m209 | A_M209 | Граната для натовского подствольника CSE_Temporary | CExplosiveRocket | wpn_grenade_fake | G_FAKE | ВрЕменная граната 1 Плагины Total Commander для работы с игровыми архивами: Архиваторный плагин (для работы с одиночным архивом): link1 link2 Системный плагин (для распаковки установленной игры): link1 link2 Ссылка на комментарий
НаноБот 740 Опубликовано 31 Декабря 2013 Поделиться Опубликовано 31 Декабря 2013 В общем с Новым годом всех! Тут проблема, написал скрипт для гранат с УДЗ (Ударно-Дистанционый Запал). ТЧ 1.0004 --[[---------------------------------------------------------------------------- Гранаты с ударным запалом, РГО, РГН Для модов ТЧ. (с) НаноБот Пос. изменение 27.12.2013 г. --]]---------------------------------------------------------------------------- local udz_grn = { "grenade_f1", "grenade_rgd5" } -- список гранат с ударным запалом УДЗ local dist_vzvod = 1000 -- мс, время взвода взрывателя. local udar = 150 -- динамическое ускорение (м/с^2) свыше которого срабатывает взрыватель local grenades = { } local id_grn, id_new local sect_grn, sect_new local flg local con = get_console() function log(arg) con:execute("load ~ "..arg) con:execute("flush") end function update(delta) for id, v in pairs(grenades) do track_thrown(id, delta) end if flg then if id_grn and level.object_by_id(id_grn) == nil and UDZ(sect_grn) then for id_exp = 1, 65534 do local obj = level.object_by_id(id_exp) if obj and obj:section() == sect_grn then if alife():object(id_exp) == nil and grenades[id_exp] == nil then grenades[id_exp] = { } grenades[id_exp]["time"] = time_global() log("Граната брошена-("..obj:section()..")ID-("..id_grn..")ID_explo-("..id_exp..")time-("..time_global()..")delta-("..delta..")") break end end end end id_grn = id_new sect_grn = sect_new end local slot = db.actor:active_slot() local grn = db.actor:item_in_slot(slot) if grn and slot == 3 then id_new = grn:id() sect_new = grn:section() else id_new = nil sect_new = nil end if id_grn ~= id_new then flg = true log("Граната взята в руки-("..tostring(sect_new)..")IDnew-("..tostring(id_new)..")ID_grn-("..tostring(id_grn)..")time-("..time_global()..")") else flg = false end end function track_thrown(id, delta) local grn = level.object_by_id(id) if grn == nil then log("Граната исчезла-ID-("..id..")time-("..time_global()..")") grenades[id] = nil return end if grenades[id]["explode"] then -- граната взорвана (от удара) return end --[[if grenades[id]["destroy_time"] < time_global() then -- граната взорвана от самоликвидатора log("Граната взорвана от самоликвидатора! -ID-("..id..")time-("..time_global()..")") grenades[id]["explode"] = true return end--]] local ps = grn:get_physics_shell() if ps == nil then -- физ. оболочки у зарег. гранаты НЕТ! return end local lvel = vector() ps:get_linear_vel(lvel) grenades[id]["lvel"] = lvel local last_lvel = grenades[id]["last_lvel"] if grenades[id]["time"] + dist_vzvod > time_global() or last_lvel == nil then -- предохранитель safety lock grenades[id]["last_lvel"] = lvel return end local vel = vector() vel.x = lvel.x - last_lvel.x vel.y = lvel.y - last_lvel.y vel.z = lvel.z - last_lvel.z local acc = vel:magnitude()/(delta * 0.001) log("скорость гранаты-("..lvel:magnitude()..")ускорение-("..acc..")ID-("..id..")time-("..time_global()..")") if acc > udar then -- основной показатель удара - динамическое ускорение (торможение) grn:explode(0) log("Граната принудительно взорвана-ID-("..id..")time-("..time_global()..")") grenades[id]["explode"] = true end grenades[id]["last_lvel"] = grenades[id]["lvel"] end function UDZ(sectgrn) if sectgrn then for i, sect in pairs (udz_grn) do if sectgrn == sect then return true end end end return false end Результат вылет с полупустым логом, последния запись в логе "Граната принудительно взорвана..." а далее вылет. В ЧН и соотвествено в ЗП вылета нет, там гранаты немного подругому сделаны, гранаты кидаются и НПСами, причем движку всё равно кто кинул ГГ или НПС, обрабатываются точно так же. Причем вылет получается только тогда когда я кидаю в НПС (солдат), в мутантов (кабанов) проблем нет, и то не всегда, раз прошел кардон, свалку, и дальше, при этом активно использовал гранаты вылета не было, но чаще все же вылетает. Я так понимаю это баг движка, когда денжер обрабатывается от гранаты и когда она взорвана (какие-то переменные равны нил) происходит внутрения ошибка и вылет. Наверно для ТЧ надо с фейковыми гранатами делать, у ЧН и ЗП проблем нет, но этот скрипт то же не годится, я там написал другой доработаный скрипт. Кстати, как работают гранаты, есть класс G_F1 и G_RGD5 эти предметы можно брать в руки и производить другие манипуляции, в общем муляжи гранат в каком то смысле, в момент броска этот предмет исчезают и спанится (в инвентарь) предмет класса II_EXPLO с секцией той же что эта граната, далее этот предмет телепортируется в фокус с физ. оболочкой и даётся импульс с нужной силой, далее через destroy_time мс взрывается и ещё через несколько секунд исчезает. Этот предмет не серверный, т.е. alife():object(id_exp) == nil. Короче может для ТЧ можно ещё как то проблему решить, а то не понятно как удалять настоящие гранаты, если граната уже ударилась, фейковая при этом заспавнилась взорвалась, а настоящия отлетела в сторону, удалить скриптом нельзя, сделать не прозрачными то же вроде нельзя. 1 ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Ссылка на комментарий
Zander_driver 10 333 Опубликовано 4 Января 2014 Поделиться Опубликовано 4 Января 2014 Всех с новым годом, выручайте. Я уже не знаю что делать с этой чертовщиной... Короче, ситуация такая: есть скриптовое окно. У него из событий только OnKeyboard. И, как только я это окно вызываю - через несколько секунд вылет, "родной" лог стерильно пуст, "дебаговый" - содержит всяческие записи о последних событиях перед вылетом, каждый раз разных, и не имеющих какого то отношения к данному окну, не дающих никаких намеков о причинах. Ситуация повторена уже десятки раз. пока окна нет - и никаких проблем нет. Стоит вызвать окно - оно открывается. Появляется на экране. Реагирует на нажатия клавиатуры - я могу успеть что-то написать, текст появляется. Но через несколько секунд, независимо от того писал ли я что-нибудь в нем, или не делал вообще ничего - движок рушится.Вызываю окно вот так: local testwindow = zzz_sp.tspwnd(get_hud()) level.start_stop_menu(testwindow,true) А вот сам скрипт с описанием окна, полностью: class "tspwnd" (CUIScriptWnd) function tspwnd:__init(owner) super() self.owner = owner self.mn_label = "" self.atab = {} self.atab.pos = vector() self.atab.pos = db.actor:position() self.atab.lv = db.actor:level_vertex_id() self.atab.gv = db.actor:game_vertex_id() self:Init(80,80,900,50) self.mainframe = CUIStatic() self.mainframe:SetWindowName("main_frame") self.mainframe:Init(0,0,900,50) self.mainframe:SetFont(GetFontLetterica16Russian()) self.mainframe:SetTextColor(255, 255, 255, 255) self.mainframe:InitTexture("ui\\bar_bl") self.mainframe:SetStretchTexture(true) self:Register(self.mainframe) self:AttachChild(self.mainframe) end function tspwnd:__finalize() end function tspwnd:SetworkCoor(p,l,g) self.atab.pos = p self.atab.lv = l self.atab.gv = g end function tspwnd:AddFrameText(s) self.mn_label = self.mn_label..s self.mainframe:SetText(self.mn_label) end function tspwnd:Clear_Text() self.mn_label = "" self.mainframe:SetText(self.mn_label) end function tspwnd:OnKeyboard(dik, keyboard_action) --virtual function CUIScriptWnd.OnKeyboard(self, dik, keyboard_action) if keyboard_action == ui_events.WINDOW_KEY_PRESSED then if dik == DIK_keys.DIK_ESCAPE then self:GetHolder():start_stop_menu(self,true) end if dik == DIK_keys.DIK_0 then self.mn_label = self.mn_label.."0" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_1 then self.mn_label = self.mn_label.."1" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_2 then self.mn_label = self.mn_label.."2" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_3 then self.mn_label = self.mn_label.."3" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_4 then self.mn_label = self.mn_label.."4" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_5 then self.mn_label = self.mn_label.."5" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_6 then self.mn_label = self.mn_label.."6" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_7 then self.mn_label = self.mn_label.."7" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_8 then self.mn_label = self.mn_label.."8" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_9 then self.mn_label = self.mn_label.."9" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_A then self.mn_label = self.mn_label.."a" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_B then self.mn_label = self.mn_label.."b" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_C then self.mn_label = self.mn_label.."c" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_D then self.mn_label = self.mn_label.."d" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_E then self.mn_label = self.mn_label.."e" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_F then self.mn_label = self.mn_label.."f" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_G then self.mn_label = self.mn_label.."g" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_H then self.mn_label = self.mn_label.."h" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_I then self.mn_label = self.mn_label.."i" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_J then self.mn_label = self.mn_label.."j" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_K then self.mn_label = self.mn_label.."k" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_L then self.mn_label = self.mn_label.."l" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_M then self.mn_label = self.mn_label.."m" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_N then self.mn_label = self.mn_label.."n" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_O then self.mn_label = self.mn_label.."o" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_P then self.mn_label = self.mn_label.."p" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_Q then self.mn_label = self.mn_label.."q" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_R then self.mn_label = self.mn_label.."r" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_S then self.mn_label = self.mn_label.."s" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_T then self.mn_label = self.mn_label.."t" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_U then self.mn_label = self.mn_label.."u" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_V then self.mn_label = self.mn_label.."v" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_W then self.mn_label = self.mn_label.."w" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_X then self.mn_label = self.mn_label.."x" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_Y then self.mn_label = self.mn_label.."y" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_Z then self.mn_label = self.mn_label.."z" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_BACKSLASH then self.mn_label = self.mn_label.."\\" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_SLASH then self.mn_label = self.mn_label.."/" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_SPACE then self.mn_label = self.mn_label.."_" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_COMMA then self.mn_label = self.mn_label.."," self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_DELETE then self.mn_label = "" self.mainframe:SetText(self.mn_label) end if dik == DIK_keys.DIK_BACK then self.mn_label = "" self.mainframe:SetText(self.mn_label) end end return true end Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Charsi 440 Опубликовано 4 Января 2014 Поделиться Опубликовано 4 Января 2014 Объект открытого окна иногда по каким-то причинам уничтожается уборщиком мусора. В таком случае помогает сохранение ссылки на окно в глобальной переменной. Можно также попробовать сохранить ссылку в виде члена класса и заниливать его при закрытии окна. 3 Lua и LuaJIT плагины для Notepad++ SciTE-RU 3.5.5 плагины для MilkShape3D Ссылка на комментарий
aleksn09 2 Опубликовано 5 Января 2014 Поделиться Опубликовано 5 Января 2014 (изменено) С новым годом! Короче тут такой вопрос.Сделал функцию зажигания костра при приближении ГГ к ближайшему костру, но она работает только когда костер горит. То есть когда костер потухший, функция не срабатывает. Ставлю ее в функцию campfire_binder:update. Куда можно поставить мою функцию, чтобы она зажигала костер? if db.actor:position():distance_to(self.object:position()) <= 4 then self.campfire:turn_on() end Изменено 5 Января 2014 пользователем aleksn09 Ссылка на комментарий
FantomICW 678 Опубликовано 5 Января 2014 Поделиться Опубликовано 5 Января 2014 (изменено) @aleksn09, по идее, ты строки прописал в нужное место. Это ведь постоянное обновление. Что-то мне подсказывает, что нужно пробовать переписать зажигание, используя движковую функцию-проверку is_on(). Как-то так, что ли: if db.actor:position():distance_to(self.object:position()) <= 4 and not self.campfire:is_on() then self.campfire:turn_on() end Изменено 5 Января 2014 пользователем FantomICW Ссылка на комментарий
aleksn09 2 Опубликовано 5 Января 2014 Поделиться Опубликовано 5 Января 2014 (изменено) aleksn09, по идее, ты строки прописал в нужное место. Это ведь постоянное обновление. Что-то мне подсказывает, что нужно пробовать переписать зажигание, используя движковую функцию-проверку is_on(). Как-то так, что ли: Так я тоже писал. Изначально у меня такая была функция: if db.actor:position():distance_to(self.object:position()) <= 4 and not self.campfire:is_on() and has_alife_info("has_fire") then self.campfire:turn_on() end Потом решил сократить условия и приписать еще вывод сообщения в ПДА. Функция активируется только когда НПСы сами разжигают костер. Сообщение выводится и костер как бы зажигается. Вот даже скриншот имеется: Изменено 5 Января 2014 пользователем aleksn09 Ссылка на комментарий
aleksn09 2 Опубликовано 6 Января 2014 Поделиться Опубликовано 6 Января 2014 (изменено) Поставил свою функцию в campfire_binder:net_spawn, ближайший костер загорелся, но это не то. Надо ставить функцию на апдейт, но как поставить, если апдейт костра работает только когда НПСы зажигают костер. Есть какие идеи или предложения? Изменено 6 Января 2014 пользователем aleksn09 Ссылка на комментарий
Viнt@rь 50 Опубликовано 16 Января 2014 Поделиться Опубликовано 16 Января 2014 @aleksn09,ты разберись в логике работы campfire зон и смартов, вкратце костер привязывается к смарту в алл спавне (там по названию к примеру имя смарта смарт_1 имя костра смарт_1_костер1) в общем когда НПС есть в смарте, то костер загорится(включится из под логики смарта). в твоем случае тебе надо просто сделать подобное тому что есть в смарте, только на апдейте актора... GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
aleksn09 2 Опубликовано 16 Января 2014 Поделиться Опубликовано 16 Января 2014 (изменено) @Viнt@rь, то есть допустим поставить функцию из xr_kamp, которая ниже приведена, на апдейт актера? Только сделать чтобы проверял наличие ГГ возле костра а не НПС. local campfire = bind_campfire.campfire_table[self.kamp_name.."_campfire"] if self.population > 0 and campfire ~= nil and not campfire:is_on() then campfire:turn_on() end Изменено 16 Января 2014 пользователем aleksn09 Ссылка на комментарий
плащ 0 Опубликовано 21 Января 2014 Поделиться Опубликовано 21 Января 2014 (изменено) Всем привет,у меня возникла вот такая проблема:В функции есть такая строка: db.actor:item_in_slot(1) А как её переделать что бы был не слот а пояс?Заранее спасибо. Изменено 21 Января 2014 пользователем плащ Пытаюсь создать глобальный мод с новым сюжетом,буду рад любой оказанной помощи Ссылка на комментарий
naxac 2 445 Опубликовано 24 Января 2014 Поделиться Опубликовано 24 Января 2014 (изменено) @плащ, в ТЧ нет такого метода, чтоб определить наличие предмета на поясе. Но есть скрипт, с помощью которого это можно сделать, в Солянке есть (а, может, и в АМК, точно не знаю), называется inventory.script. Посмотри его, там через сканирование инвентаря определяется, какие предметы находятся на поясе (их секции и id) Изменено 24 Января 2014 пользователем naxac Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
Viнt@rь 50 Опубликовано 24 Января 2014 Поделиться Опубликовано 24 Января 2014 @aleksn09, нет, полезть в схему смартов, в ней идет проверка на популяцию, и включение приписанного к нему костра... GUI для конвертера от бардака(всего и вся в форматы сдк) Полезный утиль-"Utilits pack(mod)" Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 27 Января 2014 Поделиться Опубликовано 27 Января 2014 (изменено) Опять регэкспы, и опять я чего-то не понимаю: на входе: 50|{=best_pistol}psy_armed,psy_pain@wounded_psy\ |20|=best_pistol}psy_shoot,psy_pain@{=best_pistol}wounded_psy_shoot,wounded_psy Разбираем: for name in string.gfind( s, "(%|*%d+%|[^%|]+)%p*" ) do t_pos = string.find( name, "|", 1, true ) s_pos = string.find( name, "@", 1, true ) dist = string.sub( name, 1, t_pos - 1 ) if s_pos then state = string.sub( name, t_pos + 1, s_pos - 1 ) sound = string.sub( name, s_pos + 1) else state, sound = string.sub( name, t_pos + 1 ), nil endПолучается как раз 2 подстроки, так, как я разделил "новой строкой".Из первой и вправду получается позиция, два состояния и звук. А из второй ? Изменено 27 Января 2014 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти