Мануалы
Что-бы по 25 раз не лазить в файл: \config\misc\cycle_task.ltx, для редактирования хомяков. Все подзадания, для "cube_chip", имеют у себя в условии "+sidor_chip". Соответственно, что-бы отредактировать значения необходимого барахла, ищем по "+sidor_chip". И выставляем необходимое значение по количеству в "target_count = 3", если нужно больше 1-го предмета. Для одного предмета - удаляем эту строчку. В исключениях из этого правила, 4 квестодателя, по ним смотреть и править, где нужно, в заданиях:
Винзор: [025007] - [025017]
Василий: [027000] - [027030]
Загорский: [032000] - [032031]
Халява: [061000] - [061033]
=======
Тут же, во всех заданиях(не только в хомяках), можно редактировать награду. Если что упустил, пишите, дополню. Финальный, 20-й чип у Драгунова за Артефакты, которые завязаны на квесты - спавнить их или редактировать условия получения, не рекомендуется..
=======
По "материалам" спора @achavanin и @igor.doc
Если не примиряет всю группировку, значит функция примирения уже настроила очки до конца(сколько там у тебя в ui_main_menu.script стоит 3000 или 5000 а может и 50000)
Тогда остается мириться с каждым НПС отдельно . В ui_main_menu
elseif dik == DIK_keys.DIK_N then
npc_drug(506) --сюда писать story_id НПС из файла config/game_story_ids.ltx
И в самом низу 2 функции
--506 petrenko
--507 voronin
--519 barin
--9501 сяк
--9608 = "bar_rostok_james"
function npc_drug(ob) -- Делаем непися другом
local npc = level_object_by_sid(ob) --( ... )
if npc and npc:alive() then
npc:set_relation(game_object.friend, db.actor)
end
end
function level_object_by_sid( sid )
local sim = alife() if sim then
local se_obj = sim:story_object( sid )
if se_obj then
return level.object_by_id( se_obj.id )
end
end return nil
end
В \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
Всем привет. имел неосторожность через спавнер от Котовода помирить ГГ с военными, теперь они друзья до гроба даже если их мочишь пачками. Как откатить назад?
gamedata /scripts/ui/ui_main_menu
после
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 dik == DIK_keys.DIK_N then relations()
после
return true
end
прописывем
function relations(community1, community2)
relation_registry.set_community_goodwill ("military", "actor", -10000)
end
Запуск игры, выход в меню, нажимаем N и военные враги.
от @Kashafoch
Пример на жетоне монолитовца. В 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_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 и плагины:
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. Если не планируете менять инвентарь во время игры, то и заморачиваться с вариантами, не нужно. Сам инвентарь нужно выбрать свой, у вас может быть любой из этих:
Дальше все стандартно, нужны вот эти две строки в 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 - уже слишком много. Только из эстетических соображений так сделал - смотрится и вписывается, как там и было:
Пока подогнал, раз 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 кошмарить Когтя смерти и прочих неубивашек
Все волшебство тут, погляди для саморазвития, показометр синий(только кнопки надо свои назначать) спавнер - зеленый.
==============================================
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()
--===спавнеры===--
( Батник для запуска игры на двух и более ядрах, используется встроенный виндовый affinity.exe ):
Если включен SMT (AMD) или Hyper-Threading (Intel) то ключи запуска подбираются исходя из:
CPU0 - первое ядро
CPU1 - это "поток" SMT или Hyper-Threading (Intel) - первого ядра
CPU2 - второе ядро
СPU3 - это "поток" SMT или Hyper-Threading (Intel) второго ядра
и т.д. - т.ё. нечетные это будут виртуальные ядра гипертрейдинга.
У себя использую ключ 0с
Пример - C:\Windows\System32\cmd.exe /C start /affinity 0c XR_3DA.exe -nointro
Чтобы убрать вырвиглазный значек запуска ярлыка батника меняем его на значек ОП2.2.iso из папки /bin
Будет оптимальным так же перенести выполнение процесса видеодрайвера тоже на другое ядро, т.к. винда очень любит вешать всё подряд на CPU0(1).
Как это сделать и не только показано здесь - ссылка на видео по игровой оптимизации 10-ки: youtube (см. внимательно, старые скрипты прошу не юзать, использовать только то что вам нужно)
OS - Windows Server 2022 Standard, HD-pack 2.2, микрофризов не вижу, R5 3600X, 2070s, 2K разрешение, качество максимальное, игра ест больше 6Gb оперативы, проблем нет.
а есть правка на принудительное включение переходов?
--Любой переход можно заспавнить через ui_main_menu.script. Вот как выглядит функция спавна перехода ЗЛ-ТД:
function td_from_puzir_spawn() --в релизе его можно было просохатить.
А вот что нужно вписать в ui_main_menu:
elseif dik == DIK_keys.DIK_F11 then
buusty_dialog.td_from_puzir_spawn()
Т.е. имя скрипта и функции, через точку. Ищи по содержимому, по подобию. А вообще, с такими траблами, как и советуют, лучше переиграть.
Немного переделал уже существующую правку из FAQ: "Показ аномалий на большой карте". Создаем скрипт вот с таким содержанием:
function show_anomalies() local anomaly_classes = { -- [clsid.zone_acid_fog] = true, -- [clsid.zone_electra_s] = true, -- [clsid.zone_bfuzz] = true, -- [clsid.zone_bfuzz_s] = true, -- [clsid.zone_dead] = true, -- [clsid.zone_galant_s] = true, -- [clsid.zone_galantine] = true, -- [clsid.zone_mbald_s] = true, -- [clsid.zone_mincer] = true, -- [clsid.zone_mincer_s] = true, -- [clsid.zone_mosquito_bald] = true, [clsid.ameba_zone] = true -- [clsid.zone_rusty_hair] = true, -- [clsid.torrid_zone] = true, -- [clsid.zone_ice_s] = true, -- [clsid.zone_zharka_s] = true -- [clsid.zone_radioactive] = true, -- [clsid.zone] = true, -- [clsid.zone_buzz_s] = true, -- [clsid.zone_ice] = true } if anoms==nil then anoms = {} for i= 1, 65534 do local obj = level.object_by_id(i) if obj ~= nil and anomaly_classes[obj:clsid()] then ---and string.find(obj:name(),"zone_ameba1") then --obj:section_name()=="zone_ameba1" then -- local sect = ( obj.section~=nil and obj:section() ) or "" if sect=="zone_ameba1" then level.map_add_object_spot(obj:id(), 'red_location', "Хваталка" ) else if sect=="zone_ameba" then level.map_add_object_spot(obj:id(), 'red_location', "Звезда" ) end end table.insert(anoms, obj:id()) end end amk.send_tip("Метки установлены.", nil, nil, 5) --amk.send_tip("",translate("sms_info_received"),0,10,"gen_info") end end
Обзываем его, как душе угодно, к примеру: D:\Games\gamedata\scripts\destruct1.script
Для использования, в gamedata\scripts\ui\ui_main_menu.script создаем вызов нашей функции - "имя файла.show_anomalies()".
elseif dik == DIK_keys.DIK_H then --вместо "H" пишем нужную кнопку destruct1.show_anomalies()
Для показа аномалий нужно делать вызывать на каждой посещаемой локации. Во избежание "крякозябр" в названиях меток аномалий на карте, не забываем про кодировку! Должна быть: 01251 - Кириллица (Windows).
От @Blum
upd: как и куда в ui_main_menu прописать вызов, смотрим по мануалу из шапки: Элементарный движок для поршней
--===--