Shkiper2012 35 Опубликовано 15 Сентября 2017 Ссылка на "Сборка исходников, необходимые программы" не работает, либо пост удалён/перенесён. Если перенесён, то куда? Адаптация мода "AtmosFear" для мода "Боевая Подготовка" v.2.0.2. Адаптация мода "Магазинное питание" для мода "Боевая Подготовка" v.2.0.2. Поделиться этим сообщением Ссылка на сообщение
Shkiper2012 35 Опубликовано 6 Октября 2017 (изменено) Порция мелких правок. Скрытый текст Движок 1.0007rc1 (xp-dev), для других версий, возможно будет по-другому. Делал с дефайнами для возможности вкл/выкл. Тут элементарные фишки, которые мне были нужны, решил выложить, может пригодится кому-нибудь. Дефайны можно добавить в 'build_config_defines.h' (если такой есть), либо в начало файла с правкой. // Убираем возможность переключаться между слотами колесиком мыши + небольшая правка для зума. // Скрытый текст #define NO_MOUSE_WHELL_SWITCH_SLOT // Убираем возможность переключаться между слотами колесиком мыши + небольшая правка для зума. /* Убираем возможность переключаться между слотами колесиком мыши. Мне это было нужно, по-этому решил убрать. И тут же поправим кратность зума. Зум будет меняться, только если целимся или смотрим в бинокль. В конфиги бинокля и оружия (у которого хотите сделать динамический зум) нужно добавить: scope_dynamic_zoom = true X:\trunk\xray\xr_3da\xrGame\ActorInput.cpp */ void CActor::IR_OnMouseWheel(int direction) { /* Это убрал: if(inventory().Action( (direction>0)? kWPN_ZOOM_DEC:kWPN_ZOOM_INC , CMD_START)) return; Короткие записи - они, конечно, компактнее, но их читабельность ниже. */ if( IsZoomAimingMode() ) { if( direction > 0 ){ inventory().Action( kWPN_ZOOM_INC, CMD_START ); return; }else{ inventory().Action( kWPN_ZOOM_DEC, CMD_START ); return; } } #ifndef NO_MOUSE_WHELL_SWITCH_SLOT if (direction>0) OnNextWeaponSlot(); else OnPrevWeaponSlot(); #endif } // Блокируем авто-перезарядку и сброс зума, когда закончились патроны. // Скрытый текст #define NO_AUTO_RELOAD_WPN // Блокируем авто-перезарядку и сброс зума, когда закончились патроны. /* Когда в оружие закончаться патроны анимация "прицеливания" не будет уходить в исходное положение "от бедра". X:\trunk\xray\xr_3da\xrGame\WeaponMagazined.cpp */ void CWeaponMagazined::FireEnd() { inherited::FireEnd(); // 1/2 // Блокируем авто-перезарядку и сброс зума, когда закончились патроны. // #ifndef NO_AUTO_RELOAD_WPN // Если делать без дефайна, то этот код нужно закомментировать. // --> // CActor *actor = smart_cast<CActor*>(H_Parent()); if (!iAmmoElapsed && actor && GetState() != eReload){ Reload(); } // <-- // #endif } void CWeaponMagazined::switch2_Empty() { // 2/2 // Блокируем авто-перезарядку и сброс зума, когда закончились патроны. // #ifdef NO_AUTO_RELOAD_WPN if (smart_cast<CActor*>(H_Parent()) != NULL) { OnEmptyClick(); return; } #endif OnZoomOut(); ... } // Bug_Fix: Убираем звук перезарядки, если прячем оружие. // Скрытый текст // Bug_Fix: Убираем звук перезарядки, если прячем оружие. // /* Когда оружие только начало перезаряжаться, и тут же его спрятали или переключились на другой слот - звук перезарядки продолжается проигрываться. Чтобы остановить звук перезарядки, нужно добавить в функции ниже: HUD_SOUND::StopSound(sndReload); X:\trunk\xray\xr_3da\xrGame\WeaponMagazined.cpp */ void CWeaponMagazined::switch2_Hiding() { CWeapon::FireEnd(); HUD_SOUND::StopSound(sndReload); // <--- // PlaySound(sndHide, get_LastFP()); PlayAnimHide(); m_bPending = true; } void CWeaponMagazined::switch2_Hidden() { CWeapon::FireEnd(); HUD_SOUND::StopSound(sndReload); // <--- // if (m_pHUD) m_pHUD->StopCurrentAnimWithoutCallback(); signal_HideComplete(); RemoveShotEffector(); } // Спрячем/показываем предмет в руках, когда откр./закр. инвентарь. // Скрытый текст #define HIDE_WEAPON_IN_INV // Спрячем/показываем предмет в руках, когда откр./закр. инвентарь. /* Из названия, думаю, всё понятно: Открыли инвентарь - оружие(или что-либо в руках) убрали, Закрыли инвентарь - снова достали, то что было в руках. X:\trunk\xray\xr_3da\xrGame\ui\UIInventoryWnd.cpp */ void CUIInventoryWnd::Show() { ... Update (); PlaySnd (eInvSndOpen); // в конец функции нужно добавить: #ifdef HIDE_WEAPON_IN_INV if( IsGameTypeSingle() ) { CActor* pAct = smart_cast<CActor*>(Level().CurrentEntity()); if( pAct ){ pAct->SetWeaponHideState(INV_STATE_BLOCK_ALL, true); } } #endif } void CUIInventoryWnd::Hide() { ... ... SendInfoToActor ("ui_inventory_hide"); ClearAllLists (); // тут нужно добавить: #ifdef HIDE_WEAPON_IN_INV if( IsGameTypeSingle() ) { CActor* pAct = smart_cast<CActor*>(Level().CurrentEntity()); if( pAct ){ pAct->SetWeaponHideState(INV_STATE_BLOCK_ALL, false); } } #endif //достать вещь в активный слот CActor *pActor = smart_cast<CActor*>(Level().CurrentEntity()); ... ... } Изменено 6 Октября 2017 пользователем Shkiper2012 2 2 3 Адаптация мода "AtmosFear" для мода "Боевая Подготовка" v.2.0.2. Адаптация мода "Магазинное питание" для мода "Боевая Подготовка" v.2.0.2. Поделиться этим сообщением Ссылка на сообщение
Shkiper2012 35 Опубликовано 10 Октября 2017 // Зум в один клик. Теперь не нужно удерживать клавишу для прицеливания. // Скрытый текст #define ONE_CLICK_ZOOM // Зум в один клик. Теперь не нужно удерживать клавишу прицеливания. /* В оригинальной игре чтобы целится через мушку/прицел/наблюдение в бинокль, - нужно было удерживать клавишу зума. Не знаю точно, это баг или так и задумано. Эта правка делает прицеливание в одно нажатие клавиши(без удержания): нажал - целишься, нажал снова - оружие к бедру. X:\trunk\xray\xr_3da\xrGame\Weapon.cpp Сделал через дефайн, для возможности вкл./выкл. этой правки. В функции: bool CWeapon::Action(s32 cmd, u32 flags) нужно дополнить: case kWPN_ZOOM: */ bool CWeapon::Action(s32 cmd, u32 flags) { ... switch (cmd) { ... ... case kWPN_ZOOM: if (IsZoomEnabled()) { #ifdef ONE_CLICK_ZOOM if( flags&CMD_START && !IsPending() && !IsZoomed() ) OnZoomIn(); else if( flags&CMD_START && IsZoomed() ) OnZoomOut(); #else if (flags&CMD_START && !IsPending()) OnZoomIn(); else if (IsZoomed()) OnZoomOut(); #endif return true; } else return false; case kWPN_ZOOM_INC: case kWPN_ZOOM_DEC: ... ... } ... } 2 1 5 Адаптация мода "AtmosFear" для мода "Боевая Подготовка" v.2.0.2. Адаптация мода "Магазинное питание" для мода "Боевая Подготовка" v.2.0.2. Поделиться этим сообщением Ссылка на сообщение
Shkiper2012 35 Опубликовано 1 Ноября 2017 ТЧ 1.0007rc1 // Уменьшаем вес и цену предмета после использования. // Скрытый текст /* #define EAT_PORTIONS_INFLUENCE // Уменьшаем вес и цену предмета после использования. Автор идеи: Real Wolf. В движке из репо на 'xp-dev.com' [ТЧ 1.0007rc1] - есть наработки от Real Wolf по этой теме. В файле "eatable_item.cpp" есть строки: #if defined(EAT_PORTIONS_INFLUENCE) но дефайн нигде не был объявлен. Собрав движок с объявленным #define EAT_PORTIONS_INFLUENCE - ничего не изменилось. Правка не работала. Немного доработал правку. Работает. Файлы для правки: X:\trunk\xray\xr_3da\xrGame\eatable_item.h X:\trunk\xray\xr_3da\xrGame\eatable_item.cpp X:\trunk\xray\xr_3da\xrGame\inventory_item.h */ // eatable_item.h // Скрытый текст //////////////////// // eatable_item.h // //////////////////// class CEatableItem : public CInventoryItem { // ... // После строки: int GetPortionsNum() const { return m_iPortionsNum; }; // Добавляем это: int GetStartPortionsNum() const { return m_iStartPortionsNum; }; // <--- // Не используется, но может пригодится. // float GetOnePortionWeight(); // <--- // u32 GetOnePortionCost(); // <--- // }; // eatable_item.cpp // Скрытый текст ////////////////////// // eatable_item.cpp // ////////////////////// BOOL CEatableItem::net_Spawn (CSE_Abstract* DC) { // ... if (CSE_ALifeItemEatable* se_eat = smart_cast<CSE_ALifeItemEatable*>(DC)) { m_iPortionsNum = se_eat->m_portions_num; #if defined(EAT_PORTIONS_INFLUENCE) // Уменьшаем вес и цену после использования. // by Real Wolf // /* Это можно удалять, если было! m_weight -= m_weight / m_iStartPortionsNum * m_iPortionsNum; m_cost -= m_cost / m_iStartPortionsNum * m_iPortionsNum; */ if( m_iPortionsNum > 0 ){ float w = GetOnePortionWeight(); float weight = w * m_iPortionsNum; u32 c = GetOnePortionCost(); u32 cost = c * m_iPortionsNum; SetWeight ( weight ); SetCost ( cost ); } #endif } else m_iPortionsNum = m_iStartPortionsNum; return TRUE; } void CEatableItem::UseBy (CEntityAlive* entity_alive) { // ... //уменьшить количество порций if(m_iPortionsNum > 0) --(m_iPortionsNum); else m_iPortionsNum = 0; #if defined(EAT_PORTIONS_INFLUENCE) // Уменьшаем вес и цену после использования. // by Real Wolf // /* Это можно удалять, если было! auto sect = object().cNameSect().c_str(); auto weight = READ_IF_EXISTS(pSettings, r_float, sect, "inv_weight", 0.0f); auto cost = READ_IF_EXISTS(pSettings, r_float, sect, "cost", 0.0f); m_weight -= weight / m_iStartPortionsNum; m_cost -= cost / m_iStartPortionsNum; */ float w = GetOnePortionWeight(); float weight = m_weight - w; u32 c = GetOnePortionCost(); u32 cost = m_cost - c; SetWeight ( weight ); SetCost ( cost ); #endif // ... } // В конце файла, добавляем новые методы класса: // float CEatableItem::GetOnePortionWeight() { float rest = 0.0f; LPCSTR sect = object().cNameSect().c_str(); float weight = READ_IF_EXISTS( pSettings, r_float, sect, "inv_weight", 0.100f ); s32 portions = pSettings->r_s32( sect, "eat_portions_num" ); if( portions > 0 ){ rest = weight / portions; }else{ rest = weight; } return rest; } u32 CEatableItem::GetOnePortionCost() { u32 rest = 0; LPCSTR sect = object().cNameSect().c_str(); u32 cost = READ_IF_EXISTS( pSettings, r_u32, sect, "cost", 1); s32 portions = pSettings->r_s32( sect, "eat_portions_num" ); if( portions > 0 ){ rest = cost / portions; }else{ rest = cost; } return rest; } // inventory_item.h // Скрытый текст ////////////////////// // inventory_item.h // ////////////////////// class CInventoryItem : public CAttachableItem, public CHitImmunity #ifdef DEBUG , public pureRender #endif { // ... // После строк: virtual u32 Cost () const { return m_cost; } virtual void SetCost (u32 cost) { m_cost = cost; } virtual float Weight () { return m_weight;} // Добавить это: virtual void SetWeight (float w) { m_weight = w; } // <--- // // ... }; // У бинокля меньшая кратность зума изначально. // Скрытый текст /* Когда пользуешься биноклем, изначально кратность зума почему-то всегда максимальная. Это не всегда удобно. Правка делает кратность зума(при загрузке локации) равной = g_fov актора, т.е. как будто смотришь без бинокля. Вместо g_fov можно использовать свои настройки. !!! Обратите внимание. !!! Если делать оружие на классе бинокля, то эту правку нужно откорректировать под ваши задачи/оружие. X:\trunk\xray\xr_3da\xrGame\WeaponBinoculars.cpp */ BOOL CWeaponBinoculars::net_Spawn (CSE_Abstract* DC) { // m_fRTZoomFactor = m_fScopeZoomFactor; // <--- Было <--- // m_fRTZoomFactor = g_fov; // <--- Стало <--- // // ... } // Убираем троеточие в строках, при загрузке локации, типа: "Клиент: Синхронизация..." // Скрытый текст /* Вроде мелочь, а (по моему скромному мнению) выглядит лучше без точек. X:\trunk\xray\xr_3da\xrGame\GamePersistent.cpp */ void CGamePersistent::LoadTitle(LPCSTR str) { // ... // sprintf_s (buff, "%s...", CStringTable().translate(str).c_str()); // <--- Было <--- // sprintf_s (buff, "%s", CStringTable().translate(str).c_str()); // <--- Стало <--- // // ... } // Убираем прогресс-бары "точности, скорострельности и т.д." для ножа. // Скрытый текст /* Правка убирает прогресс-бары в описании предметов: ножа, ПБС/глушителей, и бинокля. Для ПБС и бинокля они были убраны изначально. А для ножа - нет. Сделал так, что бы проверка на "Показывать прогресс-бар?" была не по секции предмета, как было изначально в оригинале игры, а по классу предмета. Тем самым, можно на этих классах делать другие предметы, не опасаясь, что в описании будут "полоски" характеристик для оружия. !!! Обратите внимание. !!! Если делать оружие на классе бинокля, то эту правку нужно откорректировать под ваши задачи/оружие. X:\trunk\xray\xr_3da\xrGame\ui\UIWpnParams.cpp */ bool CUIWpnParams::Check(const shared_str& wpn_section){ if (pSettings->line_exist(wpn_section, "fire_dispersion_base")) { /* Это можно удалять! if (0==xr_strcmp(wpn_section, "wpn_addon_silencer")) return false; if (0==xr_strcmp(wpn_section, "wpn_binoc")) return false; if (0==xr_strcmp(wpn_section, "mp_wpn_binoc")) return false; */ const char* wpn_clsid_str = pSettings->r_string( wpn_section, "class" ); if( strstr( wpn_clsid_str, "KNIFE") || strstr( wpn_clsid_str, "SILENC") || strstr( wpn_clsid_str, "BINOC") ){ return false; } return true; } else return false; } 1 2 1 4 Адаптация мода "AtmosFear" для мода "Боевая Подготовка" v.2.0.2. Адаптация мода "Магазинное питание" для мода "Боевая Подготовка" v.2.0.2. Поделиться этим сообщением Ссылка на сообщение
Shkiper2012 35 Опубликовано 31 Октября 2021 23 часа назад, StormBreaker сказал: куда кидать эти правки? "Кидать" не надо. Эти правки вводятся "ручками" в соответствующие файлы исходников движка. 1 Адаптация мода "AtmosFear" для мода "Боевая Подготовка" v.2.0.2. Адаптация мода "Магазинное питание" для мода "Боевая Подготовка" v.2.0.2. Поделиться этим сообщением Ссылка на сообщение
Shkiper2012 35 Опубликовано 31 Октября 2021 44 минуты назад, StormBreaker сказал: в какие именно файлы? Когда открываешь спойлер, то сначала идёт описание правки, затем путь к нужному файлу. В данном, конкретном случае это: X:\trunk\xray\xr_3da\xrGame\WeaponMagazined.cpp Нужные строки обычно помечены комментарием, типа такого: // <-- // или что-то подобное. Рекомендую, как можно точнее формулировать свой вопрос (правильно заданный вопрос - это уже половина ответа). Мало-вероятно, что кто-то будет за тебя догадываться, что ты имел в виду. 1 Адаптация мода "AtmosFear" для мода "Боевая Подготовка" v.2.0.2. Адаптация мода "Магазинное питание" для мода "Боевая Подготовка" v.2.0.2. Поделиться этим сообщением Ссылка на сообщение