Редактирование движка |
Здравствуйте, гость ( Авторизация | Регистрация )
Сайт S.T.A.L.K.E.R. Inside / [ЗП] Параметры командной строки / Распаковщик ресурсов
Редактирование движка |
22.01.2016, 17:18
Сообщение
#2221
|
|
Игровой Бог Репутация: 648 Группа: Участник Сообщений: 5354 Регистрация: 24.09.2010 |
Редактирование собранного движка Проект Cut X-Ray Цель проекта - создание отдельных изменений движка игры с их последующей комбинацией с другими правками. Авторы: SkyLoader, _призрак_ Для платформ: ТЧ 1.0004 и 1.0006, ЧН 1.5.10, ЗП 1.6.02 Адрес проекта на Google Code: Страница на Moddb: Пак 1 1. Исправление вылета "can't find rank" для оружий. 2. Смерть от первого лица. Видео: 3. Collide Возвращена коллизия мертвых тел с неписями и актором, как она сделана в старой физике билдов. Видео: 4. Круглый прицел. Возвращен круглый прицел вместо перекрестья, как билдах. 5. Исправление вида от 3-го лица. Изменено положение камеры от 3-го лица (1). Стрельба идет по перекрестью, а не по направлению актора. Если включить вид от 3-го лица (1) и удерживать Shift, то ГГ будет автоматически целиться в ближайшего непися или монстра. Проблемы: Стрельба по перекрестью идет также при виде от 3-го лица (2). Если при автоматическом нацеливании непись/монстр удалится или перейдет в оффлайн, будет движковый безлоговый вылет. Я думал вырезать это нацеливание, но решил оставить. Пак 2 1. Luminosity progress (только ТЧ) Возвращение шкалы освещения вместо шкалы "заметности" ГГ, как в билдах. 2. Запрет на доставание оружия в машине (только ТЧ и ЧН) и на лестнице (ТЧ, ЧН, ЗП). 3. Руки на руле в машине. (только ТЧ и ЧН) Видео: 4. Отсутствие распознавания неписей перекрестием: При наведении на непися перекрестье имеет дефолтный цвет. Также не показывает информацию о неписе, если смотреть на него. 5. Bind_object: Возможность использовать скрипты в мультиплеере. 6. Из оружия на классе бинокля можно стрелять (только ТЧ) Пак 3 1. Включение некоторых команд без использования ярлыка. Можно патчить по отдельности. Команды: -smap_4096 (максимально улучшенные карты теней), -mblur (включение блюра). 2. Измененная анимация безоружного гг. 3. Увеличение дистанции диалога с неписями (для создания сценок на расстоянии) 4. Исправление вылета при использовании предметов из трупов неписей. В отличии от версии Kolmogor'а, здесь отключено само меню использования. 5. Возможность поднимать болты как обычные инвентарные предметы (комбинировать с модом Charsi "Заканчивающиеся болты") Правки от RayTwitty aka Shadows Geometry LOD fix (CS 1.5.10) – расширение диапазона консольной команды r__geometry_lod Camblu crosshair for build 1865 – замена перекрестия прицела на кружок в билде 1865 Vertex buffer fix for NC Project – исправление вылета по переполнению буфера в NC Project NO 100 sovetov fix (COP 1.6.02) – убирает надписи "100 советов" с экрана загрузки Demo Record fix (SOC 1.0006) – убирает красные надписи в режиме demo_record Weapon Bobbing Beta (SOC 1.0006) – раскачка оружия при ходьбе (бета-версия) Build Loadscreen (SOC 1.0006) – билдовский экран загрузки со статичным изображением Detail Density fix (SOC 1.0006) – расширение диапазона консольной команды r__detail_density Mipbias fix (SOC 1.0006) – расширение диапазона консольных команд r1_tf_mipbias и r2_tf_mipbias No Quick Use fix (SOC 1.0006) – запрет на использование аптечек и бинтов по быстрым клавишам Sun Near fix (SOC 1.0006) – расширение диапазона консольной команды r2_sun_near Target Font (SOC 1.0006) – замена шрифта под перекрестием прицела на шрифт DI Unload Magazine fix (SOC 1.0006) – фикс скриптовой функции unload_magazine - теперь патроны разряжаются в инвентарь PNG Screenshots (SOC 1.0006) – игра теперь делает качественные скриншоты в формате png Правки от K.D. Правки от macron Исправленный экзешник для SoC 1.0006 Доработанный и исправленный экзешник для ТЧ 1.0006 (на основе Steam-версии без защиты) Включает в себя исправления вылетов, а также очистку лога игры от засоряющих сообщений. Более подробное описание внутри архива. Ссылка: X-Ray extensions portable Портативная версия расширений движка "X-Ray extensions" Платформы: ТЧ 1.0006, ЧН 1.5.10, ЗП 1.6.02 Эта версия имеет все нужные библиотеки и патчеры, а также настроенные bat-файлы для успешной компиляции. Более подробное описание внутри архива. Ссылка: Правки от Kolmogor Правленный xrGame для SoC 1.0004 Изменения: 1. Добавлена консольная команда fov [5.0, 180.0] - изменяет глобальный FOV камеры. 2. Добавлена консольная команда k_ammo_on_belt [on\off] - включает\выключает использование патронов с пояса. 3. Артефакты работают из рюкзака, а пояс служит контейнером. Ссылка: Правки от Kontro-zzz Изменение значения hud_fov Правки фиксированных значений параметра hud_fov - 0.37 либо 0.53, Должно работать на GOG версии и no DVD. Редактирование исходников Репозитории [SoC] () () () () () () () () () () () [CS] () () () () () () [CoP] () () () () () () () () () () () () () [2.0] () () NDA GSC Оригинальные версии движков Могут понадобиться для восстановления оригинальных библиотек. Официальный мультиплеерный (невышедший) патч для SoC Уроки Изменение плотности травы и создание патча через IDA Pro Автор: _призрак_ edited by: RayTwitty aka Shadows Для редактирования нам понадобится программа IDA Pro. 1. Запускаем IDA Pro. 2. Загружаем бинарник рендера xrRender_R1.dll или xrRender_R2.dll. 3. Теперь необходимо найти, где регистрируется консольная команда. Жмем Ctrl+T и вводим r__detail_density. 4. Находим функцию и тщательно ее разбираем (я ее полностью разбирать не буду, только укажу, где задаются параметры: Код регистрации консольной команды Код fld ds:flt_10064400 -- нижнее ограничение равное 0.6 or dword_1007CACC, 8 sub esp, 8 fstp [esp+30h+var_2C] mov ecx, offset unk_1007CA9C fld ds:flt_10064380 -- верхнее ограничение равное 0.2 fstp [esp+30h+var_30] push offset aSs; "ЪЩЩ>" push offset aR__detail_dens; "r__detail_density" call ds:??0CCC_Float@@QAE@PBDPAMMM@Z; CCC_Float::CCC_Float(char const *,float *,float,float) push offset sub_1005E080; void (__cdecl *)() call _atexit add esp, 4 5. Нам нужно увеличить плотность травы: следовательно нужно изменить верхнее ограничение. Как это сделать? Есть три варианта: Первый и самый логичный вариант: изменить переменную. Но тут есть небольшой подвох на котором я попался - этой переменной может пользоваться не одна функция, а несколько. И не ясно, что вы можете сломать, поменяв одну циферку на другую. Второй: взять другую, уже существующую переменную с подходящим значением. Хороший вариант которым я и воспользовался. Но и тут есть недостаток - переменных в бинарнике не так уж и много и можно просто не найти нужную. Третий: создать переменную. Отличный вариант. Единственный минус - я не знаю как это сделать Я пошел по второму пути. Два раза щелкнув на ds:flt_10064380, IDA отправила меня в дебри под названием .rdata. Там я нашел переменную, которая называлась - flt_1006452C и которая имела значение 0.0720999. Насколько я понял, flt_1006452C - не является названием переменной, это сборка из двух показателей - (тип числа)_(смещение). В нашем случае это число типа float, которое находится по адресу 1006452C. Ну что же, приступим к редактированию! 6. Отправляемся в самое начало файла. Как? Сверху есть что-то типа статус-бара - строка состоящая из синего, серого, черного цвета. Нажимаем там в любом месте мышкой и ведем влево до конца. 7. Опять ищем r__detail_density. Находим в этой функции строку fld ds:flt_10064338. Дальше самое интересное - жмем на вкладку Hex View и там у нас выделяются какие-то цифры. Это наша переменная 10064338, только написано наоборот. Сравните: Код 38 43 06 10 Похоже, не правда ли? 10 06 43 38 8. Начинаем редактировать. Нам нужно поменять 4338 на 452C (т.е. заменить ссылку с одной переменной на другую). Жмем правой кнопкой мыши на этих цифрах и выбираем пункт Edit. Меняем 38 43 на 2С 45. Дальше жмем где-нибудь в коде (это нужно сделать обязательно!). 9. После этого жмем правой кнопкой мыши и выбираем commit changes. Таким образом, мы поменяли ссылку на переменную и теперь верхнее ограничение будет равно значению из другой переменной. Но IDA не меняет исходный файл. В нашем случае мы можем только создать файл изменений. Делается это так: File -> Produce file -> Create DIF file. Назовем его test. Этот файл можно открыть при помощи блокнота и посмотреть, что получилось. 10. Теперь необходимо внести изменения из этого файла в движок. Это можно сделать при помощи патчера bpatch. Качаем, смотрим и запускаем bpatch.cmd. Я думаю, что батник вы сможете изменить самостоятельно (настроить пути файлов и т.п.) - там все элементарно. 11. Все! Изменения внесены в движок, можно тестировать Огромное спасибо Kolmogor'у и malandrinus'у. Если бы не они, я бы ничего не сделал. Спасибо вам еще раз. Спасибо и Rolan'у, с которым я очень много беседовал и тоже узнал много чего Полезные ссылки Сборка движка X-Ray Сообщение отредактировал RayTwitty - 27.08.2021, 00:15 |
 
