vendredi 12 juin 2009

[TUTO]Mettre un model pour le cadavre du joueur dès sa mort

Ce petit tutorial va vous permettre de mettre un model au joueur, c'est à dire que lorsque le joueur sera mort, dans le jeu vous aurez le model prédéfini qui tombera comme un ragdoll

Un peu comme Half-Life 2 Deathmatch alors que Half-Life 2 ne propose pas ça.

Ce code a été réalisé pour la Orange Box.

Les logiciels requis sont :

Visual Studio C++ 2008 Express Édition (La version Express Édition est amplement suffisante, elle est en français d'ailleurs)
Notepad++ (Notepad++ est un outil sympa pour l'édition rapide de vos fichiers .cpp et .h)

Réglages :

Les réglages pour Visual Studio C++ 2008 Express Édition sont ci-dessous :

Ouvrez Visual Studio c++ 2008 Express Édition, ouvrez ensuite votre projet game_episodic-2005
En haut à droite se trouve une barre avec 'Debug' 'WIN32', (image ci-dessous), maintenant un clic gauche sur 'Debug' ou 'WIN32' (c'est la même chose), 'Gestionnaire de configurations'.



Faites le nécessaire pour que l'image que j'ai mis en dessous soit la même que dans votre tableau.

C'est à dire :

Configuration de la solution active : Release // Plateforme de la solution active : Win32

client_episodic-2005 // Release // Win32 // une case est ici, elle faut qu'elle soit remplit
server_episodic-2005 // Release // Win32 // une case est ici, elle faut qu'elle soit remplit




Une fois terminé, nous pouvons maintenant fixé un problème du code qui est d'ailleurs très connu.
Le problème est connu pour ne pas compilé les .dll, mais il existe une solution et là voici :

A la ligne 348 du fichier client/c_vguiscreen.cpp, vous devriez avoir ceci :

dist = c_x / tan( M_PI * scaled_fov / 360.0 );


Pour ensuite le remplacé par ceci :

float dist_denom = tan( M_PI * scaled_fov / 360.0f );
dist = c_x / dist_denom;




Sauvegardez ensuite.

Partie Coding :


HL2_Player.cpp

Ouvrez dans Visual Studio C++ 2008 Express Édition le fichier HL2_Player.cpp qui se trouve dans Server\Source Files\HL2 DLL de votre fichier server_episodic-2005 du projet game_episodic-2005

Une fois ouvert, repérez ceci :



Pour ensuite ajouté la ligne surligné en rouge comme présenté ci-dessous qui est celle ci :

PrecacheModel( "models/barney.mdl" );




Toujours dans votre HL2_Player.cpp, rendez-vous comme ci-dessous aux lignes suivantes :



Vous pourrez voir 'player.mdl', remplacez le par 'barney.mdl' vu que plus haut on a définit barney.mdl dans PrecacheModel.
Évidement si vous voulez un autre model, remplacez barney.mdl par le model que vous voulez comme par exemple :

breen.mdl
alyx.mdl


Nous allons rajouté de nouvelles lignes de codes qui permettront au joueur d'avoir ses animations lorsqu'on aura la commande thirdperson activé dans le jeu.

Il vous suffit d'ajouté ceci dans votre HL2_Player.cpp :

// Set the activity based on an event or current state
void CHL2_Player::SetAnimation( PLAYER_ANIM playerAnim )
{
int animDesired;

float speed;

speed = GetAbsVelocity().Length2D();

if ( GetFlags() & ( FL_FROZEN | FL_ATCONTROLS ) )
{
speed = 0;
playerAnim = PLAYER_IDLE;
}

Activity idealActivity = ACT_RUN;

// This could stand to be redone. Why is playerAnim abstracted from activity? (sjb)
if ( playerAnim == PLAYER_JUMP )
{
idealActivity = ACT_JUMP;
}
else if ( playerAnim == PLAYER_DIE )
{
if ( m_lifeState == LIFE_ALIVE )
{
return;
}
}
else if ( playerAnim == PLAYER_ATTACK1 )
{
if ( GetActivity( ) == ACT_HOVER ||
GetActivity( ) == ACT_SWIM ||
GetActivity( ) == ACT_HOP ||
GetActivity( ) == ACT_LEAP ||
GetActivity( ) == ACT_DIESIMPLE )
{
idealActivity = GetActivity( );
}
else
{
idealActivity = ACT_GESTURE_RANGE_ATTACK1;
}
}
else if ( playerAnim == PLAYER_RELOAD )
{
idealActivity = ACT_GESTURE_RELOAD;
}
else if ( playerAnim == PLAYER_IDLE || playerAnim == PLAYER_WALK )
{
if ( !( GetFlags() & FL_ONGROUND ) && GetActivity( ) == ACT_HL2MP_JUMP ) // Still jumping
{
idealActivity = GetActivity( );
}
/*
else if ( GetWaterLevel() > 1 )
{
if ( speed == 0 )
idealActivity = ACT_HOVER;
else
idealActivity = ACT_SWIM;
}
*/
else
{
if ( GetFlags() & FL_DUCKING )
{
if ( speed > 0 )
{
idealActivity = ACT_WALK_CROUCH;
}
else
{
idealActivity = ACT_COVER_LOW; //ACT_IDLE_CROUCH;
}
}
else
{
if ( speed > 0 )
{
//alexj - fixed a bug here (walk and run were swapped)
idealActivity = m_fIsSprinting ? ACT_RUN : ACT_WALK;
}
else
{
idealActivity = ACT_IDLE;
}
}
}

//idealActivity = TranslateTeamActivity( idealActivity );
}

if ( idealActivity == ACT_GESTURE_RANGE_ATTACK1 )
{
RestartGesture( Weapon_TranslateActivity( idealActivity ) );

// FIXME: this seems a bit wacked
Weapon_SetActivity( Weapon_TranslateActivity( ACT_RANGE_ATTACK1 ), 0 );

return;
}
else if ( idealActivity == ACT_GESTURE_RELOAD )
{
RestartGesture( Weapon_TranslateActivity( idealActivity ) );
return;
}
else
{
SetActivity( idealActivity );

animDesired = SelectWeightedSequence( Weapon_TranslateActivity ( idealActivity ) );

if (animDesired == -1)
{
animDesired = SelectWeightedSequence( idealActivity );

if ( animDesired == -1 )
{
animDesired = 0;
}
}

// Already using the desired animation?
if ( GetSequence() == animDesired )
return;

m_flPlaybackRate = 1.0;
ResetSequence( animDesired );
SetCycle( 0 );
return;
}

// Already using the desired animation?
if ( GetSequence() == animDesired )
return;

//Msg( "Set animation to %d\n", animDesired );
// Reset to first frame of desired animation
ResetSequence( animDesired );
SetCycle( 0 );
}

HL2_Player.h

Pour finir, rendez-vous dans HL2_Player.h
et cherchez les lignes suivantes :

bool CanZoom( CBaseEntity *pRequester );
void ToggleZoom(void);
void StartZooming( void );
void StopZooming( void );
bool IsZooming( void );
void CheckSuitZoom( void );


Auxquelles vous remplacerez par celle ci :

bool CanZoom( CBaseEntity *pRequester );
void ToggleZoom(void);
void StartZooming( void );
void StopZooming( void );
bool IsZooming( void );
void CheckSuitZoom( void );
void SetAnimation( PLAYER_ANIM playerAnim );


Sauvegardez ensuite.

Compilation :

Phase finale, la compilation

Maintenez un clique droit sur server_episodic-2005 // Générer

Le fichier server.dll se trouvera donc dans src\game\server\bin

Dans le jeu :



L'image présenté représente le model hgrunt.mdl

Dernière édition : 2011

Aucun commentaire: