Shkiper2012 35 Опубликовано 15 Сентября 2017 Ссылка на "Сборка исходников, необходимые программы" не работает, либо пост удалён/перенесён. Если перенесён, то куда? Поделиться этим сообщением Ссылка на сообщение
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 Поделиться этим сообщением Ссылка на сообщение
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 Поделиться этим сообщением Ссылка на сообщение
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 Поделиться этим сообщением Ссылка на сообщение
Shkiper2012 35 Опубликовано 31 Октября 2021 23 часа назад, StormBreaker сказал: куда кидать эти правки? "Кидать" не надо. Эти правки вводятся "ручками" в соответствующие файлы исходников движка. 1 Поделиться этим сообщением Ссылка на сообщение
Shkiper2012 35 Опубликовано 31 Октября 2021 44 минуты назад, StormBreaker сказал: в какие именно файлы? Когда открываешь спойлер, то сначала идёт описание правки, затем путь к нужному файлу. В данном, конкретном случае это: X:\trunk\xray\xr_3da\xrGame\WeaponMagazined.cpp Нужные строки обычно помечены комментарием, типа такого: // <-- // или что-то подобное. Рекомендую, как можно точнее формулировать свой вопрос (правильно заданный вопрос - это уже половина ответа). Мало-вероятно, что кто-то будет за тебя догадываться, что ты имел в виду. 1 Поделиться этим сообщением Ссылка на сообщение