|
|
|
|
06.01.2017, 01:13
Сообщение
#2222
|
|
Ветеран Репутация: 5 Группа: Участник Сообщений: 82 Награды: 2 Регистрация: 11.07.2014 |
Уже устал долбиться в стену, не понимая что происходит, прошу помощи Занялся я детекторами ЧН/ЗП, примерно представляю как оно там работает, начал "перенос" функционала на ТЧ и завис еще в начале. Удалил все в классе детектора что было, начинаю постепенно делать свое. Пока - примитив. Показать худ и три анимации, собственно idle, draw, holster. Вылетов нет, детектор прекрасно спавнится, но нет худа вообще. Т.е. все сообщения в лог выводятся (накидал в те участки кода, где должны воспроизводится анимации) а самого худа нет. Будто он не рисуется. Думаю, где-то проглядел, что худ надо "нарисовать", но не могу найти где. В классе артефактов ничего подобного не нашел (смотрел его, так как худ самый простой). Очень надеюсь на подсказку чего искать.
CustomDetector.h Код #pragma once #include "hud_item_object.h" class CCustomDetector : public CHudItemObject { private: typedef CHudItemObject inherited; public: CCustomDetector (); virtual ~CCustomDetector (); virtual void Load (LPCSTR section); virtual BOOL net_Spawn (CSE_Abstract* DC); virtual void net_Destroy (); virtual void OnH_A_Chield (); virtual void OnH_B_Independent (bool just_before_destroy); virtual void UpdateCL (); virtual void shedule_Update (u32 dt); virtual void Hide (); virtual void Show (); //инициализация если вещь в активном слоте или спрятана на OnH_B_Chield virtual void OnActiveItem(); virtual void OnHiddenItem(); virtual void renderable_Render(); virtual void OnStateSwitch (u32 S); virtual void OnAnimationEnd (u32 state); virtual void UpdateXForm (); enum EDETHudStates { eIdle = 0, eShowing, eHiding, eHidden, }; protected: MotionSVec m_anim_idle; MotionSVec m_anim_show; MotionSVec m_anim_hide; }; CustomDetector.cpp Код #include "stdafx.h" #include "customdetector.h" #include "hudmanager.h" #include "inventory.h" CCustomDetector::CCustomDetector() { SetSlot (DETECTOR_SLOT); } CCustomDetector::~CCustomDetector() { } void CCustomDetector::Load(LPCSTR section) { inherited::Load (section); R_ASSERT (m_pHUD); animGet (m_anim_idle, pSettings->r_string(*hud_sect,"anim_idle")); animGet (m_anim_hide, pSettings->r_string(*hud_sect,"anim_hide")); animGet (m_anim_show, pSettings->r_string(*hud_sect,"anim_show")); } BOOL CCustomDetector::net_Spawn(CSE_Abstract* DC) { BOOL result = inherited::net_Spawn(DC); SetState (eHidden); return result; } void CCustomDetector::net_Destroy() { inherited::net_Destroy (); } void CCustomDetector::OnH_A_Chield() { inherited::OnH_A_Chield (); } void CCustomDetector::OnH_B_Independent(bool just_before_destroy) { inherited::OnH_B_Independent(just_before_destroy); if (m_pHUD) m_pHUD->Hide(); } void CCustomDetector::OnActiveItem() { inherited::OnActiveItem(); //если мы занружаемся и оружие было в руках SetState(eIdle); SetNextState(eIdle); if (m_pHUD) m_pHUD->Show(); } void CCustomDetector::OnHiddenItem() { inherited::OnHiddenItem(); if (m_pHUD) m_pHUD->Hide(); SetState(eHidden); SetNextState(eHidden); } void CCustomDetector::UpdateCL() { inherited::UpdateCL (); } void CCustomDetector::shedule_Update (u32 dt) { inherited::shedule_Update (dt); } #include "inventoryOwner.h" #include "Entity_alive.h" void CCustomDetector::UpdateXForm() { if (Device.dwFrame!=dwXF_Frame) { dwXF_Frame = Device.dwFrame; if (0==H_Parent()) return; // Get access to entity and its visual CEntityAlive* E = smart_cast<CEntityAlive*>(H_Parent()); if(!E) return; const CInventoryOwner *parent = smart_cast<const CInventoryOwner*>(E); if (parent && parent->use_simplified_visual()) return; VERIFY (E); CKinematics* V = smart_cast<CKinematics*> (E->Visual()); VERIFY (V); // Get matrices int boneL,boneR,boneR2; E->g_WeaponBones (boneL,boneR,boneR2); boneL = boneR2; V->CalculateBones (); Fmatrix& mL = V->LL_GetTransform(u16(boneL)); Fmatrix& mR = V->LL_GetTransform(u16(boneR)); // Calculate Fmatrix mRes; Fvector R,D,N; D.sub (mL.c,mR.c); D.normalize_safe(); R.crossproduct (mR.j,D); R.normalize_safe(); N.crossproduct (D,R); N.normalize_safe(); mRes.set (R,N,D,mR.c); mRes.mulA_43 (E->XFORM()); // UpdatePosition (mRes); XFORM().mul (mRes,offset()); } } void CCustomDetector::Hide() { SwitchState(eHiding); } void CCustomDetector::Show() { SwitchState(eShowing); } void CCustomDetector::OnStateSwitch(u32 S) { inherited::OnStateSwitch (S); switch(S){ case eShowing: { m_pHUD->animPlay(random_anim(m_anim_show), FALSE, this, S); Msg("Достаем детектор"); }break; case eHiding: { m_pHUD->animPlay(random_anim(m_anim_hide), FALSE, this, S); Msg("Прячем детектор"); }break; case eIdle: { if (m_anim_idle.size()) m_pHUD->animPlay(random_anim(m_anim_idle), FALSE, NULL, eIdle); Msg("Держим в руке детектор"); }break; }; } void CCustomDetector::renderable_Render() { inherited::renderable_Render(); } void CCustomDetector::OnAnimationEnd(u32 state) { inherited::OnAnimationEnd (state); switch(state) { case eShowing: { SwitchState (eIdle); } break; } } -------------------- |
 
