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

Правки для ОП-2.2

TestTest


Как убрать в сохранениях, красную надпись: "Сейв сделан в режиме разработчика!"?

В gamedata\scripts\ui\ui_load_dialog.script закомментировать двумя тире, эту строчку:

--db.dev_mode=sg:dev_mode()

Правка только скрывает красную надпись! Скрыть факт вмешательства в файлы мода, таким образом не удастся. У каждого сохранения в логе все равно будет приписка: "save created on DEVELOPER mode!". На офф-сайте с таким логом в сохранениях, делать нечего)).

image.jpg


Где скачать конфиги и скрипты ОП-2.2 релиза и патчей?

Ссылка на распакованные папки; config&scripts релиза и вышедшие патчи.


Нужен ли для ОП-2.2 правленый движок и fsgame.ltx для игры с правками?

Правленый движок в ОП-2.2, для игры с правками не нужен. Редактировать fsgame.ltx на чтение из каталога игры, папки gamedata, тоже не нужно, т.к. это уже прописано в оригинальном файле:

$game_data$   		= true|		true|	$fs_root$|			gamedata\

Все остальное - суеверия))


Как отключить счётчики включения опций облегчённого прохождения в меню игры?

Находим счетчики в скриптах

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

В каждом файле по одному, кроме 4-го, в valerich_treasures.script - там их 2.
 

ui\ui_mm_opt_creator.script       - db.god.c[1] = db.god.c[1]+1    --"Бессмертие на некоторое время"
ui\ui_mm_opt_add.script            - db.god.c[2] = db.god.c[2]+1    --"Покупка квестового  предмета за 200000"
callbacks\key_handlers.script    - db.god.c[3] = db.god.c[3]+1    --"Суперпрыжок" 
valerich_treasures.script            - db.god.c[4] = db.god.c[4]+1    --"Метка на тайник Коллекционера"
kostya_dialog.script                    - db.god.c[5] = db.god.c[5]+1    --"Метки на документы Воронина"
spawn_level_changer.script       - db.god.c[6] = db.god.c[6]+1    --"Телепортация с неограниченным весом"

 

И приводим их к вот такому виду:

 

db.god.c[1] = 0
db.god.c[2] = 0
db.god.c[3] = 0
db.god.c[4] = 0 
 --(2 раза)
db.god.c[5] = 0
db.god.c[6] = 0

 


Что из правок нужно(можно) поставить для игры "без сюрпризов"?

Если вы решили играть с правками, в первую очередь нужно поставить "Античит". Взять его можно тут, или(как и все остальное) найти в теме: ОП 2.2: Правки и модификации. Так же желательно поставить "Отключение счетчиков облегченного прохождения" и смело ими пользоваться - тут вам, без дополнительных правок, и метки на тайники Коллекционера и документы Воронина, и бессмертие - для трудных моментов игры.

 

Прежде чем ставить правки на ослабление не убиваемых НПС и жутких монстров, а так же при тотальной нехватке всего и вся, возможно стоит попробовать снизить сложность)). Если есть вариант правки с отрубанием какой-то из спорных идей-реализаций, авторов ОП-2.2 и правка с "гуманизацией" этих "фишек" - лучше выбрать 2-й вариант. В остальном - ставьте только то, что вам нужно. Не пытайтесь "накатить" все и сразу. Вы или по неопытности сломаете игру или сделаете ее для себя не интересной. 


"База правок"

В стадии наполнения. К финальному патчу, в папку на яндекс-диске, по возможности, будет собрано все что будет к тому моменту выложено на форуме.

 


Ответы на вопросы "новичков"

 

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

gamedata\config\misc\safe_stealmanager_config.ltx

в самом начале файла:

[StealManager]
enable= true                                     ;ставим false и ничего не платим
protectionCostFirstPay=10000       ;первый взнос в рублях
protectionCostDayPay=5000          ;ежедневный взнос в рублях
bethDistance= 60                            ;расстояние для "умного" обкрадывания
traderDistance=6                             ;расстояние до торговца с платным хранилищем глобальное

=============

Эта правка не отключит все воровство! Об этом в FAQ-е тоже есть.

 

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

gamedata\config\alife.ltx

time_factor      = 5

Меняем на сколько нужно; единица вроде будет 1:1 как в реале, 50 - минуты будут меняться на глазах. Для применения эффекта, необходимо поспать.

==========

п.с. следует помнить, что на время завязаны погодные циклы и Выброс. Лишний раз "баловаться" изменением этого параметра, не стоит.

 

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

gamedata\config\weapons

Добавляем нолик или два, перед единицей для  интересующего вас ствола.

fire_dispersion_condition_factor   = 5.0    ;1.5        ;увеличение дисперсии в процентах при максимальном износе 
misfire_probability                         = 0.001 ;0.0004    ;вероятность осечки при максимальном износе -меняем тут.
misfire_condition_k                        = 0.05
condition_shot_dec                        = 0.00005    ;увеличение износа при каждом выстреле -тут правим износ, так же.

Если такого параметра в конфигах ствола нет, значит он наследуется от базового, для этого типа оружия. Что прописывается в  классах. Пример:

[wpn_kriss_m1]:wpn_kriss_super_v - наследует параметры от wpn_kriss_super_v

Дописываем этот misfire_probability и(или) этот, condition_shot_dec параметры ему в конфиг, или меняем у базового, если первое вызывает затруднения.

 

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

gamedata\config\creatures\actor.ltx
тщем:
max_item_mass   = 80 ;ставь хоть тонну
max_walk_weight = 90 ;столько же как в max_item_mass  + 10-50 кг.

gamedata\config\system.ltx
ищем;
max_weight    = 80 ; ставим как в max_item_mass

 

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

gamedata\scripts\arhara_dialog.script

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

--' получим аптечку и пм от Звездочёта
function noz_dat()
    got("wpn_pm")
    got("wpn_6x4_knife")
    got("medkit")
    got("medkit_scientic")
    got("mushroom")
    got("beer_a")
    got("conserva")
    got_money(3000)

end

===========================

Если хочется все "сделать красиво", правим еще и диалог, в:  config\text\dialogs_arhara.xml

Ищем в нем текст: "Ты вот что... Держи аптечку и пистолет. Патронов нет, извини." - и меняем на что угодно, насколько фантазии хватит :grin2:

 

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

gamedata\scripts\treasure.script

Находим этот код:

--' Юзание инициатора (возможность выдать тайник)
function CTreasure:use(npc)
    local se_npc = server_object(npc:id())
    if se_npc and se_npc.treasure_processed then return end
    se_npc.treasure_processed = true

    lootmoney.lootmoney(npc)
    local rarets=992
    -- если выбран редкий тип тайников, то снизим вероятность его выпадения
    if math.random(1000) < rarets then
        --log("return from use")
        return
    end

===========================

992 - это процентное соотношение к 1000, т.е. вероятность выпадения тайника: 0,8%. Больше 3% - 970, ставить не стоит. Да и то, только в начале игры, а как прибарахлились, лучше эту правку убрать.

 

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

gamedata\config\creatures\actor.ltx

Сделай как тут и будет тебе щастя:
; Физические размеры героя. Позволяет залезать в тесные пространства, например, в трубы.
ph_box0_center             = 0.0,  0.9,   0.0
ph_box0_size                 = 0.35, 0.9,   0.35
ph_box1_center                 = 0.0,  0.65,  0.0    ; 2-е значение - высота ГГ в присяде
ph_box1_size                 = 0.3, 0.65,  0.3   ; 2-е значение - высота ГГ в присяде
ph_box2_center                 = 0.0,  0.4,   0.0    ; 2-е значение - высота ГГ в полном присяде
ph_box2_size                 = 0.25, 0.4,   0.25   ; 2-е значение - высота ГГ в полном присяде
stalker_restrictor_radius   = .05;0.55;0.75;0.9 ; ограничение расстояния между сталкерами. Низкое значение полезно, когда кто-то загородил дорогу в тесных помещениях.
stalker_small_restrictor_radius   = .05;
medium_monster_restrictor_radius    = 0.1
===========================
Решение в сети гуляет очень давно)))
===========================
По "длинным рукам":
В system.ltx есть параметр take_dist = 2 ;ставь хоть 50 - это и есть расстояние в метрах. Но это может сломать игру. Т.к. тайники, особенно сюжетные, которые трудно взять, завязаны на рестрикторы и нужно именно подходить. Некоторые и не появятся, пока не наступишь на рестриктор, так что особого смысла в увеличении take_dist - нет. Если приперло, видишь но не можешь "дотянуться", поставить только на время проблемы и потом вернуть обратно. На постоянное использование, больше 2.8, лучше не ставить!

 


Небольшие правки в виде инструкций

 

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

В \scripts\ui\ui_main_menu.script добавляем внизу файла:

function main_menu:OnButton_load_clicked()
	local load_dlg = ui_load_dialog.load_dialog()
	load_dlg.owner = self
	
	self:GetHolder():start_stop_menu(load_dlg, true)
	self:GetHolder():start_stop_menu(self, true) --new
	self:Show(false)
end
--===мирилка с группировкой, функция===--
function relations(alians)
    relation_registry.set_community_goodwill (alians, "actor", 3000)
end
--===вместо 3000 ставим сколько надо===--
--===*******************************===--
function main_menu:OnKeyboard(dik, keyboard_action)  --virtual function
	CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
--	local bind = dik_to_bind(dik)
	if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
		if dik == DIK_keys.DIK_ESCAPE then
			if game_is_running() then
				ui_mm_opt_add.check_options()
				console:execute("main_menu off")
				archievements.mm_opt()
			end
--===мирилка с группировкой, вызов из меню на "G"===--	    
	    elseif dik == DIK_keys.DIK_G then
            relations("military")
            relations("bandit")
--===можно по одной, можно со всеми сразу замириться))===--
--===все группы в \config\creatures\game_relations.ltx===--
--===********************************************===--
		else
			key_handlers.handler_press(dik,dik_to_bind(dik))
		end
	end
	if keyboard_action == ui_events.WINDOW_KEY_RELEASED then
		key_handlers.handler_release(dik,dik_to_bind(dik))
	end
   
	return true
end

if ui_mm_opt_creator.get_bool_user_param("pause_on_load") then 
	autopause.main()
end

--===Комментарии копировать не нужно)))===--

по наводке от @Blum

Mirilka-s-gruppirovkami.jpg Mirilka-s-gruppirovkami-2.jpg

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

gamedata\config\weapons\ammo.ltx  

у нужных патронов включаем параметр:

tracer                   = on  ; вместо off

Цвет трассера задается этим параметром:

tracer_color_ID    = 0
А tracer_color_ID(ID - цвета от 0-4) это цвет трассера.

color_0  ;yellow
color_1  ;white
color_2  ;red
color_3  ;green
color_4  ;blue

Что бы включить трассеры у Винтореза, нужно в файле:

gamedata\config\weapons\w_vintorez.ltx

Их включить:

tracers              = on  ; вместо off

У именного  Винтореза включены по умолчанию.

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

от @RaFaJIb

============

Что-бы работало на статике, нужно выключить сглаживание.

============

Можно разнообразить и немного подкрасить цвета трассеров. Для этого в:

gamedata\config\weapons\weapons.ltx

находим таблицу цветов:

[tracers_color_table]    ;color_table

и приводим ее вот к такому виду:

color_1 = 1, 0.5, 0; orange
color_2 = 1, 0, 0; red
color_3 = 0.2, 0, 0; dark red
color_4 = 1, 1, 0; yellow
color_5 = 0.5, 0.1, 1 ; purple
color_6 = 0, 1, 0 ;green
color_7 = 1, 0, 1; magenta
color_8 = 0, 1, 1; cian
color_9 = 0, 0, 0.5; dark blue
color_10 = 0.2, 0.4, 1;blue
color_11 = 0, 0.2, 0 ;dark green
color_12 = 0.5, 0.5, 1; electra
color_13 = 1, 1, 1; white
color_0 = 0.2, 0.2, 0.2; grey
color_14 = 1, 0.5, 0.8 ;pink

В ammo.ltx задаем нужным патронам любой из этих цветов.

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

по наработкам для ОП-2.1 от @Mezocop

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

В script\nsafe\safe_stealmanager.script

найти два места 

self.enable=true 

self.enable=reader:readBool(self.classname,"enable",true) 

и заменить их на 

self.enable=false

self.enable=false

Кто-то по уму сделал скрипт, так что если enable=false, то обработка воровства не вызывается. 

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

от @voluntas88

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

Вырезаем алкоголизм ГГ
gamedata\scripts\amk\amk_alcohol.script

-- Алкоголь ГГ. Не более 5 бутылок в сутки.
local alc_cont=keyvals("amk_data"):get("alc_count", {})

function drink_vodka(obj)    
    table.insert(alc_cont, game.minutes())
    local limit = iif(has_info("acv_alk"),6,5)
    local sz=table.size(alc_cont)
-- тут вырезаем кусок кода (у кого подсмотрел, не помню)) --
    archievements.acv_count_event("acv_alk", 70, "acv_alk")
end

function update()
    local gm = game.minutes()

    for i=table.size(alc_cont),1,-1 do
        if gm > alc_cont+60*24 then
            table.remove(alc_cont, i)
        end
    end
end

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

от @AMK-forum

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

В скрипте bind_actor.script

Найти эту строчку:
               any_bot_dis_change=any_bot_dis_change or (is_actor_enemy or is_actor_danger or any_enemy_see_actor)

И заменить на это:
                any_bot_dis_change=false

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

от @bastor

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

Чтобы убрать этот поносный цвет в Саркофаге. С фонариком невозможно, а без фонарика не видно.
gamedata\config\scripts\sar
Файл - sar_monolith_noise
Сделать так:
active = nil

[sr_psy_antenna]
eff_intensity = 0
hit_intensity = 0
play_visual = false
;mute_sound_threshold = 1

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

от @karavan150 

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

gamedata\scripts\binders\bind_monster.script

-- Выбивание из рук оружия
local ac_slots={
    [inventory_slots.NO_ACT_SLOT]=false,
    [inventory_slots.KNIFE]=false,
    [inventory_slots.PISTOL]=false,
    [inventory_slots.RIFLE]=false,
    [inventory_slots.SHOTGUN]=false
}
-----------------

от @AMK-forum

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

scripts\monnoroch_options.script

blood_enable = 0 -- эффект ранения (1 - вкл , 0 - выкл)
scripts\ui\ui_hud_mask.script

local blood_enable = 0 -- эффект ранения
scripts\amk\amk.script

    -- Эффекты при падении здоровья
    if db.actor:alive() then
        if prev_health > db.actor.health+0.2 then
            level.add_pp_effector("amk_shoot.ppe", 2011, false)
            level.set_pp_effector_factor(2011, (prev_health-db.actor.health)*100)
            if prev_health > db.actor.health+0.9999 then
                local cameffs, sounds
                if prev_health > db.actor.health+0.9999 then 
-----------------

от @tihik

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

gamedata\scripts\zvuki.script 
Закомментировать как тут показано, эти строки:

        if difficulty > 0 then
        --    hide_wpn.on_info("rm_mp_start")
        --    local delay_time=db.eat_snd:length()/1000
        --    if delay_time<difficulty*3 then
        --        delay_time=difficulty*3
        --    end
        --    timer("zvuki", delay_time, "zvuki.restore_weapon()")
        end
        --if has_info("ui_inventory") then
        --    level.start_stop_menu(level.main_input_receiver(), true)
        --end
-----------------
от @Prophet13
============
Вариант от lexa.3012 - "Изящный"))) Выделил нужное синим.

		-- треть¤ рука, пр¤тание оружи¤ при съедании. на новичке не убираетс¤, далее по нарастающей
		local difficulty = level.get_game_difficulty()
		if difficulty > 0 then
			hide_wpn.on_info("rm_mp_start")
			local delay_time=db.eat_snd:length()/5000
			if delay_time<difficulty*0 then
				delay_time=difficulty*0
			end
			timer("zvuki", delay_time, "zvuki.restore_weapon()")
		end
		--[[if has_info("ui_inventory") then
			level.start_stop_menu(level.main_input_receiver(), true)
		end]]		
	end
end

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

Дополнение: отключение раздражающих звуков приема пищи и др. подобных звуков в этом же файле:

строки 35-74 содержат информацию о звуках. Для "проблемных" звуков удали/закомментируй целую строку, например:

bread = {"zwuk\\inv_sandwich","zwuk\\inv_kolbasa"},

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

от @voluntas88

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

scripts\ai\rx_gl.script

stor.can_fire = true ;false
stor.can_fire = true ;false

-----------------
от @Prophet13
Скрытый текст

scripts\ui\ui_hud_mask.script

Закомментировать(--) строчки:

--level.add_pp_effector ("alcohol.ppe", 2013, true)     

--level.remove_pp_effector (2013)

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

от @AMK-forum

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

scripts\binders\bind_stalker.script

--sak.zombie_checkup()

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

от @AMK-forum

Скрытый текст
scripts\ui\ui_mm_opt_add.script
    ["x16_physic_object_0004"]=true,
    ["x16_physic_object_0010"]=true
Меняем на:
    ["x16_physic_object_0004"]=false,
    ["x16_physic_object_0010"]=false
Далее, находясь в x16, заходим в настройки/игра, прописываем x16_physic_object_0004 и x16_physic_object_0010 в панель удаления проблемных объектов и удаляем.
-----------------
от @Prophet13
Скрытый текст

scripts\biodetector.script

     if item and bioradars[item:section()] and not bind_actor.scopeUsed then 

меняем на:

     if item and bioradars[item:section()] --and not bind_actor.scopeUsed

     then

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

от @shram_437

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

scripts\binders\bind_actor

--loc_radiation.update()

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

от @AMK-forum

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

 В xr_kamp.script сделать так:

        -- играть на гармошке
        local f = false -- item_state_relation["play_harmonica"].allowing(npc,self) 
        npc_states["play_harmonica"] = f
        npc_states["wait_harmonica"] = f
        self.kamp_states["pre_harmonica"] = f
        self.kamp_states["harmonica"] = f
        self.kamp_states["post_harmonica"] = f

        -- играть на гитаре
        f = false -- item_state_relation["play_guitar"].allowing(npc,self) 
        npc_states["play_guitar"] = f
        npc_states["wait_guitar"] = f
        self.kamp_states["pre_guitar"] = f
        self.kamp_states["guitar"] = f
        self.kamp_states["post_guitar"] = f

        -- играть на балалайке
        f = false -- item_state_relation["play_balalaika"].allowing(npc,self) 
        npc_states["play_balalaika"] = f
        npc_states["wait_balalaika"] = f
        self.kamp_states["pre_balalaika"] = f
        self.kamp_states["balalaika"] = f
        self.kamp_states["post_balalaika"] = f

        -- анекдоты
        f =  item_state_relation["joke"].allowing(npc,self) 
        self.kamp_states["pre_joke"] = f
        self.kamp_states["joke"] = f
        self.kamp_states["post_joke"] = f

        -- Если непись знает истории, надо добавить их к лагерю
        f = (f and db.story_by_id[npc:id()] ~= nil)
        self.kamp_states["story"] = f
        self.kamp_states["post_story"] = f
    end
end

 

По аналогии можно анекдоты и истории отключить, но так совсем не весело будет :grin2:

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

от @tihik

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

Пример на жетоне монолитовца. В gamedata\config\misc\quest_items.ltx находим по army_counter

[army_counter]:II_DOC
visual                     = dynamics\equipments\geton.ogf
description            = army_counter
inv_name               = army_counter_name
quest_item             = false  ;вместо true ставим false
inv_weight             = 0.01
inv_grid_width       = 2
inv_grid_height     = 1
inv_grid_x              = 69
inv_grid_y              = 16
cost                       = 100

То же самое можно проделать с любым предметом, даже если этой строчки в его конфиге нет. В таком случае ее нужно добавить. Некоторые предметы могут быть не в quest_items.ltx а в item.ltx

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

от @tihik

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

Для тех кого не устраивает фото со спутника могу предложить другой вариант:

В gamedata\scripts\binders смотрим файл bind_fot.script

В строке 468 if iAmMonster[clsid] and obj:alive() убираем and obj:alive()

Это позволит фотографировать убитых зверюшек.

в строках 474, 480, 485 смотрим self:obj_in_shot(obj:center()

Меняем первые две цифры на 0 и 30. Это позволит фотографировать от нуля до 30 метров.

Было:

self:obj_in_shot(obj:center(), 1, 3, 3.0, false, nil, nil, nil, nil, true)

Стало:

self:obj_in_shot(obj:center(), 0, 30, 3.0, false, nil, nil, nil, nil, true)

Для аномалий тоже самое.

Строка 504 if string.find(anom.name, anom_sect) and self:obj_in_shot(anom.pos, 5, 10, 3.5, false, nil, nil, nil, nil, false) then

меняем на if string.find(anom.name, anom_sect) and self:obj_in_shot(anom.pos, 0, 30, 3.5, false, nil, nil, nil, nil, false) then

Всё.

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

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

Рекомендуемая правка для фотографирования!

от @shahvkit

Скрытый текст
-- Путь: gamedata\scripts\flamethrower.script
-- Найти и сделать как ниже.
function mbald_removed_have()
	local value = get_value("mbald_removed", 0)
	return value >= 1                           ----- БЫЛО 3---------------- ЭКСПЕРИМЕНТЫ ВАСИЛЬЕВА---------------------------------------
end
function galant_removed_have()
	local value = get_value("galant_removed", 0)
	return value >= 1                           ----- БЫЛО 3---------------- ЭКСПЕРИМЕНТЫ ВАСИЛЬЕВА---------------------------------------
end
function mincer_removed_have()
	local value = get_value("mincer_removed", 0)
	return value >= 1                           ----- БЫЛО 3---------------- ЭКСПЕРИМЕНТЫ ВАСИЛЬЕВА---------------------------------------
end
--Проверяй. Должно быть достаточно по одной аннигиляции.
-----------------
от @lexa.3012
Скрытый текст
--Быстрое лечение, по квесту Доктора + на достижения.(стоит вылечить шесть NPC)
--Путь: gamedata\scripts\kostya_dialog.script
--Привести функцию к такому виду:
function doktor_lekar1_have()
	if not has_info("doktor_lekar1_start") or has_info("acv_lekar2") then return end

	local cnt = get_value("lekar",0)
	cnt = cnt+1

	if cnt == 1 then
		sms("%c[sender]"..translate("name_doktor")..":\\n%c[sms_red]"..translate("sms_doctor_doktor_lekar1_have_1_0"), nil, "doctor", 30000, nil, [[sms\doctor\doktor_lekar1_have_1]])
	elseif cnt == 2 then
		sms("%c[sender]"..translate("name_doktor")..":\\n%c[sms_red]"..translate("sms_doctor_doktor_lekar1_have_2_0"), nil, "doctor", 30000, nil, [[sms\doctor\doktor_lekar1_have_2]])
	elseif cnt == 3 then
		sms("%c[sender]"..translate("name_doktor")..":\\n%c[sms_red]"..translate("sms_doctor_doktor_lekar1_have_3_0"), nil, "doctor", 30000, nil, [[sms\doctor\doktor_lekar1_have_3]])
	elseif cnt == 4 then
		sms("%c[sender]"..translate("name_doktor")..":\\n%c[sms_red]"..translate("sms_doctor_doktor_lekar1_have_4_0"), nil, "doctor", 30000, nil, [[sms\doctor\doktor_lekar1_have_4]])
		give_info("doktor_lekar1_have")
	elseif cnt == 5 then
		give_info("acv_lekar")
	elseif cnt == 6 then
		give_info("acv_lekar2")
		del_value("lekar")
		return
	end

	set_value("lekar",cnt)
end 
---------------
от @AMK-forum

 


Мануалы

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

Как это реализовано:

В биндер монстров на коллбэк обыска (использования) добавлен обработчик события:

gamedata\scripts\binders\bind_monster.script:

function monster_binder:use_callback(obj, who)
...
	else
...
    --* вот это оно и есть: обыскиваем мутанта - запускаем, что будем делать.
		monster_parts.on_monster_use(obj, who) -- обыск трупа
	end
end

 

А в самом обработчике события уже всё остальное:

gamedatа\monster_parts.script:

--* список доступного оружия, которое может использоваться для срезания "запчастей" (из оружейных конфигов - по секции предмета).
local knives = {
	["wpn_oc4"]=true,--* <-- ага, наш ножичек :). gamedata\config\weapons\knife.ltx -> [wpn_oc4]:knife
...
    ["wpn_hand_axe"]=true
}

 

