Chypakabra - AMK Team
Перейти к контенту

Chypakabra

Жители
  • Число публикаций

    1 175
  • Регистрация

  • Последнее посещение

  • Дней в топе

    23
  • AMKoin

    7,266 [Подарить AMKoin]

Chypakabra последний раз побеждал 11 Декабря

Chypakabra - автор самых популярных публикаций!

Баланс оценок

840

5 подписчиков

О Chypakabra

  • День рождения 30.05.1980

Звание

  • Звание
    Уравнобешеный!

Информация

  • Реальное имя
    Денис

Недавние посетители профиля

12 643 просмотра профиля

Закладки

  1. Скриптование
    Скриптование
    30.05.2023 в 16:25, phalcor сказал:

    function generic_physics_binder:death_callback(victim, who)

    Хочу идентифицировать, КТО "убил" ящик, но who:id(), who.id, who:section(), who:section_name() и т.д. вызывают вылет - нет такого метода.

    Подскажите, кто знает, как же можно идентифицировать who?

    Так вы бы и разбирались для начала, передан ли вообще who, и что он из себя представляет.

    Вылет происходит когда вы дергаете методы не удостоверившись в их наличии, а также наличии самого объекта.

    if who and type(who) == 'userdata' then
    	if type(who.id) == 'number' then
    		log("who - серверный объект") -- НЕ КЛИЕНТСКИЙ!
    		-- Здесь можно смело использовать who.id, who:section_name(), и другие методы и свойства СЕРВЕРНОГО объекта.
    		
    	elseif type(who.id) == 'function' then
    		log("who - клиентский объект") -- НЕ СЕРВЕРНЫЙ!
    		-- Здесь можно смело использовать who:id(), who:section(), и другие методы и свойства КЛИЕНТСКОГО объекта
        
    	else
    		log("who - объект, но не серверный и не клиентский. Вообще непонятно что.")
        	-- Такого скорее всего не произойдет никогда. Ну, или почти.
    	end
    else
    	log("who not found") -- Объект не был передан.
    end
    -- Главное не путайте серверные и клиентские объекты между собой.

     


  2. Прозекторская
    Прозекторская

    У себя уже давно использую оригинальный пысовский метод level.add_call() - как раз для таких "быстрых" таймеров. Каждый новый вызов этого метода, по сути и является созданием экземпляра класса и всё действо помещается в одну строку луашного кода. Но при такой компактности, конечно, и наворотов меньше чем у malandrinus'a - например из входных параметров только: имя таймера, время (таймаут), функция, которая будет вызвана по окончанию таймера и аргументы, переданные в эту функцию. То есть это именно таймер, с одним лишь условием - временем. Сохранение между сейвами так же не предусмотрено, но лично для моих нужд, пока этого хватает.


  3. Работа с текстурами
    Работа с текстурами

    @DDamian724

    Скрытый текст

    ;--------------------------------------------------------------------
    act_lenin = prop_lenin (soc has duplicate tex in act / prop)
    act_lenin02 = prop_lenin_02 (soc has duplicate tex in act / prop)
    ;--------------------------------------------------------------------
    crete_beton_2 = crete_beton_1
    crete_beton_3 = crete_beton_2
    crete_border1 = crete_border_05
    crete_dirty_gr = floor_dirty_gr
    crete_dirty1_gr = floor_dirty1_gr
    crete_fl_gr02 ~ wall_stucco_04
    crete_floor3 ~ wall_ceiling_01
    crete_floor4a = floor_tile_02
    crete_floor4a_1 = floor_tile_02
    crete_floor_linol = floor_linoleum_02
    crete_plitka_iov_01 ~ tile_white_blasted_01
    crete_plitka_qllab = tile_plitka_01
    crete_podval = wall_walls_paint_02
    crete_pol_t = floor_tile_01b
    crete_pol_t_01 = floor_tile_01b
    crete_provoda_ql = prop_cable_bobbin
    crete_provoda_ql_02 = prop_provod_05
    crete_railborder1 ~ crete_border_01 / wall_border_01
    crete_railborder2 ~ crete_border_01 / wall_border_01
    crete_roof_gr01 = roof_smola
    crete_roof1_border = roof_smola_border
    crete_roof1 = roof_smola
    crete_roof2 = roof_smola_02
    crete_roof3 = roof_crete_01
    crete_schiffer2 = roof_schiffer_01
    crete_schiffer2a = roof_schiffer_02
    crete_schiffer3 = roof_schiffer_01
    crete_stena_kraska_02 ~ wall_stucco_05
    crete_stena_kraska_02a ~ wall_stucco_05
    crete_stena_kraska_03a = wall_walls_paint_01
    crete_stena_kraska_03b = wall_walls_paint_01b
    crete_st_gr02 = crete_walls_old_02
    crete_stuccowall3_iov = wall_stucco_01
    crete_truba_ql ~ mtl_barrel_big_rust
    crete_walls3 ~ crete_beton_7
    crete_walls6 ~ crete_beton_7 / crete_beton_6 / crete_walls_02
    crete_walls7 = wall_stena_01
    crete_walls8 = wall_ceiling_01
    crete_walls8a = wall_ceiling_01
    crete_walls8d = wall_ceiling_01
    crete_walls9 = wall_walls_paint_03
    crete_walls9a = wall_walls_paint_03
    crete_walls9b = wall_walls_paint_03
    crete_walls9_a = wall_ceiling_01
    crete_walls11_1 = floor_tile_01
    crete_walls12 = crete_walls_01
    crete_walls17 = wall_wallpaper_02b
    crete_walls17a = wall_wallpaper_02b
    crete_walls18 = wall_wallpaper_02c
    crete_walls_cy01 = wall_stucco_15
    crete_walls_j12 = crete_walls_01
    crete_walls_j12a = crete_walls_01
    crete_walls_j12b = crete_walls_01
    crete_walls_blue_iov = wall_walls_paint_03b
    crete_walls_pryp_01 = wall_house_red_01
    crete_walls_pryp_02 = wall_house_white_01
    crete_walls_rg01 = tile_walls_rg01
    crete_walls_rg03 = tile_white_02
    crete_walls_rg04 = tile_walls_rg04
    crete_walls_rg06 = tile_white_02
    crete_walls_rg07 = wall_walls_paint_05
    crete_walls_tualgr = tile_plitka_tual
    crete_walls_tualgr01 = tile_walls_tualgr01
    crete_walls_tualgr03 = tile_plitka_tual_blue
    crete_walls_tualgr04 = tile_plitka_tual_red
    crete_walls_tual_b = floor_tile_02b
    crete_wallsgr11 = floor_tile_03
    ;--------------------------------------------------------------------
    door_gr_iov_01 = door_gr1
    door_gr02 = door_wood_05
    door_gr2_iov = door_gr2
    door_iov2 = door_electricunit_01
    door_iov3 = door_electricunit_02
    door_j01 = door_white_02
    door_j02 ~ door_metal_01
    door_j03alfa = door_j03_alfa
    door_korob_wh ~ wood_old
    door_red_garaj_iov = door_wood_02
    door_vorota_ch_train = door_gate_train_02
    door_w01 = door_metal_04
    ;--------------------------------------------------------------------
    fbr_linoleum1 = floor_linoleum_03
    ;--------------------------------------------------------------------
    glas_gr02 = glass_blocks
    glas_windows1 = wind_05
    glas_windows1a = wind_05_alpha
    glas_windows4 = wind_06
    glas_windows4a = wind_06_alpha
    ;--------------------------------------------------------------------
    grnd_concrete_1 = grnd_concrete_01
    grnd_concrete_2 = grnd_shlak_03
    grnd_dirt_dust_0 = grnd_dirt_dust_01
    grnd_dry_j02 = grnd_shlak_02
    grnd_dry_j02_pod = grnd_shlak_02
    grnd_dry_iov ~ grnd_dry_gr_01
    grnd_dry_gr = grnd_dry_gr_01
    grnd_obriv_3 = grnd_precipice_01
    grnd_zemlya_iov = grnd_zemlya
    grnd_zemlya2_iov = grnd_land_01
    ;--------------------------------------------------------------------
    mtl_bo4ka_big_iov = mtl_barrel_big / mtl_barrel_big_rust
    mtl_budka_01 ~ mtl_walls11
    mtl_daha_02 ~ mtl_rja_blue / mtl_rja_01
    mtl_gar_pod_01 ~ mtl_rja_blue
    mtl_gate_j01a = door_gate_metal_06
    mtl_garage_gate_01a ~ mtl_rja_01
    mtl_garage_gate_rjav = door_gate_metal_05
    mtl_green_rja_iov = mtl_rja_green
    mtl_floor_01tga = mtl_floor_plate_02
    mtl_fence2 = mtl_floor_fence_01
    mtl_fence2n = mtl_fence_01
    mtl_fence2n_ql ~ mtl_fence_01
    mtl_fence3 = mtl_fence_03
    mtl_fence4 = mtl_fence_04
    mtl_luk_ch ~ mtl_angar_a
    mtl_metall_02_b = mtl_floor_plate_01
    mtl_pod_02 = mtl_rja_blue
    mtl_ql ~ mtl_pod_01
    mtl_railroad_04 = mtl_railroad_01
    mtl_railroad_04_bok = mtl_railroad_01_bok
    mtl_rja_iov_01 = mtl_rja_01
    mtl_rech_ch_01 = mtl_rech_ch_01
    mtl_rech_ch_02 = mtl_stena_ch_04
    mtl_refllist_ql ~ mtl_truba_any
    mtl_resh_reil = mtl_girder_reil
    mtl_resh_reil_a = mtl_girder_reil_a
    mtl_resh_reil_b = mtl_girder_reil_b
    mtl_resh_reil_c = mtl_girder_reil_c
    mtl_roof_red_iov = roof_metal_01
    mtl_rope2-1 = prop_provod_01
    mtl_rope3-1 = prop_provod_02
    mtl_rusty_0 = mtl_rja_02
    mtl_rust_dark_iov = mtl_rust_dark
    mtl_rza_ch_01 = mtl_rja_blue
    mtl_stena_ch ~ mtl_pod_01
    mtl_stena_ch_06 = mtl_walls8
    mtl_stena_ch_08 = mtl_stena_08
    mtl_stena_ch_10 ~ 
    mtl_stena_old_iov = mtl_walls8_old
    mtl_trub_gr ~ mtl_rust_dark_v
    mtl_tubes2 ~ mtl_tubes1
    mtl_tubes3a = mtl_tubes3b
    mtl_tubes3c = mtl_tubes3b
    mtl_tubes4 = mtl_tubes1
    mtl_tubes6 ~ mtl_tubes1
    mtl_ventel_ql = mtl_ventel
    mtl_vorota_a = door_gate_metal_03
    mtl_wall_gr ~ mtl_rja_01
    mtl_wall_j02a = mtl_rja_01
    mtl_walls1 = mtl_rja_01
    mtl_walls1_b = mtl_rja_01
    mtl_walls2 ~ mtl_railroad_items
    mtl_walls2_1 = mtl_railroad_items
    mtl_walls5 ~ mtl_rja_green
    mtl_walls7 = mtl_walls10
    mtl_walls11_tail = mtl_walls11
    mtl_walls13 = mtl_walls11b
    mtl_walls14 = mtl_walls11c
    mtl_walls15 ~ mtl_rja_01
    mtl_walls16 = door_gate_metal_04
    mtl_walls18 = mtl_rja_blue
    mtl_x-support1 = mtl_x_support_alpha
    mtl_x-support2 = mtl_x_support
    mtl_zakl_ch_01 = mtl_walls9b
    mtl_z_trba = mtl_stena_ch_04
    ;--------------------------------------------------------------------
    prop_batarea_p = mtl_batarea_p
    prop_bathhole1 = prop_bathhole
    prop_bathhole2 ~ prop_grate1
    prop_bed2a ~ prop_blind01
    prop_busdead1 = veh_busdead1
    prop_ceil2 = wall_ceiling_01
    prop_door1 = door_wood_03
    prop_door2 = door_metal_02
    prop_door3 = door_electricunit_03
    prop_door4 = door_gate_metal_01
    prop_door5 = door_metal_03
    prop_door6 = door_white_03
    prop_door7 = door_gate_metal_02
    prop_door9 = door_white_04
    prop_door_a = door_wood_03
    prop_door_ql = door_wood_06
    prop_door_tual = door_wood_04
    prop_elec_door_01 = door_electricunit_04
    prop_elec_door_01_wall ~ mtl_rja_blue
    prop_elec_kran = prop_girder_01
    prop_elec_kran_a = prop_girder_01
    prop_elec_kran_02 = prop_elec_kran
    prop_electricalunit3b = prop_electricalunit3c
    prop_electroengine1 ~ prop_electroengine2
    prop_garbage1 = prop_elec_kran
    prop_gidravlika ~ mtl_balka_ch_01 / mtl_truba_factory
    prop_grate2 = prop_grate_01
    prop_grate5 = prop_grate_02
    prop_house_door1 = door_white_05
    prop_house_door2 = door_white_05
    prop_lamppost2 = prop_lamppost2a
    prop_lep1 = mtl_girder_reil_b
    prop_lep1a = mtl_girder_reil_c
    prop_lift_door = door_lift_01
    prop_musor_01_1 = prop_musor_01
    prop_mus_kont_01a = prop_musor_02
    prop_osadok_iov ~ detail_grnd_yantar
    prop_plitka_lab2 = tile_plitka_lab
    prop_provod_05 = prop_provod_01
    prop_roadborder_2iov = prop_roadborder_2
    prop_roadborder_j2d ~ crete_border_02
    prop_roadborder1 = prop_roadborder_1
    prop_stupeni_a = crete_stupeni_a
    prop_stupeni_b = crete_stupeni_b
    prop_tabl_pod_01 = sign_nuke_zone
    prop_trainwheel2 = prop_trainwheel1
    prop_trainwheel2a = prop_trainwheel1a
    prop_trash_1 = grnd_garbage
    prop_vagon04 = veh_vagon1_03
    prop_vagon_iov2 = prop_vagon_part
    prop_waterpump1_step = mtl_steps1
    ;--------------------------------------------------------------------
    sign_set_iov = sign_set
    sign_set2_iov = sign_set2
    sign_vorota_iov = sign_vorota
    ;--------------------------------------------------------------------
    ston_asfalt_a = detail_grnd_asphalt
    ston_asfalt_a_gray = detail_grnd_asphalt
    ston_asfalt_iov_old_01 = detail_grnd_asphalt
    ston_asfalt_sm_iov = grnd_asphalt_01
    ston_beton04 = crete_walls_01
    ston_beton_01d = crete_beton_01d
    ston_beton_03 = crete_beton_03
    ston_beton_ch_01 = crete_walls_01
    ston_beton_ch_02 ~ crete_walls_01
    ston_beton_ch_03 = crete_beton_ch_03
    ston_beton_ch_06 = crete_beton_ch_06
    ston_beton_ch_08 = crete_stena_ch_08
    ston_beton_ch_09 = floor_tile_05
    ston_beton_ch_10 = crete_beton_7 / 
    ston_beton_ch_13 ~ ston_beton_ch_12
    ston_beton_ch_141 = crete_beton_slag
    ston_beton_ch_15 = crete_beton_7
    ston_beton_iov_01 = crete_beton_plita_3
    ston_beton_iov_02 = crete_beton_plita
    ston_beton_iov_05 = crete_beton_dirt_01
    ston_beton_iov_06 ~ crete_beton_dirt_01
    ston_beton_iov_dirt_01 = crete_beton_dirt_01
    ston_beton_pod_01 = crete_debris_01
    ston_beton_pod_03 = crete_beton_pod_03
    ston_beton_potolok_contrast_iov = 
    ston_beton_potolok_iov ~ wall_ceiling_01
    ston_beton_potolok2_iov = wall_ceiling_01
    ston_beton_stena_iov = crete_beton_5
    ston_beton_stena_iov_hi = crete_beton_5
    ston_beton_stena_iov_n = 
    ston_big_iov = crete_beton_3
    ston_bordur = prop_border
    ston_bordur_j01 ~ ston_beton_ch_04
    ston_bordur_j02b = wall_border_05
    ston_brick_rostok_1 ~ briks_br4
    ston_bricks_ql ~ briks_br4
    ston_bricks1 ~ briks_dirt_01
    ston_bricks3b ~ ston_bricks3
    ston_bricks4 = briks_big_01
    ston_bricks5 = briks_tube_02
    ston_bricks8_bez_zeleni = 
    ston_bricks10 = briks_inside_02
    ston_briks_ch ~ briks_br3
    ston_briks_iov_dirt_01 = briks_dirt_01
    ston_brickinside_iov = briks_inside_01
    ston_br_hr_iov = briks_br1
    ston_br2_iov = briks_br2
    ston_kirpichi_a = briks_stucco
    ston_marble_br_iov = tile_marble_1
    ston_megabrick_iov = briks_br3
    ston_megabrick_iov_1 = briks_br3
    ston_mramor_iov = tile_marble_2
    ston_musor_iov = grnd_dirt_dust_02
    ston_oblicovka_dark03 = tile_border_dark_01
    ston_old_beton_iov = crete_old_beton
    ston_old_wall_iov = wall_stucco_11
    ston_osnova ~ crete_beton_dirt_01
    ston_plints1 = wall_stena_01b
    ston_plitka_y_02 = tile_plitka_y_02
    ston_plitka_iov_green = tile_green
    ston_plitka_iov_wall_01 = 
    ston_plitka_pink_iov ~ tile_walls_pink_01
    ston_pol_m_01 ~ floor_tile_09
    ston_pol_m_iov_01 ~ floor_tile_10
    ston_pol_m_iov_02 ~ floor_tile_10
    ston_pol_smola_iov = floor_pitch_01
    ston_rocks1 = grnd_rocks_01
    ston_reka_ch = crete_border_01
    ston_srarkon_iov = wall_stucco_04
    ston_stanc = crete_stanc
    ston_stanc_bl = crete_stanc_black
    ston_stanc_g = crete_stanc_g
    ston_stena_04a = crete_stena_04a
    ston_stena_04d = crete_stena_04d
    ston_stena_04e = crete_stena_04e
    ston_stena_04f = crete_stena_04f
    ston_stena_04g = crete_stena_04g
    ston_stena_04h = crete_stena_04h
    ston_stena_05b = wall_stena_05b
    ston_stena_05b_i = wall_stena_05b
    ston_stena_06a = briks_inside_03
    ston_stena_07_a_j = crete_stena_07_a_j
    ston_stena_07_d = prop_stena_07_d
    ston_stena_ch = tile_stena_ch
    ston_stena_ch_05 ~ crete_stanc
    ston_stena_ch_07 ~ mtl_sarcofag_01
    ston_stena_ch_11_1 = crete_house_wall_1
    ston_stena_ch_11_2 = crete_stena_ch_11_2
    ston_stena_ch_12 = crete_stena_ch_12
    ston_stena_ch_13 = crete_stena_ch_13
    ston_stena_ch_131 = crete_stena_ch_13
    ston_stena_ch_14 = crete_stena_ch_14
    ston_stena_ch_15 = crete_stena_ch_15
    ston_stena_da_01 = wall_stucco_05
    ston_stena_marbl_m_03 ~ crete_beton_3
    ston_stena_pod_04 = wall_stucco_08
    ston_stena_pod_08 = wall_border_02
    ston_stena_pod_09 = wall_stucco_02
    ston_stena_yz_iov = wall_stucco_13
    ston_stolb_rail = crete_stolb_rail
    ston_stuccowall_iov_01 ~ wall_stucco_01 (out) / wall_stucco_05 (in)
    ston_stuccowall2_iov = wall_stucco_12
    ston_stuccowall3_iov = wall_stucco_10
    ston_stupeni_iov = crete_stupeni_c
    ston_tr_iov = crete_dirt_2
    ston_trotuar_sm_iov = floor_tile_08
    ston_truba_ch = crete_truba_ch
    ston_walls1 ~ crete_walls_old_01
    ston_walls1_1 = crete_walls_old_01
    ston_walls2 = crete_beton_dirt_01
    ston_walls2_1 = crete_dirt_any
    ston_walls3 ~ crete_walls10
    ston_walls5 = crete_border_02
    ston_zabor_iov = crete_zabor
    ston_zabor_02 = crete_zabor_02
    ;--------------------------------------------------------------------
    veh_diesel2c = veh_diesel1c
    ;--------------------------------------------------------------------
    wind_01 = wind_gr04
    wind_02_ch = wind_09
    wind_03_ch = wind_03
    wind_04_ch = wind_08
    wind_04_ch_transp = wind_transp
    wind_04_pryp_01 = wind_04
    wind_05_ch = wind_07
    wind_hr_gr1 = wall_hr_gr1
    wind_hr_gr2 = wall_hr_gr2
    wind_j04c ~ prop_grate1
    ;--------------------------------------------------------------------
    wood_dosk_gr01 = wood_gr01
    wood_doski_1 = wood_doski
    wood_doski2 = wood_doski
    wood_iov_bench = wood_old_iov
    wood_parquet_iov = floor_parket_03
    wood_parket_01 = floor_parket_02
    wood_parket_gr01a = floor_parket_02
    wood_plank4 = wood_old
    wood_plank5 = wood_stolb
    wood_plank6 = (h_ tex)
    wood_plank6_bar = (h_ tex)
    wood_plank9r ~ wood_plank6 (h_ tex)
    wood_walls3 ~ wood_doski / wood_old_iov
    wood_walls4a = wood_walls4
    wood_walls7 ~ wood_old_iov
    wood_walls7_dark ~ wood_old_iov
    wood_walls10 ~ wood_walls1
    wood_walls11 ~ wood_old
    wood_walls11_zelen ~ wood_old
    wood_zabor_iov = wood_fence_01
    ;--------------------------------------------------------------------
    wm_board_a = decal_board_1b
    wm_dirt_01 = decal_dirt_01
    wm_graz1 = decal_graz1
    wm_graz3 = decal_graz3
    wm_pl_1 = decal_plakat_4
    wm_pl_3 = decal_plakat_1
    ;--------------------------------------------------------------------


  4. Скриптование
    Скриптование
    19 часов назад, Labadal сказал:

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

    Например, сняв искомый флаг в нет-пакете объекта с помощью модуля m_netpk от Артоса:

    local sobj = alife():create(section, position, lvid, gvid)
    if sobj then
    	local pk = get_netpk(sobj)
    	if pk:isOk() then
    		local data = pk:get()
    		data.object_flags = bit_and(data.object_flags, bit_not(object_flags.UsedAI_Locations)) -- сброс флага привязки к сетке (128)
    		pk:set(data)
    	end
    end

     


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

    @DarkSnowder , штатный параметр логики НПС: show_spot
    Примеры использования в оригинале: сотоварищи Петрухи на Кордоне, десантоспецназ, высаживающийся на Агропроме после спасения группы Крота.


  6. [SOC] Мелкие правки движка
    [SOC] Мелкие правки движка

    Делаю первые шаги в C++ :) Так что сильно не пинайте. Но, правочки такой, почему-то никто не выкладывал. Выложу тогда я.
     

    Скрытый текст

     

    Добавление возможности автокоррекции размеров иконок и сеток, в окнах слотов и инвентаря.

    Править потребовалось один единственный файл: xrGame/ui/UIXmlInit.cpp

    Один метод в нем, изменил вот так:

    
    bool CUIXmlInit::InitDragDropListEx(CUIXml& xml_doc, const char* path, int index, CUIDragDropListEx* pWnd)
    {
    	R_ASSERT3(xml_doc.NavigateToNode(path,index), "XML node not found", path);
    
    	float x			= xml_doc.ReadAttribFlt(path, index, "x");
    	float y			= xml_doc.ReadAttribFlt(path, index, "y");
    	float width		= xml_doc.ReadAttribFlt(path, index, "width");
    	float height	= xml_doc.ReadAttribFlt(path, index, "height");
    
    	InitAlignment	(xml_doc, path, index, x, y, pWnd);
    
    	pWnd->Init		(x,y, width,height);
    
    	Ivector2 w_cell_sz, w_cells, w_cell_sp; 
    	// Add by Zander
    	Fvector2 device_scale;
    	device_scale.x = 1024.0f / _max((float)Device.dwWidth, 1.0f);
    	device_scale.y = 768.0f / _max((float)Device.dwHeight, 1.0f);
    
    	int autclc = xml_doc.ReadAttribInt(path, index, "autocalc", 0);
    	int cellmin = xml_doc.ReadAttribInt(path, index, "cell_minimals", 0);
    	// end 
    	w_cell_sz.x				= xml_doc.ReadAttribInt(path, index, "cell_width");
    	w_cell_sz.y				= xml_doc.ReadAttribInt(path, index, "cell_height");
    	// Add by Zander
    	if (autclc == 1) {
    		w_cell_sz.x = (int)round(w_cell_sz.x * device_scale.x);
    		w_cell_sz.y = (int)round(w_cell_sz.y * device_scale.y);
    	}
    	if (autclc == 2) {
    		w_cell_sz.x = (int)round(50.0f * device_scale.x);
    		w_cell_sz.y = (int)round(50.0f * device_scale.y);
    	}
    	// end
    	w_cells.y				= xml_doc.ReadAttribInt(path, index, "rows_num");
    	w_cells.x				= xml_doc.ReadAttribInt(path, index, "cols_num");
    	// Add by Zander
    	if (cellmin == 1) { // Приоритет - необходимое число ячеек в указанном объеме
    		int w_cell_sz_x = (int)trunc(width / _max((float)w_cells.x, 1.0f));
    		int w_cell_sz_y = (int)trunc(height / _max((float)w_cells.y, 1.0f));
    		if (w_cell_sz_x < w_cell_sz.x) w_cell_sz.x = w_cell_sz_x;
    		if (w_cell_sz_y < w_cell_sz.y) w_cell_sz.y = w_cell_sz_y;
    	}
    	else { // Приоритет - правильный размер иконок и сетки
    		if (autclc == 1) { // Заполняем сетку максимально
    			w_cells.x = (int)trunc(width / _max((float)w_cell_sz.x, 1.0f));
    			w_cells.y = (int)trunc(height / _max((float)w_cell_sz.y, 1.0f));
    		}
    	}
    	// end
    	w_cell_sp.x				= xml_doc.ReadAttribInt(path, index, "cell_sp_x", 0);
    	w_cell_sp.y				= xml_doc.ReadAttribInt(path, index, "cell_sp_y", 0);
    
    	pWnd->SetCellSize		(w_cell_sz);	
    	pWnd->SetCellsSpacing		(w_cell_sp);	
    	pWnd->SetStartCellsCapacity	(w_cells);	
    
    	int tmp					= xml_doc.ReadAttribInt(path, index, "unlimited", 0);
    	pWnd->SetAutoGrow		(tmp!=0);
    	tmp						= xml_doc.ReadAttribInt(path, index, "group_similar", 0);
    	pWnd->SetGrouping		(tmp!=0);
    	tmp						= xml_doc.ReadAttribInt(path, index, "custom_placement", 1);
    	pWnd->SetCustomPlacement(tmp!=0);
    	tmp						= xml_doc.ReadAttribInt(path, index, "vertical_placement", 0);
    	pWnd->SetVerticalPlacement(tmp != 0);
    	tmp						= xml_doc.ReadAttribInt(path, index, "show_grid", 1);
    	pWnd->SetDrawGrid		(tmp != 0);
    	tmp 					= xml_doc.ReadAttribInt(path, index, "condition_progress_bar", 0);
    	pWnd->SetConditionProgBarVisibility(tmp!=0);	
    
    	if (xr_strlen(path))
    		pWnd->SetWindowName (path, TRUE);
    
    	return true;
    }

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

    autocalc (возможные значения - 0,1,2) - необходимость пересчитывать размер ячеек сетки и иконок.

    cell_minimals (возможные значения - 0,1) - необходимость во что бы то ни стало вместить указанное количество ячеек в заданные размеры окна.

    Если эти атрибуты в конфигах отсутствуют, или указано значение 0 - то поведение в точности такое же, как и раньше. Сетка/иконки выводятся в координатах 1024х768, в тех размерах и координатах, что указаны в xml.

    autocalc="1" - ячейки иконок примут размер в пикселах, указанный в xml, на мониторе конечного пользователя с учетом его разрешения. Т.е. если например у нас написано

    
    <dragdrop_bag cell_width="42" cell_height="42" autocalc="1"/>

    То 1 клетка сетки/иконок примет размер 42х42 пиксела на мониторе юзера. И не важно, какое у него разрешение, и насколько оно (не)похоже на то, что имели в виду составители xml конфига.

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

    autocalc="2" - для ленивых) Поведение то же, что и в предыдущем варианте, но подгонять сетку будет к размеру 50х50, игнорируя указания cell_width, cell_height.

    cell_minimals="1" - Это для слотов. Если указано 1, окно слота маленькое, и указанное число ячеек в нем не помещается, то размер ячейки дополнительно ужимается до того чтобы поместилось. Это все опять же на экране пользователя с учетом его разрешения.

    Ну и бонусом, если для окна инвентаря указать autocalc 1 или 2, и cell_minimals 0, то размер ячейки будет изменен с учетом разрешения монитора пользователя, а сетка инвентаря переформирована под то число ячеек, которое в нее поместится с учетом этого изменения. Игнорируя указанные в xml значения rows_num и cols_num.

    У себя проверил - работает... может быть, пригодится кому-то)

     

     


  7. Скриптование
    Скриптование

    @mole venomous

    1. При построчном чтении конфига выводятся три переменных: пустышка, имя параметра, значение.

    2. Конфиг [keep_items] достаточно вычитать один раз – см. последний пример.

    Spoiler
    function drop_all_items()
    	local function fx(item)
    		db.actor:drop_item(item)
    	end
    
    	db.actor:inventory_for_each(fx)		-- кроме квестовых и специальных предметов
    end

     

    Spoiler
    local t = {}
    
    function drop_all_items()
    	local function fx(dummy, item)
    		t[#t +1] = item					-- можно заносить в таблицу сами предметы – drop_item позволяет обходить пустышки
    	end
    
    	db.actor:iterate_inventory(fx, nil)
    	
    	for i = 1, 5 do						-- несколько случайных предметов
    		local k = math.random(#t)		-- случайный ключ
    		db.actor:drop_item( t[k] )
    		table.remove(t, k)				-- построчная очистка
    	end
    end

     

    Spoiler
    local keep = {}				-- полный список; заполняется один раз
    keep.bolt = true
    keep.device_torch = true
    keep.device_pda = true
    
    local death_ini = ini_file("misc\\death_generic.ltx")
    local n = death_ini:line_count("keep_items")
    
    for i = 0, n -1 do
    	local dummy, sect, bool = death_ini:r_line("keep_items", i, "" , "")		-- три переменных: пустышка, параметр, значение (в данном случае true для всех)
    	keep[sect] = bool
    end
    
    
    local items = {}
    
    function drop_all_items()
    	local function list(dummy, item)
    		if not keep[ item:section() ] then				-- сверка по ключу (вместо перебора)
    			items[#items +1] = item						-- можно заносить в таблицу сами предметы – drop_item позволяет обходить пустышки без вылета
    			-- items[#items +1] = item:id()				-- вариант с id
    		end
    	end
    
    	db.actor:iterate_inventory(list, nil)
    	
    	for i = 1, #items do
    		db.actor:drop_item( items[i] )
    		-- db.actor:drop_item( level.object_by_id( items[i] ) )		-- вариант с id
    	end
    
    	items = {}					-- полная очистка
    end

     

     


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

    @Houdini_one 

    Скрытый текст
    
    function get_cost()
    	local t_cost = 0
    	local objects = {}
    	db.actor:iterate_inventory(function(d, o)
    		local sect = o:section()
    		if sect ~= "bolt" and sect ~= "device_pda" then
    			t_cost = t_cost + o:cost()
    			table.insert(objects, o)
    		end
    	end)
    	for _, obj in pairs(objects) do
    		local sobj = alife():object(obj:id())
    		if sobj then
    			alife():release(sobj, true)
    		end
    	end
    	dialogs.relocate_money(db.actor, t_cost, "in")
    end

     

     


  9. Ваши правки для Сталкер ЗП
    Ваши правки для Сталкер ЗП

    в реале подсветка сетки включается/выключается:

     

    Ссылка: https://yadi.sk/d/kj3ZhEbGt3ZuC

     

     


  10. Ваши правки для Сталкер ЧН
    Ваши правки для Сталкер ЧН

    Авто сохранения после взятии квеста для сталкер Чистое небо (примерно как в ЗП)

    Скрытый текст

    Автор: SaViMoN

    Скрытый текст

    Просьба, при добавлении в сборку или мод обязательно указать автора


×
×
  • Создать...