|
|
06.01.2017, 02:55
Сообщение
#2223
|
|
Игровой Бог Репутация: 648 Группа: Участник Сообщений: 5354 Регистрация: 24.09.2010 |
Удалил все в классе детектора что было, начинаю постепенно делать свое. Я бы для начала сделал дубликат уже 100%-работающего класса, только с другим именем. Взять те же гранаты или худ от артефактов. И после успешного запуска, выпиливать из него лишнее и добавлять свое. -------------------- |
 
|
|
06.01.2017, 12:45
Сообщение
#2224
|
|
Опытный Геймер Репутация: 41 Группа: Участник Сообщений: 198 Награды: 2 Регистрация: 29.09.2010 |
Никто по поводу дальности прорисовки травы подсказать не может? Спрашивал здесь. Если нет, то пойду тогда ковырять исходники LA.
|
 
|
|
06.01.2017, 13:39
Сообщение
#2225
|
|
Почти Игроман Репутация: 91 Группа: Модератор Сообщений: 516 Награды: 4 Регистрация: 19.07.2015 |
Вроде аналогично std::memset, но я не уверен. -------------------- В армии по 01.07.2020. |
 
|
|
06.01.2017, 17:49
Сообщение
#2226
|
|
Игровой Бог Репутация: 648 Группа: Участник Сообщений: 5354 Регистрация: 24.09.2010 |
Никто по поводу дальности прорисовки травы подсказать не может? Делай как тут. Сообщение отредактировал RayTwitty - 06.01.2017, 17:51 -------------------- |
 