Далее проверяется его наличие у ГГ:

function actor_has_knife()
  --* У ГГ в "ножевом слоте" что-то есть?
    local item_in_slot=db.actor:item_in_slot(inventory_slots.KNIFE)
  --* Что-то есть и его состояние соответствует нужному для использования
    if item_in_slot and item_in_slot:condition()>0.1 then
  --* и оно из нужного нам списка (табл. knives для возможного использования при срезании)
        return knives[item_in_slot:section()] or false
    end
    return false
end

 

А при наступлении события (т.е., когда из биндера монстрюков вызываем обработчик), всё и делаем:

function on_part_take(obj)
--* проверяем, что у ГГ именно то оружие, которое должно быть, и запускаем половецкие пляски :)    
    if actor_has_knife() then
    --* закрываем инвентарь
        level.start_stop_menu(level.main_input_receiver(), true)
    --* отыгрываем звуковое сопровождение события
        if snd and snd:playing() then
            snd:stop()
        end
        snd = voice("zwuk\\inv_mutant_loot_"..math.random(1,16))
        snd:play_at_pos(db.actor, vector(), 0, sound_object.s2d)
    --* в случае, если надо - даём достижение
        archievements.acv_count_event("acv_gvdr", 500, "acv_gvdr")
    --* получаем оружие в ножевом слоте
        local knife=db.actor:item_in_slot(inventory_slots.KNIFE)
    --* вычитываем из его конфигов коэфф-т повреждения
        local cond_dec=ini_reader.iniReader():readString(knife:section(),"condition_shot_dec",0)
        if cond_dec~=0 then
    --* и "ломаем" до нужного
            knife:set_condition(knife:condition()-cond_dec)
        end
        return
    end
    --* тут дальше смк-ки, трансфер в ГГ и т.д.
    sms("on_part_take_0", nil, "nano", 5000)
    db.actor:transfer_item(obj, monster)
end

от @Купер

 

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

Для поиска нужно полностью распаковать все файлы мода или игры в отдельную папку включая все патчи и фиксы.


Поиск будет производиться с помощью программы Total Commander.
Разбираться и знать эту программу совсем не обязательно. Достаточно запомнить расположение всего одной кнопки.

Примеры:

1. Поиск конкретного оружия по его описанию:

Допустим вы прочитали вот такое описание нужного вам ствола

"FN SCAR-Н - боевая штурмовая винтовка калибра 7,62 НАТО, разработанная американским подразделением бельгийской компании FN Herstal в 2004 году. SCAR-H Mk.17 Mod.0 штатно комплектуется съёмными открытыми прицельными приспособлениями, состоящими из складного регулируемого по дальности диоптрического целика и складной же мушки. Кроме того, на винтовку могут устанавливаться любые дневные или ночные прицелы с соответствующими кронштейнами. Приклад у всех вариантов винтовки FN SCAR складной вбок. Ресурс ствола винтовки составляет 16 000 выстрелов и более."

и хотите найти его параметры и прочее.

Для этого открываете Total Commander, а в нём папку с распакованными файлами игры или мода.
Так как параметры предметов находятся в подпапке config, то для ускорения поиска вам нужно открыть уже эту папку config.
Далее нажимаете на иконку с рисунком бинокля в шапке программы, ставите галочку в квадратике "С текстом", и пишите справа от галочки нужный для поиска текст.
В нашем случае мы возьмём вот этот кусочек - подразделением бельгийской компании FN Herstal
ВНИМАНИЕ !!! Текст должен быть абсолютно точным включая пробелы и знаки препинания.
Далее нажимаете кнопку "Начать поиск" и ждёте его окончания.
В результате поиска был найден один файл. Это arsenal_mod.xml
Кликаете 2 раза левой кнопкой мышки на строке с найденным файлом в окне "Результаты поиска", и программа автоматически найдёт вам этот файл.
Далее открываете этот найденный файл в текстовом редакторе (хоть в блокноте) и ищете заданное вами словосочетание - подразделением бельгийской компании FN Herstal
Нужный вам текст идёт под заголовком - <string id="enc_arsenal_scar_cry">
Возвращаетесь в подпапку config, и снова запускаете поиск уже по словосочетанию - enc_arsenal_scar_cry
В результате поиска было найдено два файла, но нам нужен только один расположенный в подпапке config\weapons\arsenal_mod\ar
Это файл w_scar_cry.ltx.
Всё... Мы нашли нужный нам ствол.

Поиск предмета по его названию осуществляется точно также.

2. Поиск неизвестного предмета по фразам в диалогах:

Допустим в разговоре с Кузькиной матерью вы прочитали вот такой диалог

" У меня на Большой Земле племянница сильно заболела. Сестра моя очень упрямая и консервативная в этом вопросе, не признает никакие современные лекарства, и лечит дочку только травами. Я и в Зону-то подалась только из-за этого лекарства. Всё, что нужно, заготовила и спрятала в двух разных местах."

Берём кусочек диалога - У меня на Большой Земле племянница сильно заболела
и ищем по этим словам в папке config.
Находим в config\text\rus файл stable_dialogs_buusty.xml
Открываем его в текстовом редакторе и ищем эту фразу.
Эта фраза идёт под заголовком - <string id="kuzmat_dialog1_5">
Обращаем внимание на характерное слово - kuzmat
Опять запускаем поиск в папке config уже по этому слову.
В результате будет найдено очень много файлов, но нас интересует предмет, а конфиги предметов обычно прописаны в подпапке config\misc
В этой подпапке найдено два файла.
Просматриваем оба на наличие слова kuzmat, и в файле arhara_items.ltx находим нужный предмет.
Это lekarstvo_kuzmat.

Также как и в примере с оружием можно найти тоже самое по названию предмета.

Например вы случайно продали одну банку настойки "Цитомегалия" для Кузькиной матери, и хотите её заспавнить, прописать в продажу и так далее...

Ищем по точному названию предмета. Это слово - Цитомегалия
Поиск вывел название файла содержащего это слово - string_table_enc_equipment.xml
Открываем этот файл, ищем нужное слово и смотрим как оно прописано в файлах игры
<string id="lekarstvo_kuzmat">
   <text>Настойка "Цитомегалия"</text>

    </string>
   <string id="enc_equipment_lekarstvo_kuzmat">

  <text>Лекарственный сбор "Цитомегалия". Способствует подавлению вирусной и бактериальной инфекции. Предупреждает и тормозит воспалительные процессы в организме. Повышает иммунитет, оказывает общеукрепляющее, защитное действие. Настоен на чистом спирту. Не употреблять в чистом виде и без особых рекомендаций врача!</text>

 </string>
Далее:
Берём например enc_equipment_lekarstvo_kuzmat и снова запускаем поиск уже по этому новому слову.
Получаем наводку на другой файл содержащий конфиги предметов - arhara_items.ltx
Открываем этот новый файл и ищем enc_equipment_lekarstvo_kuzmat

Получаем название предмета:
[lekarstvo_kuzmat]:lekarstvo
description = enc_equipment_lekarstvo_kuzmat
inv_name = lekarstvo_kuzmat
inv_name_short = lekarstvo_kuzmat


Всё...

3. Замена награды в квестах:

Допустим вы хотите заменить автомат выдаваемый Волком на что то другое.
Сохраняемся перед сдачей квеста, сдаём его и смотрим какой автомат получили.
Находим (как описано выше) точное название этого автомата.
Пусть это будет wpn_ak74u.
В папке scripts запускаем поиск по wpn_ak74u
Будет найдено очень много файлов которые придётся просмотреть на предмет нахождения wpn_ak74u.
Ищем наиболее подходящее по смыслу.
Находим требуемое в файле sak_dialog.script.
Это
function take_sescape_lager_volk_ak(first_speaker, second_speaker)
dialogs.relocate_item_section(first_speaker, "wpn_ak74u", "in")
end

Заменяем название оружия в скобочках на нужное.
function take_sescape_lager_volk_ak(first_speaker, second_speaker)
dialogs.relocate_item_section(first_speaker, "wpn_vintorez", "in")
end

Снова загружаем сделанное ранее сохранение, и получаем у Волка Винторез.

Если нужно много предметов, то просто дублируем строку и вставляем нужное.
function take_sescape_lager_volk_ak(first_speaker, second_speaker)
dialogs.relocate_item_section(first_speaker, "wpn_vintorez", "in")
dialogs.relocate_item_section(first_speaker, "wpn_spas12", "in")
end


Если нужны деньги, то добавляем следующее:
dialogs.relocate_money(second_speaker, 10000, "in")
где 10000 - это сумма.

Если нужно много патронов, то добавляем следующее:
sak.create_items_actor("ammo_12x70_kart",9)
где 9 - это количество пачек

Аптечки, гранаты и прочее добавляются точно также.

ИТОГО:

Такими способами можно найти что угодно и где угодно, вплоть до поршней и что вам еще взбредет в голову.

p.s.
В Total Commander есть ещё одна полезная функция - это сравнение файлов по содержимому.
Открываем в левой и правой половинах программы файлы которые вы хотите сравнить. Они должны иметь одинаковое название.
Выделяете нужный вам файл. и в шапке программы под заголовком "файлы" нажимаете на - Сравнить по содержимому...
Изменения в файлах будут выделены другим цветом.
С помощью этого сравнения можно корректировать что угодно. Например подогнать скрипты под новый патч.

p.p.s.
Надеюсь после описанного выше в темах по моду будет поменьше одинаковых и просто осточертевших просьб типа - как называется и где находится...

 

Ссылка на оригинал инструкции от @shahvkit

 

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

Поскольку все давно написано, копипастить не вижу смысла. Но сразу предупреждаю; оно вам не надо. Но если все же возьметесь и осилите - то вы готовый модер)). В теме ковыряния, с такими вопросами, делать нечего. Это скорее в разработку. Но там вас с вероятностью в 99.9%, пошлют. В общем, вот, для желающих самостоятельно разобраться, собранный в один пост мануал от комрада @shahvkitссылка

 

Скрытый текст
Настройка Total Commander для работы с ОП-2.2 (Скрыть)

Дабы не спрашивали в дальнейшем, по распаковке архивов игры, все очень просто. Нужен Total Commander и плагины:
 

