Source SDK

Source SDK

Not enough ratings
Pantalla de carga personalizada (Motor Source 2013)
By Oitnemood
El siguiente código nos permite tener pantallas de carga personalizadas al cargar los mapas, ya sean únicas dependiendo del nombre del mapa, o una por defecto. El aspecto final hará que se vea como en No More Room in Hell, o Obsidian Conflict.

Este método anula a GameUI y se basa en lo que se insinuó en este correo de HLCoders.

Acredítame (Maestra Fénix) si quieres usar esto, es la única condición.
   
Award
Favorite
Favorited
Unfavorite
Mostrando los resultados finales

en este caso, cargando una pantalla personalizada al detectar un mapa definido. Nota: El archivo RES de la ventana emergente de carga se editó para eliminar los bordes y que el fondo no quede "cortado".
Requisitos
Un mod que funcione con Source SDK 2013 Master
Conocimiento de C++, RES y archivos VMT / VTF.
Código 1
Coloque los siguientes dos archivos en algún lugar del cliente (si es posible, en una subcarpeta para mantenerlo ordenado):

mapload_background.h

//======= Maestra Fenix, 2017 ==================================================// // // Purpose: Map load background panel // //==============================================================================// #ifndef MAPLOAD_BACKGROUND_H #define MAPLOAD_BACKGROUND_H #ifdef _WIN32 #pragma once #endif #include "vgui\ISurface.h" #include <vgui_controls/EditablePanel.h> #include <vgui_controls\ImagePanel.h> #include "ienginevgui.h" //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CMapLoadBG : public vgui::EditablePanel { DECLARE_CLASS_SIMPLE( CMapLoadBG, vgui::EditablePanel); public: // Construction CMapLoadBG( char const *panelName ); ~CMapLoadBG(); void SetNewBackgroundImage( char const *imageName ); protected: void ApplySchemeSettings( vgui::IScheme *pScheme ); private: vgui::ImagePanel *m_pBackground; }; #endif // !MAPLOAD_BACKGROUND_H
Código 2
mapload_background.cpp

//======= Maestra Fenix, 2017 ==================================================// // // Purpose: Map load background panel // //==============================================================================// #include "cbase.h" #include "mapload_background.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" using namespace vgui; //----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- CMapLoadBG::CMapLoadBG( char const *panelName ) : EditablePanel( NULL, panelName ) { VPANEL toolParent = enginevgui->GetPanel( PANEL_GAMEUIDLL ); SetParent( toolParent ); // Fénix: Cargamos un archivo RES en lugar de crear el elemento aquí para aprovechar el parámetro "F" de ancho y alto // Es lo único que hace llenar el fondo a toda la pantalla sin importar el tamaño de la textura // Enhorabuena a Valve por volver a dar opciones a un solo lado y no a los dos LoadControlSettings( "resource/loadingdialogbackground.res" ); m_pBackground = FindControl<ImagePanel>( "LoadingImage", true ); } //----------------------------------------------------------------------------- // Purpose: Destructor //----------------------------------------------------------------------------- CMapLoadBG::~CMapLoadBG() { // None } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CMapLoadBG::ApplySchemeSettings( IScheme *pScheme ) { BaseClass::ApplySchemeSettings( pScheme ); int iWide, iTall; surface()->GetScreenSize( iWide, iTall ); SetSize( iWide, iTall ); } //----------------------------------------------------------------------------- // Purpose: Sets a new background on demand //----------------------------------------------------------------------------- void CMapLoadBG::SetNewBackgroundImage( char const *imageName ) { m_pBackground->SetImage( imageName ); }
código 3
clientmode_shared.cpp

Ve a clientmode_shared.cpp y añade lo siguiente entre las líneas 42 y 44 (después de #if defined( _X360 ) y antes de #if defined( REPLAY_ENABLED )):

// Fénix: Necesario para las pantallas de carga de fondo personalizadas #include "GameUI/IGameUI.h" #include "mapload_background.h"

Añade el siguiente fragmento entre las líneas 77 y 79 (después de static vgui::HContext s_hVGuiContext = DEFAULT_VGUI_CONTEXT; and before ConVar cl_drawhud):

// Fénix: Necesario para las pantallas de carga de fondo personalizadas // Ver interface.h/.cpp para los detalles: básicamente esto asegura que realmente Sys_UnloadModule la dll y que no llamamos a Sys_LoadModule // una y otra vez. static CDllDemandLoader g_GameUI( "GameUI" );

Lines 87 and 89 (after extern bool IsInCommentaryMode( void ); and before #ifdef VOICE_VOX_ENABLE):

// Fénix: Necesario para las pantallas de carga de fondo personalizadas CMapLoadBG *pPanelBg; IMaterial *pMatMapBg;

In ClientModeShared(), add the following after line 278 (m_nRootSize[ 0 ] = m_nRootSize[ 1 ] = -1;):

// Fénix: Necesario para las pantallas de carga de fondo personalizadas pPanelBg = NULL; pMatMapBg = NULL;

At Init(), after line 368 (HOOK_MESSAGE( Rumble );):

// Fénix: Pantallas de carga de fondo personalizadas - Inyecta el panel personalizado en la pantalla de carga CreateInterfaceFn gameUIFactory = g_GameUI.GetFactory(); if ( gameUIFactory ) { IGameUI *pGameUI = (IGameUI *)gameUIFactory( GAMEUI_INTERFACE_VERSION, NULL ); if ( pGameUI ) { // Insertar panel de carga personalizado para el diálogo de carga pPanelBg = new CMapLoadBG( "Background" ); pPanelBg->InvalidateLayout( false, true ); pPanelBg->SetVisible( false ); pPanelBg->MakePopup( false ); pGameUI->SetLoadingBackgroundDialog( pPanelBg->GetVPanel() ); } }

ara acabar con esto, añade lo siguiente en LevelInit( const char *newmap ) en la línea 832 (después de enginesound->SetPlayerDSP( filter, 0, true );):

// Fénix: Pantallas de carga de fondo personalizadas - decide si usar una pantalla de carga para un mapa o una por defecto #ifdef _WIN32 char szMapBgName[MAX_PATH]; #else // !_WIN32 char szMapBgName[PATH_MAX]; #endif // _WIN32 Q_snprintf( szMapBgName, sizeof( szMapBgName ), "vgui/loading/maps/%s", newmap ); pMatMapBg = materials->FindMaterial( szMapBgName, TEXTURE_GROUP_OTHER ); if ( !pMatMapBg->IsErrorMaterial() ) { Q_snprintf( szMapBgName, sizeof( szMapBgName ), "loading/maps/%s", newmap ); pPanelBg->SetNewBackgroundImage( szMapBgName ); } else { pPanelBg->SetNewBackgroundImage( "loading/default" ); }

Aquí termina todo el trabajo en el código. Es hora de crear el archivo RES y los archivos VMT y VTF.
RES and VMT / VTF
loadingdialogbackground.res

Cree este archivo RES en la carpeta de recursos presente en la carpeta principal del mod:

"Resource/loadingdialogbackground.res" { "LoadingImage" { "ControlName" "ImagePanel" "fieldName" "LoadingImage" "xpos" "0" "ypos" "0" "wide" "f-1" "tall" "f-1" "autoResize" "0" "pinCorner" "0" "visible" "1" "enabled" "1" "tabPosition" "0" "border" "1" "image" "loading/default" //Si se deja vacío, aparecerá un fondo gris la primera vez que se cargue el mapa "scaleImage" "1" } } VMT & VTF Dirígete a materials/vgui/ y crea una nueva carpeta llamada loading. Allí, crea un VMT llamado default con el siguiente código:
"UnlitGeneric" { "$basetexture" "vgui/loading/default" "$vertexcolor" "1" "$vertexalpha" "1" "$ignorez" "1" "$no_fullbright" "1" "$nolod" "1" }
Eres libre de crear una textura VTF con el mismo nombre de cualquier tamaño, aunque recomiendo que sea de 2048x1024 de tamaño, con las banderas de No Mipmap, No Level of Detail y No Minimum Mipmap marcadas. Esto se utilizará como pantalla de carga por defecto en caso de que no se encuentre una pantalla de carga definida para un mapa. Cree ahora una subcarpeta llamada maps/, en ella puede colocar los VMTs y VTFs con el nombre de los mapas deseados (ejemplo: ep2_outland_03). Después de este paso, la función está lista para ser probada. Notas Este código se hizo teniendo como referencia los correos electrónicos en HLCoders presentes arriba y mirando cómo aparecen las pantallas de carga de NMRIH. Aparte de eso, todo fueron conjeturas y ensayo y error. Probablemente puede haber mejores métodos por ahí, pero no pude encontrar otras formas. Los equipos que lo hicieron se niegan a compartir sus secretos. Como se ha visto en NMRIH y OC, las comprobaciones sobre si un mapa tiene una pantalla de carga personalizada presente no se hacen hasta el final de la carga. Otros mods aparentemente fueron capaces de hacerlo al instante, pero IDK cómo lo hicieron sin acceso al motor. Esto es una obviedad, pero este código era muy antiguo y puede ser mejorado, como tener diferentes pantallas de carga por defecto, o evitar lanzar un error en consola (visible con el desarrollador 2) si no puede encontrar una.