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-2005En 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.cppOuvrez 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.hPour 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érerLe fichier
server.dll se trouvera donc dans
src\game\server\binDans le jeu :
L'image présenté représente le model
hgrunt.mdl
Dernière édition : 2011