wcx_stalker_db_003_x32_x64 - архиваторный плагин. Работает именно с архивами, по одному. Можно ассоциировать каждый тип .db с плагином, и тогда все .db будут открываться по ЛКМ, но проще работать через ctrl+Page Down (выделяя нужный архив и нажимая эти кнопки).


wfx_stalker_db_004_x32_x64 - плагин файловой системы. Позволяет просмотреть сталкерские архивы в виде виртуального каталога с сохранением структуры папок. По идее, гораздо удобнее, но не всегда нужно смотреть и распаковывать все.

 

Устанавливаются оба плагина, двойным кликом ЛКМ в ТС.


wcx_stalker_db_003_x32_x64 - по ctrl+Page Down работает сразу, но можно заморочиться и прописать ассоциации, для каждого архива ОП-2.2

wfx_stalker_db_004_x32_x64 - по идее тоже должен работать сразу "из коробки". Но если вдруг что-то пошло не так, или у вас ОП-2.2 установлен "в ручную" без записи в реестре, нужно настроить в папке плагина, по TotalCMD\Plugins\wfx\stalker\stalker.ini  
Пример настройки stalker.ini для нескольких версий ОП-2.2:

[main] use_registry = 1 [installations] SHOC1 = 3312ru|D:\Games\OP2.2p2origin\ SHOC2 = 3312ru|D:\Games\OP2.2p2mod\ SHOC3 = 3312ru|D:\Games\OP2.2p1orig\

[main]
use_registry = 1

[installations]
SHOC1 = 3312ru|D:\Games\OP2.2p2origin\
SHOC2 = 3312ru|D:\Games\OP2.2p2mod\
SHOC3 = 3312ru|D:\Games\OP2.2p1orig\

Не пытайтесь с помощью этих плагинов изменить или перепаковать игровые архивы! Плагинами можно только просматривать и извлекать файлы игры. Для упаковки можно использовать Конвертер от Bardaka.
---------------

Ссылка - на плагины, инструкцию в .docx, наглядные скрины и рабочий конвертер для упаковки правок для ОП-2.2.

Total Commander - найти в сети актуальную версию, не сложно.

 

 

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

Спрашивали тут про правку на слоты артефактов в инвентаре. По сути ничего не изменилось, как и прежде, если не стоит задачи сделать глобально, под все разрешения и варианты инвентаря, нужно править файл своего разрешения. Только теперь, вариантов инвентаря стало намного больше и лежат они не в config\ui\, а в skins_ui\inventory\ - тут нужно выбрать свой вариант и разрешение инвентаря, в моем случае получается 16х9: gamedata\skins_ui\inventory\default\config\ui\inventory_new_16.xml. Может так же быть и inventory_new.xml и inventory_new_21.xml. Если не планируете менять инвентарь во время игры, то и заморачиваться с вариантами, не нужно. Сам инвентарь нужно выбрать свой, у вас может быть любой из этих:

1421-cr.png

Дальше все стандартно, нужны вот эти две строки в inventory_new_16.xml:

<!-- *************** Инвентарь ячейки артов ***************** -->
    <dragdrop_belt x="697" y="285" width="306" height="100"
            cell_width = "21" cell_height="26" rows_num="3" cols_num="10">
<!-- ******************************************************** -->

В первой строчке, позиция сетки по Х-Y. Их можно немного подкорректировать, но только после выбора и подгонки размера ячеек, обычно на пару пикселей достаточно, что-бы выровнять относительно текстуры.

Вторая строка. Первые 2 цифры "cell_width" - ширина и "cell_height" высота, для других инвентарей и разрешений цифры будут другие и их придется настраивать самому, меняя и загружаясь в игру(из слотов на это время все лучше убрать, хотя это же не ружжо, вылета не будет), что-бы квадратики более-менее ровные получились.

"rows_num" - строки таблицы артефактов, cols_num - столбцы. У меня оптимально, не сдвигая сетку вверх, на описание брони и не опуская вниз, получилось 3х10=30 ячеек. На других разрешениях возможно лучше будет смотреться 2х10 или 3х8, к примеру, или 5х15))), в общем, сколько хотите - столько и пихайте. Но 30 - уже слишком много. Только из эстетических соображений так сделал - смотрится и вписывается, как там и было:

ss-admin-01-14-22-08-49-07-l01-escape.jp

Пока подогнал, раз 10 перезагружался в игру. На этом с сеткой закончили.

Теперь дополнительные ячейки нужно "активировать". Что-бы все 30 ячеек работали, их количество надо прописать в gamedata\config\system.ltx

Строка:

max_belt    = 14 
вместо 14 ставим свое количество ячеек:
max_belt    = 30

На этом настройка панели артефактов завершена.

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

Для полного щастя осталось снять ограничения в scripts\inventory.script
Что-бы не мелочиться, делаем так:

self.imm_limits = {100, 86, 73, 60}
меняем на:
self.imm_limits = {999999, 999999, 999999, 999999}

И обвешавшись гирляндой из артефактов, можно смело топать на ЧАЭС-2 кошмарить Когтя смерти и прочих неубивашек 

Мануал по настройке панели артефактов в формате .docx

 

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

Все волшебство тут, погляди для саморазвития, показометр синий(только кнопки надо свои назначать) спавнер - зеленый.

==============================================

function main_menu:StartGame()
    ui_mm_opt_add.check_options()

    if (alife() ~= nil) then
        console:execute    ("disconnect")    
    end
    
    console:execute("start server(all/single/alife/new) client(localhost)")
    console:execute("main_menu off")
    archievements.on_new_game()
end

--===спавнер===--
function main_menu:OnButton_load_spawn()
    if self.spawn_dlg == nil then
        self.spawn_dlg = ui_cheat_naxac.cheat_menu()
    self.spawn_dlg.owner = self
end

    self:GetHolder():start_stop_menu(self.spawn_dlg, true)
    self:GetHolder():start_stop_menu(self, true) --new
    self:Show(false)
end
--===спавнер===--