|
|
06.01.2017, 17:51
Сообщение
#2227
|
|
Продвинутый геймер Репутация: 16 Группа: Участник Сообщений: 222 Награды: 3 Регистрация: 28.06.2016 |
|
 
|
|
06.01.2017, 21:06
Сообщение
#2228
|
|
Опытный Геймер Репутация: 3 Группа: Участник Сообщений: 150 Награды: 3 Регистрация: 16.02.2014 |
Подскажите, плз, как имея ID объекта получить его инвентарь, как СInventory(или как правильнее будет).
|
 
|
|
07.01.2017, 16:05
Сообщение
#2229
|
|
Опытный Геймер Репутация: 3 Группа: Участник Сообщений: 150 Награды: 3 Регистрация: 16.02.2014 |
Требуется сохранить\восстановить переменную класса инвентарного предмета. Если я правильно понимаю, это надо делать в net_Export\net_Import ?
Попробовал так: в net_Export Код BYTE tS = 0; в net_Importif (переменная == true) tS = 1; P.w_u8(tS); Код BYTE tS = P.r_u8(); Результат - игра виснет на синхронизации. Что не так, как исправить ?
if ( tS == 1) переменная = true; else переменная = false; Сообщение отредактировал AndreySol - 07.01.2017, 16:05 |
 
