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

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

@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. тут об этом никаких упоминаний...

Изменено пользователем 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.

Ссылка на комментарий

@Zander_driver, и вновь очень неаккуратно излагаешь...

В алл.спавне задается параметр 'communities', который относится к гулагу для этого смарттерейна и который как раз и считывается в 'accepted_communities'.

В net-пакете этот параметр, как уже выше указал, нужно искать в кастомдате, и конечно же под тем же именем (communities), который и указан в алл.спавне.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Теперь уже вы неточно излагаете) пока шла переписка, предположил что это параметр серверного объекта. А не параметр в нет-пакете, как можно было понять с ваших слов. так и оказалось.

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.

Ссылка на комментарий

@Zander_driver, зачем же свои предполагалки мне приписывать? С самого начало было сказано:

 

Имеется возможность задать параметр 'accepted_communities' - табличку в которой перечислены допустимые/разрешенные для гулага группировки.

- т.е. было сказано, что этот параметр может быть добавлен к серверному объекту смарттерейна. А про нет-пакет, как и про кастом-дату, говорилось именно о 'communities'.

И как раз(!), этот параметр ('accepted_communities'), отсутствующий у движкового объекта(!), объявляется из параметра 'communities', берущегося скриптом из кастомдаты объекта (т.е. может быть прочитан и нет-пакетом). Т.о. ответ на твой вопрос "как изменить" уже и был дан ранее...

Примечание: Прямое изменение параметра 'obj.accepted_communities' конечно возможно, но(!) будет действовать только на текущей локации, т.е. после перезапуска игры все вернется к значению 'communities' из кастомдаты(net-пакета).

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Информация в контексте вопроса о максимальном объеме 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!

 

 

Изменено пользователем Artos
  • Нравится 1

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Ссылка на комментарий

Изучая соответствие серверных и клиентских классов, находим:

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.

Ссылка на комментарий

@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

 

Ссылка на комментарий

В общем с Новым годом всех!

Тут проблема, написал скрипт для гранат с УДЗ (Ударно-Дистанционый Запал). ТЧ 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

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Ссылка на комментарий

Всех с новым годом, выручайте. Я уже не знаю что делать с этой чертовщиной...

Короче, ситуация такая: есть скриптовое окно. У него из событий только 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.

Ссылка на комментарий

Объект открытого окна иногда по каким-то причинам уничтожается уборщиком мусора. В таком случае помогает сохранение ссылки на окно в глобальной переменной. Можно также попробовать сохранить ссылку в виде члена класса и заниливать его при закрытии окна.

  • Нравится 3
Ссылка на комментарий

С новым годом!

Короче тут такой вопрос.Сделал функцию зажигания костра при приближении ГГ к ближайшему костру, но она работает только когда костер горит. То есть когда костер потухший, функция не срабатывает. Ставлю ее в функцию campfire_binder:update. Куда можно поставить мою функцию, чтобы она зажигала костер? 

if db.actor:position():distance_to(self.object:position()) <= 4 then
self.campfire:turn_on()
end
Изменено пользователем aleksn09
Ссылка на комментарий

@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
Изменено пользователем FantomICW

c57d8f0c86.png

Ссылка на комментарий

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

Потом решил сократить условия и приписать еще вывод сообщения в ПДА. Функция активируется только когда НПСы сами разжигают костер. Сообщение выводится и костер как бы зажигается. Вот даже скриншот имеется:

8_091NAuTcw.jpg

 

Изменено пользователем aleksn09
Ссылка на комментарий

Поставил свою функцию в campfire_binder:net_spawn, ближайший костер загорелся, но это не то. Надо ставить функцию на апдейт, но как поставить, если апдейт костра работает только когда НПСы зажигают костер. Есть какие идеи или предложения?

Изменено пользователем aleksn09
Ссылка на комментарий

@aleksn09,ты разберись в логике работы campfire зон и смартов, вкратце костер привязывается к смарту в алл спавне (там по названию к примеру имя смарта смарт_1 имя костра смарт_1_костер1)  в общем когда НПС есть в смарте, то костер загорится(включится из под логики смарта). в твоем случае тебе надо просто сделать подобное тому что есть в смарте, только на апдейте актора...

Ссылка на комментарий

@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
Изменено пользователем aleksn09
Ссылка на комментарий

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

db.actor:item_in_slot(1)

А как её переделать что бы был не слот а пояс?
Заранее спасибо.

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

Пытаюсь создать глобальный мод с новым сюжетом,буду рад любой оказанной помощи

Ссылка на комментарий
@плащ, в ТЧ нет такого метода, чтоб определить наличие предмета на поясе. Но есть скрипт, с помощью которого это можно сделать, в Солянке есть (а, может, и в АМК, точно не знаю), называется inventory.script. Посмотри его, там через сканирование инвентаря определяется, какие предметы находятся на поясе (их секции и id) Изменено пользователем naxac

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

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

Ссылка на комментарий

Опять регэкспы, и опять я чего-то не понимаю:

на входе: 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 подстроки, так, как я разделил "новой строкой".

Из первой и вправду получается позиция, два состояния и звук.

А из второй ?

Изменено пользователем Dennis_Chikin
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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