function main_menu:OnButton_save_clicked()
    local save_dlg = ui_save_dialog.save_dialog()
    save_dlg.owner = self
    
    self:GetHolder():start_stop_menu(save_dlg, true)
    self:GetHolder():start_stop_menu(self, true) --new
    self:Show(false)
end

function main_menu:OnButton_options_clicked()
    local opt_dlg = ui_mm_opt_main.options_dialog()
    opt_dlg.owner = self
    
    opt_dlg:UpdateControls()
    self:GetHolder():start_stop_menu(opt_dlg, true)
    self:GetHolder():start_stop_menu(self, true) --new
    self:Show(false)
    amk_mod.hud_update = true
end

function main_menu:OnButton_load_clicked()
    local load_dlg = ui_load_dialog.load_dialog()
    load_dlg.owner = self
    
    self:GetHolder():start_stop_menu(load_dlg, true)
    self:GetHolder():start_stop_menu(self, true) --new
    self:Show(false)
end
---Показометр адпатация PLK ---
function main_menu:OnKeyboard(dik, keyboard_action)  --virtual function
    CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
--    local bind = dik_to_bind(dik)
    if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
        if dik == DIK_keys.DIK_ESCAPE then
            if game_is_running() then
                ui_mm_opt_add.check_options()
                console:execute("main_menu off")
                archievements.mm_opt()
            end
        elseif
            key_handlers.handler_press(dik,dik_to_bind(dik)) then
            
        elseif dik == DIK_keys.DIK_L then
            self:OnButton_last_save()
        -- лютый котик, ебашит все в онлайне --        
        elseif dik == DIK_keys.DIK_P then
            pokazometr.show_actor_position()
        -- показывает барбитуру и коды от дверей --                                     
        elseif dik == DIK_keys.DIK_O then
            pokazometr.obkolishi_i_barbiturshiki()
        -- котик выкашивающих все в радиусе 70м--                                    
        elseif dik == DIK_keys.DIK_V then
            pokazometr.final_victory()
        --- чистильщик трупов, выкашивание трулей, давление жабы, тушение аномалий партиклями --                                                                        
        elseif dik == DIK_keys.DIK_H then
            pokazometr.cleaner()
        --- лечение, вывод радиации, показ координтатов --                                
        elseif dik == DIK_keys.DIK_NUMPAD4 then
            pokazometr.zdoroviy()
        --- выдача 100к ---                    
        elseif dik == DIK_keys.DIK_K then
            pokazometr.bablo()
        --- показ меток на херобору --
        elseif dik == DIK_keys.DIK_NUMPAD1 then
            pokazometr.set_spots()
            --- удаление меток вручную ---    
        elseif dik == DIK_keys.DIK_NUMPAD2 then
            pokazometr.del_spots()    
            -- показ аномалий на  мини-карте --
        elseif dik == DIK_keys.DIK_NUMPAD3 then
            pokazometr.show_anomalies()
            -- набор багфиксов, необходимы тесты --                         
        elseif dik == DIK_keys.DIK_U then
            pokazometr.armistice()
            -- показ рестрикторов --                                                 
        elseif dik == DIK_keys.DIK_NUMPAD5 then
            pokazometr.show_restrictors()
            -- Полёт на болте  --                                                                
        elseif dik == DIK_keys.DIK_NUMPAD6 then
            pokazometr.pokaz_stalkerov()
            -- показ мобов и сталкеров --                                                                                                                                             
        elseif dik == DIK_keys.DIK_M then
            pokazometr.show_mobs()
        --- нюх на все, отлов обьектов в радиусе 5м с записью лога---                                                                    
        elseif dik == DIK_keys.DIK_NUMPAD8 then
            pokazometr.nuh_na_vse()
                        
 
       elseif     dik == DIK_keys.DIK_Q then
            self:OnMessageQuitWin()                        
--===спавнер===--
        elseif dik == DIK_keys.DIK_S then
            self:OnButton_load_spawn()
--===спавнер===--

        end
    end
    if keyboard_action == ui_events.WINDOW_KEY_RELEASED then
        key_handlers.handler_release(dik,dik_to_bind(dik))
    end
   
    return true
end

if ui_mm_opt_creator.get_bool_user_param("pause_on_load") then 
    autopause.main()
end

==============================================

==============================================

==============================================

Если хочется несколько спавнеров, делаем так:

--===спавнеры===--
function main_menu:OnButton_load_spawnnaxac()
    if self.spawnnaxac_dlg == nil then
        self.spawnnaxac_dlg = ui_cheat_naxac.cheat_menu()
    self.spawnnaxac_dlg.owner = self
end
    self:GetHolder():start_stop_menu(self.spawnnaxac_dlg, true)
    self:GetHolder():start_stop_menu(self, true) --new
    self:Show(false)
end
-----------------
function main_menu:OnButton_load_spawnkot()
    if self.spawnkot_dlg == nil then
        self.spawnkot_dlg = spawner.spawn_items_dialog()
        self.spawnkot_dlg.owner = self
end
    self:GetHolder():start_stop_menu(self.spawnkot_dlg, true)
    self:GetHolder():start_stop_menu(self, true)
    self:Show(false)
end
--=============--

--******************************--

--===спавнеры===--
        elseif dik == DIK_keys.DIK_S then
            self:OnButton_load_spawnnaxac()
--==============--
        elseif dik == DIK_keys.DIK_D then
            self:OnButton_load_spawnkot()
--===спавнеры===--

 

 


Список ЦЗ и другая помощь в прохождении
Скрытый текст

Список цепочек задании, включая задания на "неизвестный чип" и награды к ним. Для удобства, при двойном левом нажатии на ячейку в столбце "Отметка",  вы поставите одну из трех отметок ("В процессе", "Готово", "пустая ячейка"). В таблице присутствуют различные фильтры. 

Список цепочек задании с наградами для ОП 2.2

P.S. Список циклических заданий вносить в данную таблицу я НЕ планирую. Все в ваших руках.

от @Fergut

 


AMK-Team.ru

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