|
|
07.01.2017, 16:18
Сообщение
#2230
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
зачем столько лишнего написал?
Код P.w_u8(переменная); Код переменная = P.r_u8(); не? -------------------- nop
|
 
|
|
07.01.2017, 16:34
Сообщение
#2231
|
|
Опытный Геймер Репутация: 3 Группа: Участник Сообщений: 150 Награды: 3 Регистрация: 16.02.2014 |
|
 
|
|
07.01.2017, 16:36
Сообщение
#2232
|
|
Геймер Репутация: 86 Группа: Участник Сообщений: 128 Награды: 4 Регистрация: 05.05.2012 |
Если сократить, до предложенного Вами варианта, игра виснуть перестанет ? нет. читай лог, смотри под отладчиком что происходит в момент синхронизации. -------------------- nop
|
 
|
|
07.01.2017, 19:48
Сообщение
#2233
|
|
Опытный Геймер Репутация: 41 Группа: Участник Сообщений: 198 Награды: 2 Регистрация: 29.09.2010 |
Делай как тут. ответ очень простой - скачай сорцы CoC ( они Спасибо. С дальностью разобрался. (плюсанул за помощь) Теперь думаю, как пофиксить растянутое в ЗП небо и заставить солнце по конфигам ходить по аналогии с X-ray Extensions... |
 
|
|
07.01.2017, 19:50
Сообщение
#2234
|
|
Почти Игроман Репутация: 91 Группа: Модератор Сообщений: 516 Награды: 4 Регистрация: 19.07.2015 |
Делай как тут. ответ очень простой - скачай сорцы CoC ( они Спасибо. С дальностью разобрался. (плюсанул за помощь) Теперь думаю, как пофиксить растянутое в ЗП небо и заставить солнце по конфигам ходить по аналогии с X-ray Extensions... По небу в закромах вроде был пост. Там одну структуру надо было заменить на аналогичную из ЧН/ТЧ. ЕМНИП Сообщение отредактировал Forser - 07.01.2017, 19:51 -------------------- В армии по 01.07.2020. |
 
|
|
07.01.2017, 20:17
Сообщение
#2235
|
|
Продвинутый геймер Репутация: 16 Группа: Участник Сообщений: 222 Награды: 3 Регистрация: 28.06.2016 |
AndreySol, а в серверный класс ты дописал переменную? Её тоже нужно там пилить иначе ничего не получится. По солнцу видел только такой фикс (CoC) - Environment.cpp
float AZ = acosf(cosAZ); заменить на float AZ = acosf(cosAZ) + PI; Емнип на этом форуме тоже всплывала эта информация Сообщение отредактировал mortan - 07.01.2017, 20:20 |
 
|
|
07.01.2017, 21:38
Сообщение
#2236
|
|
Опытный Геймер Репутация: 3 Группа: Участник Сообщений: 150 Награды: 3 Регистрация: 16.02.2014 |
|
 
|
|
08.01.2017, 21:56
Сообщение
#2237
|
|
Опытный Геймер Репутация: 3 Группа: Участник Сообщений: 150 Награды: 3 Регистрация: 16.02.2014 |
Бывает иногда такая ситуация, что при открытии инвентаря, оружие не прячется. И затем, при манипуляциях в открытом инвентаре, происходит "самовольная" перезарядка оружия, если оно было разряжено. Если я правильно понимаю, перезарядка происходит по нажатию левой кнопы мыша, что при активном оружии означает выстрел и вызывает перезарядку. Но тогда почему, при последующих, после перезарядки, нажатиях ЛКМ оружие не стреляет ? Или перезарядка происходит по иной причине ? Кто нить пытался разобраться с этим багом на уровне движка(исходников) ?
|
 
|
|
08.01.2017, 23:07
Сообщение
#2238
|
|
Продвинутый геймер Репутация: 16 Группа: Участник Сообщений: 222 Награды: 3 Регистрация: 28.06.2016 |
Бывает иногда такая ситуация, что при открытии инвентаря, оружие не прячется. И затем, при манипуляциях в открытом инвентаре, происходит "самовольная" перезарядка оружия, если оно было разряжено. Если я правильно понимаю, перезарядка происходит по нажатию левой кнопы мыша, что при активном оружии означает выстрел и вызывает перезарядку. Но тогда почему, при последующих, после перезарядки, нажатиях ЛКМ оружие не стреляет ? Или перезарядка происходит по иной причине ? Кто нить пытался разобраться с этим багом на уровне движка(исходников) ? это не баг а фича. Зачем оно надо я хз. |
 
|
|
09.01.2017, 00:02
Сообщение
#2239
|
|
Опытный Геймер Репутация: 3 Группа: Участник Сообщений: 150 Награды: 3 Регистрация: 16.02.2014 |
|
 
|
|
09.01.2017, 10:44
Сообщение
#2240
|
|
Опытный Геймер Репутация: 41 Группа: Участник Сообщений: 198 Награды: 2 Регистрация: 29.09.2010 |
По небу в закромах вроде был пост. Там одну структуру надо было заменить на аналогичную из ЧН/ТЧ. ЕМНИП Ага. В dxEnvironmentRender.cpp нужно в одном массиве 2-ки заменить на 1-ки. Уже сделал. Вообще не понимаю, зачем так небо "сжали". Чтобы на игрока "давило"? Тогда бы и скайбоксы новые сделали. Но, видимо, было лень...По солнцу видел только такой фикс (CoC) - Environment.cpp Посмотрю. Спасибо за наводку.
float AZ = acosf(cosAZ); заменить на float AZ = acosf(cosAZ) + PI; Емнип на этом форуме тоже всплывала эта информация Сообщение отредактировал Antnigm - 09.01.2017, 10:49 |
 
|
|
09.01.2017, 17:33
Сообщение
#2241
|
|
Почти Игроман Репутация: 91 Группа: Модератор Сообщений: 516 Награды: 4 Регистрация: 19.07.2015 |
Опечатка или можно спокойно привести к такому виду? Сообщение отредактировал Forser - 09.01.2017, 17:35 -------------------- В армии по 01.07.2020. |
 
|
|
Текстовая версия | Сейчас: 08.05.2024, 05:03 |