HL2Spain.com

Bienvenido, invitado ( Identificarse | Registrarse )

2 Páginas: V   1 2 >  
Reply to this topic Start new topic
> :: Tutorial Programacion Half-Life 1 ::, - Como agregar nuevas armas -
SysOp
mensaje 16 February 2005, 02:50
Publicado: #1


| Who's First ? |


Grupo: Miembros



Holas a todos. Soy SysOp, padre del Mod Arrange Mode.

Dentro de todos estos dias, me he topado con muchisimas preguntas sobre programacion para Half-Life1. He notado que muchas personas estan tratando de crear nuevos Mods y estan demasiado perdidos, en esto de la programacion. Es necesario ir teniendo un concepto basico y empezar por HL1 antes de pasar al HL2.
Lamentablemente los unicos tutoriales existentes sobre este tema estan en ingles y se necesita una comprension muy avanzada para poder entenderlos. Es por eso que decidi hacer este tutorial en castellano con mis propias palabras (creo que uno de los pocos que hay smile.gif ).

Se supone que estamos aprendiendo por lo que no deberas tener amplios conocimientos de programacion para poder realizar esto, es mas, este nuevo codigo esta armado de una manera para que puedas entender claramente y modificar tambien, sin tener demasiados problemas. Puedes cambiar lo que desees y hacer el arma que tu quieras, ya que esta todo explicado paso a paso y ese es el asunto, que hagas lo que tu quieras wink.gif.
En los casos expertos no se modifican librerias y tampoco se modifica el lado cliente (en casos SP), pero este no sera asi.

Quiero, antes que nada, aclarar que esto no es una traduccion, adaptacion, copia, ni nada por el estilo. Este tutorial es totalmente nuevo y tiene como objetivo aclarar y resolver dudas, no complicarlas.

Lo que realizaremos en esta ocasion es una nueva arma, con nueva municion y todo lo demas, o sea, realizaremos un Automat Kalashnikov 74.
¿Porque una nueva arma? Bueno, es que es una de las partes mas complicadas y propensas a mayores errores. Las dudas sobre como hacerlas son muchisimas y por esto comenzaremos resolviendo las mas urgentes. Por ejemplo:
- He creado mi nueva arma, pero al recojerla no veo ninguna clase de animacion ni de sonidos, tampoco hace daño alguno. ¿Por que pasa esto?

Lo que haremos sera un codigo totalmente nuevo, no como en los demas casos que hacian una nueva arma con el codigo de la MP5 :S y por ende, sacrificaban y 'mataban' al codigo de la MP5. No tendras problemas con tu codigo original, ya que no sera modificado. Trabajaremos solo en archivos necesarios y no borraremos nada.

Explicare tambien lo que tendremos que hacer fuera de nuestro entorno de programacion. He notado que todos los tutoriales abarcan solo el codigo y olvidan todo lo demas. Este no sera el caso.

Okey, empecemos:

(Referencias)
Codigo original: negro
SysOp´s Code: azul
Comentarios: verde

-----------------------------------------------------------------------------------------------LADO SERVIDOR: DLL:
-----------------------------------------------------------------------------------------------

Dentro de la carpeta 'dll' del SDK hay un archivo llamado 'hl.dsw', haz doble click y ya tendremos nuestro espacio de trabajo.
Lo que primero modificaremos seran las librerias (o bibliotecas).

Abramos el archivo weapons.h, busquemos un poco estas definiciones, que estan al principio y agreguemos lo que esta en azul (es el nuevo codigo, lo repitire por ultima vez):

// constant items
#define WEAPON_TRIPMINE 13
#define WEAPON_SATCHEL 14
#define WEAPON_SNARK 15

#define WEAPON_AK74 16

Ahora bajemos solo un poco hasta encontrar lo siguiente y agreguemos nuesta arma al final:

// weapon weight factors (for auto-switching) (-1 = noswitch)
#define SNARK_WEIGHT 5
#define SATCHEL_WEIGHT -10
#define TRIPMINE_WEIGHT -10

#define AK74_WEIGHT 15

Ahora abajo de esto pongamos lo siguiente, para aclarar los significados de las definiciones que se usaran en ak74.cpp, el codigo de nuestra nueva arma:

#define AK74_MODEL_1STPERSON "models/v_AK74.mdl" // los modelos de vision
#define AK74_MODEL_3RDPERSON "models/p_AK74.mdl" // los modelos del jugador
#define AK74_MODEL_WORLD "models/w_AK74.mdl" // los modelos en el piso
#define AK74_SOUND_FIRE1 "weapons/AK74_fire-1.wav" //sonido del arma 1
#define AK74_SOUND_FIRE2 "weapons/AK74_fire-2.wav" //sonido del arma 2
#define AK74_SOUND_VOLUME 0.95 // el volumen del disparo
#define AK74_FIRE_DELAY 0.1 // el retardo entre disparo y disparo
#define AK74_RELOAD_TIME 3.8 // tiempo de recarga
#define AK74_DEFAULT_AMMO 30 // municion por cargador
#define AK74_MAX_AMMO 150 // maxima capacidad de municion
#define AK74_SLOT 2 // el slot del arma (el mismo de la MP5)
#define AK74_POSITION 3 // la pocision estara despues del crossbow,
// esto puedes cambiarlo pero ten cuidado! si pones dos armas en la misma pocision, tendras
// serios problemas!!


Bajemos un poco mas hasta encontrar esto. Aqui pondremos nuestra nueva municion:

// bullet types
typedef enum
{
BULLET_NONE = 0,
BULLET_PLAYER_9MM, // glock
BULLET_PLAYER_MP5, // mp5
BULLET_PLAYER_357, // python
BULLET_PLAYER_BUCKSHOT, // shotgun
BULLET_PLAYER_CROWBAR, // crowbar swipe

BULLET_PLAYER_AK74,

Ahora para finalizar en este archivo, bajemos hasta el final de todo, justo antes del 'endif' y agreguemos lo que seran las nuevas clases, o sea, la nueva arma y su municion:

// CLASE AK74 | ARMA Y MUNICION

class CAK74 : public CBasePlayerWeapon
{
public:
virtual void Spawn( void );
virtual void Precache( void );
virtual int iItemSlot( void ) { return 2; }
virtual int GetItemInfo(ItemInfo *p);
virtual int AddToPlayer( CBasePlayer *pPlayer );
virtual void PrimaryAttack( void );
virtual BOOL Deploy( void );
virtual void Reload( void );
virtual void WeaponIdle( void );


// Por si acaso tu arma sera usada tambien en MultiPlayer
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
return FALSE;
#endif
}

private:
int m_iShell;
unsigned short m_event;
};


class CAK74AmmoClip : public CBasePlayerAmmo
{
virtual void Spawn( void );
virtual void Precache( void );
virtual BOOL AddAmmo( CBaseEntity *pOther ) ;
};


#endif // WEAPONS_H

Okey, ahora abramos el skill.h y agreguemos esta linea. Esto servira para agregar nuestro nuevo daño del arma, el damage wink.gif

// Player Weapons
float plrDmgHandGrenade;
float plrDmgSatchel;
float plrDmgTripmine;

float plrDmgAK74;

Listo! Terminamos con las librerias. Ahora metamonos dentro del codigo mismo del arma.

Presten atencion... lo que tendran que hacer ahora es hacer un nuevo archivo con extension .cpp. Pueden copiar alguno existente, o hacer uno nuevo. Lo que tendran que hacer es uno llamado
ak74.cpp y agregarlo al 'workspace', o sea, al espacio de trabajo
¿Como hacer esto? Simplemente incluyanlo de la siguiente forma:

En el Visual C++ 6.0, dentro de la rama superior, la que dice 'source files' hagan click izquierdo y vallan hasta la opcion 'Add files to folder':

user posted image


Saldra una nueva venta que nos preguntara cual archivo deseamos agregar. Marquemos el ak74.cpp y pongamos OK:

user posted image


Listo! Ahora si pegamos un vistazo a la izquierda, veremos que este archivo ya esta incluido y entrara tambien en la compilacion global.

Sigamos con el codigo. Abramos ahora este archivo ak74.cpp y copiemos y peguemos lo siguiente:

//
// Arrange Mode Mod - Source File -
//
// Prohibida cualquier reproduccion, modificacion y/o uso ilegitimo sin
// expreso consentimiento de los respectivos autores.
// AR SoftWare. © 2004- 2005 Todos los derechos reservados.
//

// AK74 CPP FILE


#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"

// aca van las animaciones de tu arma. Cambialas segun como las tenga tu modelo:
enum AK74_e
{
AK74_IDLE1 = 0,
AK74_IDLE2,
AK74_FIRE1,
AK74_FIRE2,
AK74_RELOAD,
AK74_RELOADLAST,
AK74_DEPLOY,
AK74_HOLSTER,
AK74_GP25_FIRE1,
AK74_GP25_FIRE2,

};


// Aqui se indica cual sera el nombre de esta entidad:
LINK_ENTITY_TO_CLASS( weapon_AK74, CAK74 );
LINK_ENTITY_TO_CLASS( weapon_ak47, CAK74 );
LINK_ENTITY_TO_CLASS( ammo_AK74, CAK74AmmoClip );


void CAK74::Spawn( )
{
pev->classname = MAKE_STRING("weapon_AK74");
Precache( );
SET_MODEL(ENT(pev), AK74_MODEL_WORLD);
m_iId = WEAPON_AK74;
m_iDefaultAmmo = AK74_DEFAULT_AMMO;
FallInit(); // Lista para caer al suelo
}


// Aqui se cargaran los datos necesarios para el correcto funcionamiento del arma:
void CAK74::Precache( void )
{
PRECACHE_MODEL(AK74_MODEL_1STPERSON);
PRECACHE_MODEL(AK74_MODEL_3RDPERSON);
PRECACHE_MODEL(AK74_MODEL_WORLD);


// Aca cargaras el casquillo de las municiones y el sonido de tu arma
m_iShell = PRECACHE_MODEL ("models/shell_AK74.mdl");

PRECACHE_SOUND (AK74_SOUND_FIRE1);
PRECACHE_SOUND (AK74_SOUND_FIRE2);


// Muy importante!! Recuerda el nombre de este evento o tendras problemas!!
m_event = PRECACHE_EVENT( 1, "events/AK74.sc" );
}
// Ya terminamos de cargar todos los sonidos, modelos y eventos que usara el arma

// Ahora indicaremos la informacion del arma
int CAK74::GetItemInfo(ItemInfo *p)
{
p->pszName = STRING(pev->classname);
p->pszAmmo1 = "ammo_AK74"; // El tipo de municion a usar
p->iMaxAmmo1 = AK74_MAX_AMMO; // La cantidad maxima de municion
p->pszAmmo2 = NULL; // No municion secundaria
p->iMaxAmmo2 = -1;
p->iMaxClip = AK74_DEFAULT_AMMO; // El tamaño del cargador
p->iSlot = AK74_SLOT; // El numero en el HUD
p->iPosition = AK74_POSITION; // La posicion en el HUD
p->iFlags = 0;
p->iId = m_iId = WEAPON_AK74; // Identificacion del arma
p->iWeight = AK74_WEIGHT; // Para al autoshitch
return 1;
}



int CAK74::AddToPlayer( CBasePlayer *pPlayer )
{
if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId );
MESSAGE_END();
return TRUE;
}
return FALSE;
}


// Datos necesarios al sacar el arma
BOOL CAK74::Deploy( )
{
return DefaultDeploy( AK74_MODEL_1STPERSON, AK74_MODEL_3RDPERSON,
AK74_DEPLOY, "mp5" );
}


// Yeah! El ataque primario!!
void CAK74::PrimaryAttack()
{
//KELLY: La gracia del ak es que dispara bajo el agua
if (m_pPlayer->pev->waterlevel == 3)
{
PlayEmptySound( );
m_flNextPrimaryAttack = 0.15;
return;
}


// Si esta vacia, no disparar
if (m_iClip <= 0)
{
PlayEmptySound();
m_flNextPrimaryAttack = 0.15;
return;
}


// Sonido del arma: ALTO volumen y ALTO brillo del flash
m_pPlayer->m_iWeaponVolume = LOUD_GUN_VOLUME;
m_pPlayer->m_iWeaponFlash = BRIGHT_GUN_FLASH;


// Cargador (--)
m_iClip--;

/*
Para MultiPlayer.

Si utilizas esta arma en MP, sin especificar que tambien es para MP, cuando
alguien dispare el arma, los otros clientes experimentaran situaciones
problematicas seriamente confusas, como sacudidas violentas, cambios rapidos
de posicion, efecto de fuego en sus armas, giro de camara, etc, etc, etc.

Ahora especificaremos que cada cliente tendra su arma propia y lo que haga con
ella afectara solo a su lado.
Si esta arma es para un mod SP, funcionara igual. Aclaro esto porque muchos
tutoriales abarcan solo el lado servidor, y al utilizar el arma en MP vienen los
problemas...
*/

int flags;

#if defined( CLIENT_WEAPONS )
flags = FEV_NOTHOST;
#else
flags = 0;
#endif

// listo

// Efecto de fuego que sale de la boca del arma
m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH;

// Animacion que se vera en los jugadores
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );

// El disparo en si... //

Vector vecSrc(m_pPlayer->GetGunPosition());
// Al hacer autoaim, cual sera la precision??
Vector vecAim(m_pPlayer->GetAutoaimVector(AUTOAIM_2DEGREES));
// Precision del arma. 3 puntos.
Vector vecAcc(VECTOR_CONE_3DEGREES);
Vector vecDir(m_pPlayer->FireBulletsPlayer( 1, // Cuantos disparos?
vecSrc,
vecAim,
vecAcc, // Acuracia
8192, // Maximo rango
BULLET_PLAYER_AK74, // Tipo de bala
0, // Frecuencia del marcador
0, // Daño por defecto
m_pPlayer->pev,
m_pPlayer->random_seed ));


// Disparar por el lado del cliente. Reproducir eventos PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_event, 0.0,
(float *)&g_vecZero, (float *)&g_vecZero,
vecDir.x, vecDir.y, 0, 0, (m_iClip ? 0 : 1), 0 );

// Dar un retardo entre disparo y disparo
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + AK74_FIRE_DELAY;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() +
UTIL_SharedRandomFloat(m_pPlayer->random_seed,
AK74_FIRE_DELAY + 1, AK74_FIRE_DELAY + 2);
}

// Bueno, recarguemos el arma
void CAK74::Reload( void )
{
DefaultReload( AK74_DEFAULT_AMMO, AK74_RELOADLAST, AK74_RELOAD_TIME );
}

// Aqui se indican cuales seran las animaciones que se haran
// cuando no estemos disparando
// o sea, animaciones IDLE (mover el arma de un lado al otro, tocarla, etc)

void CAK74::WeaponIdle( void )
{
ResetEmptySound( );

m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );

if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
return;

int iAnim;
switch ( RANDOM_LONG( 0, 1 ) )
{
case 0:
iAnim = AK74_IDLE1; // animacion 1
break;

default:
case 1:
iAnim = AK74_IDLE2; // animacion 2
break;
}

SendWeaponAnim( iAnim );
// Cuando volvera a hacer esto de nuevo?
m_flTimeWeaponIdle = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
}

// Aqui se incara el modelo del cargador de nuestro AK
void CAK74AmmoClip::Spawn( void )
{
Precache( );
SET_MODEL(ENT(pev), "models/w_clipAK74.mdl");
CBasePlayerAmmo::Spawn( );
}

// Aqui se cargaran los modelos y sonidos del cargador de nuestro AK
void CAK74AmmoClip::Precache( void )
{
PRECACHE_MODEL ("models/w_clipAK74.mdl");
PRECACHE_SOUND("items/9mmclip1.wav");
}

// Recogimos municion??
BOOL CAK74AmmoClip::AddAmmo( CBaseEntity *pOther )
{
int bResult = (pOther->GiveAmmo(AK74_DEFAULT_AMMO, "ammo_AK74",
AK74_MAX_AMMO) != -1);
if (bResult)
{
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM);
}
return bResult;
}


Ya casi terminamos esta parte... Ahora lo que nos resta hacer es cambiar unas cuantas cosas para que podamos tener la nueva municion.
Abramos el archivo combat.cpp, busquemos estas lineas y agreguemos esto:

default:
case BULLET_PLAYER_9MM:
pEntity->TraceAttack(pevAttacker, gSkillData.plrDmg9MM, vecDir, &tr, DMG_BULLET);
break;

case BULLET_PLAYER_MP5:
pEntity->TraceAttack(pevAttacker, gSkillData.plrDmgMP5, vecDir, &tr, DMG_BULLET);
break;

case BULLET_PLAYER_AK74:
pEntity->TraceAttack(pevAttacker, gSkillData.plrDmgAK74, vecDir, &tr, DMG_BULLET);
break;


Lo que hemos hecho es indicar el tipo de daño de este ataque, que serian 'balas' y marcar el daño que hara nuestra arma en 'gSkillData.plrDmgAK74'

Ahora vallamos hasta gamerules.cpp y indiquemos que el daño del AK sera el indicado en el cvar
'sk_plr_AK74_bullet':

// MP5 Round
gSkillData.plrDmgMP5 = GetSkillCvar( "sk_plr_9mmAR_bullet");

// AK74 Round
gSkillData.plrDmgAK74 = GetSkillCvar( "sk_plr_AK74_bullet");

Listo. Ahora abramos game.cpp. Indicaremos que el daño por defecto en nuesta municion sera '0' (ya explicare esto mas adelante) y registraremos el cvar 'sk_plr_AK74_bullet':

// MP5 Round
cvar_t sk_plr_9mmAR_bullet1 = {"sk_plr_9mmAR_bullet1","0"};
cvar_t sk_plr_9mmAR_bullet2 = {"sk_plr_9mmAR_bullet2","0"};
cvar_t sk_plr_9mmAR_bullet3 = {"sk_plr_9mmAR_bullet3","0"};

// AK74 ROUND
cvar_t sk_plr_AK74_bullet1 = {"sk_plr_AK74_bullet1","0"};
cvar_t sk_plr_AK74_bullet2 = {"sk_plr_AK74_bullet2","0"};
cvar_t sk_plr_AK74_bullet3 = {"sk_plr_AK74_bullet3","0"};


Bajemos un poco mas hasta llegar a la parte para registrar el cvar. Pueden encontrarlo casi al final de este archivo:

// MP5 Round
CVAR_REGISTER ( &sk_plr_9mmAR_bullet1 ); // {"sk_plr_9mmAR_bullet1","0"};
CVAR_REGISTER ( &sk_plr_9mmAR_bullet2 ); // {"sk_plr_9mmAR_bullet2","0"};
CVAR_REGISTER ( &sk_plr_9mmAR_bullet3 ); // {"sk_plr_9mmAR_bullet3","0"};
// AK74 Round
CVAR_REGISTER ( &sk_plr_AK74_bullet1 ); // {"sk_plr_AK74_bullet1","0"}; CVAR_REGISTER ( &sk_plr_AK74_bullet2 ); // {"sk_plr_AK74_bullet2","0"};
CVAR_REGISTER ( &sk_plr_AK74_bullet3 ); // {"sk_plr_AK74_bullet3","0"};


Ya casi... Lo que nos queda hacer es cargar el arma y todos los elementos que necesitara. Busquemos 'custom items' y justo debajo de eso pongamos a nuestra arma y su municion:

// custom items...

// AK74

UTIL_PrecacheOtherWeapon( "weapon_AK74" );
UTIL_PrecacheOther( "ammo_AK74" );


Y para terminar, abramos player.cpp y busquemos en 'CheatImpulseCommands()' lo siguiente, luego agreguemos nuestra arma, para que cuando hagamos 'impulse 101' se nos equipe tambien. Esto sera de prueba, puedes sacarlo al terminar tu mod:

GiveNamedItem( "weapon_snark" );
GiveNamedItem( "weapon_hornetgun" );

// Im Cheater, i wanna some weapon and ammunition
GiveNamedItem( "weapon_AK74" );
GiveNamedItem( "ammo_AK74" );


Listo! Terminamos en el lado del servidor!! Estas cansado ya??
Lo que te queda por hacer sera compilar tu dll. Es algo muy facil. Solo ve hasta el menu 'Build' y dale a 'Build hl.dll' y ya esta!
user posted image


-----------------------------------------------------------------------------------------------LADO CLIENTE: CL_DLL :
-----------------------------------------------------------------------------------------------

Abramos el lado cliente. Dentro de la carpeta 'cl_dll' del SDK hay un archivo llamado 'cl_dlls.dsw', haz doble click y ya tendremos nuestro espacio de trabajo.
Antes de todo, deberas acordarte de incluir el archivo ak74.cpp. Recuerda eso o tendras problemas!
Bueno, comencemos despacio. Ten mucho cuidado al copiar porque podrias arruinarlo todo.

Abramos el archivo ev_hldm.h y modifiquemos esta libreria para incluir nuestras balas:

// bullet types
typedef enum
{
BULLET_NONE = 0,
BULLET_PLAYER_9MM, // glock
BULLET_PLAYER_MP5, // mp5
BULLET_PLAYER_357, // python
BULLET_PLAYER_BUCKSHOT, // shotgun
BULLET_PLAYER_CROWBAR, // crowbar swipe

BULLET_PLAYER_AK74,

Ahora abran el archivo ev_hldm.cpp. Este es el encargado de indicar al arma las animaciones, los sonidos, efectos, etc, etc, etc, o sea, si es que podemos ver algo moviendose... el responsable es este cl_dll.
Vallamos un poco hacia abajo y pongamos lo siguiente:

void EV_HornetGunFire( struct event_args_s *args );
void EV_TripmineFire( struct event_args_s *args );
void EV_SnarkFire( struct event_args_s *args );

void EV_FireAK74( struct event_args_s *args );

Bien, ahora bajemos hasta el final del documento y copiemos y peguemos esto para indicar todas las animaciones, efectos y sonidos de nuestro AK:

//======================
// AK74 START
//======================

//AK74 ANIMACIONES


enum AK74a1_e
{
AK74_IDLE1 = 0,
AK74_IDLE2,
AK74_FIRE1,
AK74_FIRE2,
AK74_RELOAD,
AK74_RELOADLAST,
AK74_DEPLOY,
AK74_HOLSTER,
AK74_GP25_FIRE1,
AK74_GP25_FIRE2,
};

// EVENT AK74
void EV_FireAK74( event_args_t *args )
{

int idx;
vec3_t origin;
vec3_t angles;
vec3_t velocity;


// Cantidad de recoil. Ajusta los numeros como quieras
// Este codigo es nuevo y te servira para que tu arma tenga recoil
// al disparar. El recoil es al estilo DoD o The Specialist.


vec3_t viewangles;
float staerkedesrecoils = 0.8; // Cantidad de recoil 0.80000
// -----------

vec3_t ShellVelocity;
vec3_t ShellOrigin;
int shell;
vec3_t vecSrc, vecAiming;
vec3_t up, right, forward;

float flSpread = 0.01;
idx = args->entindex;
VectorCopy( args->origin, origin );
VectorCopy( args->angles, angles );
VectorCopy( args->velocity, velocity );
AngleVectors( angles, forward, right, up );
if ( EV_IsLocal( idx ) )

// Code Recoil Start
gEngfuncs.GetViewAngles( (float *)viewangles );
viewangles[PITCH] -= staerkedesrecoils;
//viewangles[YAW] -= staerkedesrecoils; // recoil yaw (?)
gEngfuncs.SetViewAngles( (float *)viewangles );
// Code Recoil End

{
// Efecto del flash y disparo del arma
EV_MuzzleFlash();
gEngfuncs.pEventAPI->EV_WeaponAnimation( AK74_FIRE1 + gEngfuncs.pfnRandomLong (0,1), 1);
// Estos dos ultimos numeros son vitales para la animacion del arma. Si tu modelo
// de arma tiene 2 animaciones de disparo, dejalo asi como esta. Si tiene 3
// cambialo //a "(0,2), 2);" Aumentalos si las animaciones de tus armas son
// mayores.


// Esto es para darle una sacudida a la pantalla al disparar, como si el arma
// tuviese patada.
// Ajusta los numeros como gustes

V_PunchAxis( 0, gEngfuncs.pfnRandomFloat( -5, 6 ) ); //-2, 2
}

// Escupir casquillos. Ajusta los 3 ultimos numeros para unir la ejeccion con tu
// modelo

shell = gEngfuncs.pEventAPI->EV_FindModelIndex ("models/shell_AK74.mdl");
EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity,
ShellOrigin, forward, right, up, 20, -14, 8 ); //12, -12, 7 );
EV_EjectBrass(ShellOrigin,
ShellVelocity,
angles[ YAW ],
shell,
TE_BOUNCE_SHELL);

// Sonido de disparo
switch( gEngfuncs.pfnRandomLong( 0, 1 ) )
{
case 0:
gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON,
"weapons/AK74_fire-1.wav",
1, ATTN_NORM, 0,
94 + gEngfuncs.pfnRandomLong( 0, 0xf ) );
break;
case 1:
gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON,
"weapons/AK74_fire-2.wav",
1, ATTN_NORM, 0,
94 + gEngfuncs.pfnRandomLong( 0, 0xf ) );
break;
}

// Disparar y hacer decals por el lado del cliente
EV_GetGunPosition( args, vecSrc, origin );
VectorCopy( forward, vecAiming );
EV_HLDM_FireBullets( idx,
forward,
right,
up,
1,
vecSrc,
vecAiming,
8192,
BULLET_PLAYER_AK74,
0,
0,
args->fparam1,
args->fparam2 );
}

//======================
// AK74 END
//======================


Listo por aca. Supuestamente este es el lado mas complicado, pero ya lo hemos hecho.

Cansado ya?? Todavia falta poco...Abramos el hl_events.cpp y pongamos lo siguiente:

// HLDM
void EV_HornetGunFire( struct event_args_s *args );
void EV_TripmineFire( struct event_args_s *args );
void EV_SnarkFire( struct event_args_s *args );

void EV_FireAK74( struct event_args_s *args );

Ahora bajemos casi al final, para indicar los nombres correctos de cada evento y agreguemos lo siguiente:

gEngfuncs.pfnHookEvent( "events/firehornet.sc", EV_HornetGunFire );
gEngfuncs.pfnHookEvent( "events/tripfire.sc", EV_TripmineFire );
gEngfuncs.pfnHookEvent( "events/snarkfire.sc", EV_SnarkFire );

gEngfuncs.pfnHookEvent( "events/AK74.sc", EV_FireAK74 );

Perfecto, ahora abramos hl_weapons.cpp y preparemos al HUD para nuestra arma:

// HLDM Weapon placeholder entities.
CSatchel g_Satchel;
CTripmine g_Tripmine;
CSqueak g_Snark;

CAK74 g_AK74;

Busquemos mas abajo e incluyamos nuestra arma:

// Allocate slot(s) for each weapon that we are going to be predicting
HUD_PrepEntity( &g_Satchel , &player );
HUD_PrepEntity( &g_Tripmine , &player );
HUD_PrepEntity( &g_Snark , &player );

HUD_PrepEntity( &g_AK74 , &player );

Ahora busquemos esto y al final pongamos nuestra arma tmb:

// Fill in data based on selected weapon
// FIXME, make this a method in each weapon? where you pass in an entity_state_t *?

switch ( from->client.m_iId )
{
case WEAPON_CROWBAR:
pWeapon = &g_Crowbar;
break;

case WEAPON_GLOCK:
pWeapon = &g_Glock;
break;

case WEAPON_AK74:
pWeapon = &g_AK74;
break;


Compila todo esto y has como en el caso anterior.

Listo! Ya terminamos la programacion de nuestra arma!! Cierra el programa y tiralo por la ventana! Ya no lo usaras mas por este momento.

-----------------------------------------------------------------------------------------------DATOS NECESARIOS: ENTORNO DEL HL :
-----------------------------------------------------------------------------------------------

Weno, no creas que ya esta todo... todavia faltan unas pequeñas cositas para dar todo por terminado, pero esta vez trabajaremos dentro de la rama de archivos de tu mod.

Crea una nueva carpeta dentro de la de tu mod llamada 'events' y crea un archivo nuevo en blanco, con nombre ak74.sc y colocalo dentro de esta nueva carpeta.
Te tendria que quedar asi 'nombredelmod\events\ak74.sc'

Oky Doky! Ahora abre el archivo 'skill.cfg' y pon esto en él, en cualquier lado:

// AK-74
sk_plr_AK74_bullet1 "18"
sk_plr_AK74_bullet2 "18"
sk_plr_AK74_bullet3 "18"


Obiamente puedes cambiarles los valores, pero recuerda que el AK es poderosa...!

Ahora tendras que abrir la carpeta 'sprites'.Crea un nuevo archivo de texto llamado weapon_ak74.txt Te tendria que quedar asi 'nombredelmod\sprites\weapon_ak74.txt'.
Agrega lo siguiente:

// ak74

8 // number of sprites
weapon 320 320hud1 0 120 80 20
weapon_s 320 320hud1 0 140 80 20
ammo 320 320hud2 0 16 18 18
crosshair 320 crosshairs 24 0 24 24
weapon 640 640hud1 0 135 170 45
weapon_s 640 640hud4 0 135 170 45
ammo 640 640hud7 0 72 24 24
crosshair 640 crosshairs 24 0 24 24


Por lo que veras, no es demasiado. Tendras las miras tipicas del HL, pero bueno, puedes cambiarlas en otra ocasion...

Necesitaras de modelos ahora. Abre la carpeta 'models' y tendras que incluir modelos dentro de ella, con los siguientes nombres:

v_ak74.mdl
p_ak74.mdl
w_ak74.mdl

w_clipAK74.mdl
shell_AK74


Ahora abriremos la carpeta 'sound\weapons' (si no la tienes, creala) y pon los sonidos de tu AK con estos nombres:

ak74_fire-1.wav
ak74_fire-2.wav


Y para finalizar necesitaremos cambiar el archivo .fgd para que puedas poner esta arma desde el editor que usas para hacer tus mapas e incluirlas.
Busca en las carpetas de tu editor el archivo halflife.fgd. Este archivo sera usado en tu configuracion para mappear para tu Mod. Una vez encontrado haz una copia de el, cambiale al nombre como gustes y pon esto dentro del mismo, al final de todo:.

@PointClass base(Weapon, Targetx) = weapon_AK74 : "AK74 Assault Rifle" []
@PointClass base(Weapon, Targetx) = ammo_AK74 : "AK74 Ammo" []


Ya esta...!! Bastante facil, no? Al fin hemos terminado... Felicitaciones!
Ahora ya tienes en tu Mod una nueva arma lista para usar y hacer los mejores desastres posibles. Este sera el resultado final:

user posted image


-----------------------------------------------------------------------------------------------

Este codigo es casi el mismo que he usado en nuestro nuevo Mod y por lo tanto no tiene fallos, pero es posible que se me haya escapado algun punto, letra o algo, al copiar y es por eso llegue a resultar algun tipo de error. Si encuentran alguna falla o algo, haganmelo saber, por favor.

Legal Stuff:
Pueden copiar, modificar, destruir, usar y/o distribuir este tutorial siempre y cuando no se omita esta fuente. Si usas este codigo, danos algo de credito.

Un saludo a todos de mi parte y espero que este pequeño, pero gran tutorial les sirva de mucha ayuda.

Ultima actualizacion : 12-02-05
Agregado Soporte para MP del arma.
Gracias a ... ups, no lo recuerdo... Por marcar mi error de haber puesto que la carpeta en donde se encuentra 'hl.dsw' era 'cl_dlls' y no 'dll' en realidad. Gracias
.

Proximos tutoriales:
"Como agregar nuevos efectos en el jugador"
"Como agregar nueva fisica en Half-Life"

"Introduccion al SDK Source"


Me gustaria agradecer tambien publicamente a TheDarkRealm por todo su aporte. Gran muchacho!
SysOp - Arrange Mode Mod- © 2004-2005

Mensaje modificado por SysOp el 16 February 2005, 04:45


--------------------

BEST UPCOMING MOD FOR HALF-LIFE - MOD DB AWARDS



BEST UPCOMING MOD FOR HALF-LIFE - MOD DB AWARDS
Go to the top of the page
+Quote Post
|DoGWaLL|
mensaje 6 March 2005, 10:43
Publicado: #2


Yeeeehhaaaaa!!!
Icono de Grupo

Grupo: :: Admin ::



Buen artí­culo, aunque no creo que pueda publicarse en hl2spain. Hablaré con Xen para ver si es posible trasladar el articulo a HLSpain y publicártelo allí­.

Buen trabajo.

Saludos.
Go to the top of the page
+Quote Post
SysOp
mensaje 10 March 2005, 17:14
Publicado: #3


| Who's First ? |


Grupo: Miembros



Ah, claro claro, por que es para HL1, bien igualmente. Vere proximamente si puedo y si tengo tiempo, hacer tutoriales para HL2 que tanto necesita el mundo de los pocos programadores.

Salu2


--------------------

BEST UPCOMING MOD FOR HALF-LIFE - MOD DB AWARDS



BEST UPCOMING MOD FOR HALF-LIFE - MOD DB AWARDS
Go to the top of the page
+Quote Post
dani_kover
mensaje 29 June 2005, 22:30
Publicado: #4


M a e s t r o


Grupo: Miembros



Solo decir que excelente
todo lo que sea desentrelazar el half life se merece un OLÉ
Admiro enormente las personas que hacen mas facil trabajar en este juego
y felicito a todos los que pone su granito de arena para que esta nuestra comunidad amplie sus conocimientos, con tutoriales ( que llevan su trabajo hacerlos)



--------------------
Over & Over again Kover
user posted image
Go to the top of the page
+Quote Post
mash
mensaje 17 August 2005, 14:39
Publicado: #5


.:YO:.


Grupo: Miembros



Estoy mirando el mp5.cpp que hacen cada cosa y viendo me di cuenta que tu dices que el ak dispara debajo del agua y lo defines asi:

QUOTE (SysOp @ 16 February 2005, 03:50)
//KELLY: La gracia del ak es que dispara bajo el agua
    if (m_pPlayer->pev->waterlevel == 3)
    {
          PlayEmptySound( );
          m_flNextPrimaryAttack = 0.15;
          return;
    }
[/color]


pero creo que con esto lo que haces es que no puedas disparar debajo del agua, para ello deverias eliminarlo (no lo he probado), ya que le estas diciendo que en el nivel 3,que es que la cabeza ese debajo del agua, cargue el sonido de clik de no disparar y se salga de la funcion de primer atake. (creo, ya he dixo que no lo he probado)
Date cuenta que es la misma condicion que cuando no tienes balas hace exactamente lo mismo.

Pd: Si me equivoco pos no lo entiendo y perdon por la metedura uis.gif


--------------------
Go to the top of the page
+Quote Post
SysOp
mensaje 19 September 2005, 02:28
Publicado: #6


| Who's First ? |


Grupo: Miembros



Si, gracias por indicar el fallo "Mash"

En realidad esa parte deberia de comentarse (o borrar) para que no compruebe el estado del jugador si esta con los pies en el agua, con el cuerpo, o totalmente sumergido...

Grax dani_cover... Yo le debo mucho a la comunidad y esta es mi manera de agradecerlo smile.gif


--------------------

BEST UPCOMING MOD FOR HALF-LIFE - MOD DB AWARDS



BEST UPCOMING MOD FOR HALF-LIFE - MOD DB AWARDS
Go to the top of the page
+Quote Post
Facon
mensaje 19 September 2005, 16:46
Publicado: #7


Failed!


Grupo: Miembros



Esta muy bien el tutorial, lastima que sea con retraso tongue.gif , ¿Que tal va la parte 2º de fisica de los cuerpos?


--------------------

Go to the top of the page
+Quote Post
AlperiNi
mensaje 18 November 2005, 20:08
Publicado: #8


.: Miembro :.


Grupo: Miembros



XQ ME DA EL SIGUIENTE ERROR ?

CODE
hl_events.obj : error LNK2001: unresolved external symbol _EV_FireAK47
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall CAK47::WeaponIdle(void)" (?WeaponIdle@CAK47@@UAEXXZ)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall CAK47::Reload(void)" (?Reload@CAK47@@UAEXXZ)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall CAK47::PrimaryAttack(void)" (?PrimaryAttack@CAK47@@UAEXXZ)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall CAK47::Deploy(void)" (?Deploy@CAK47@@UAEHXZ)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall CAK47::GetItemInfo(struct ItemInfo *)" (?GetItemInfo@CAK47@@UAEHPAUItemInfo@@@Z)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall CAK47::AddToPlayer(class CBasePlayer *)" (?AddToPlayer@CAK47@@UAEHPAVCBasePlayer@@@Z)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall CAK47::Precache(void)" (?Precache@CAK47@@UAEXXZ)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall CAK47::Spawn(void)" (?Spawn@CAK47@@UAEXXZ)
.\Debug\client.dll : fatal error LNK1120: 9 unresolved externals
Error executing link.exe.

client.dll - 10 error(s), 0 warning(s)
Go to the top of the page
+Quote Post
edguy
mensaje 19 November 2005, 20:01
Publicado: #9


.: Miembro :.


Grupo: Miembros



cambio una cosa y al compilar me da un error en ese archivo solo no me deja cambiar los codigos
Go to the top of the page
+Quote Post
Shepard62700FR
mensaje 6 October 2009, 19:48
Publicado: #10


.: Miembro :.


Grupo: Novatos



Esta lección m' ¡aprendió a cifrar correcta las armas bajo GoldSrc, gracias SysOp!

Para los que tienen errores de compilación: Añada el fichero CPP de su arma en el proyecto cliente.

Traducción por Babelfish, afligido, hablo francés e inglés.
Go to the top of the page
+Quote Post
AndrzzonQ
mensaje 14 May 2010, 15:39
Publicado: #11


.: Miembro :.


Grupo: Novatos



Disculpa por levnatar este viejo post, pero tengo una duda.
Al compilar en el lado DLLS me da el siguientes error:

CÓDIGO
--------------------Configuration: hl - Win32 Profile--------------------
Compiling...
beretta.cpp
D:\SDK\SourceCode\dlls\beretta.cpp(37) : error C2084: function 'void __cdecl weapon_BERETTA(struct entvars_s *)' already has a body
D:\SDK\SourceCode\dlls\beretta.cpp(168) : error C2039: 'FireBulletsPlayer' : is not a member of 'CBasePlayer'
        D:\SDK\SourceCode\dlls\player.h(71) : see declaration of 'CBasePlayer'
D:\SDK\SourceCode\dlls\beretta.cpp(181) : error C2059: syntax error : ')'
Error executing cl-.

beretta.obj - 3 error(s), 0 warning(s)

Alguien me lo aclara por favor? rolleyes.gif

Mensaje modificado por AndrzzonQ el 14 May 2010, 15:42


--------------------



Yo posteo cuando de verdad hay la necesidad de postear.
¡Abajo el Spam!



Go to the top of the page
+Quote Post
Maestro Fénix
mensaje 14 May 2010, 15:47
Publicado: #12


Return to the homeworld
Icono de Grupo

Grupo: Colaborador n1



Abre un post tio, que este lleva muerto la tela.

Y aprendetelo de una vez. ESTA PROHIBIDO resucitar post antiguos.


--------------------
Go to the top of the page
+Quote Post
Jack_wade
mensaje 14 May 2010, 15:49
Publicado: #13


Sombresaliente
Icono de Grupo

Grupo: :: hl2s Team ::



CITA(Maestro Fénix @ 14 May 2010, 16:47) *
Abre un post tio, que este lleva muerto la tela.

Y aprendetelo de una vez. ESTA PROHIBIDO resucitar post antiguos.

Los post que se encuentran en la sección artículos no tienen fecha de caducidad.

Saludos


--------------------
Go to the top of the page
+Quote Post
mikelfruits
mensaje 14 May 2010, 15:49
Publicado: #14


Miembro del Trío Calavera
Icono de Grupo

Grupo: :: hl2s Team ::



CITA(Maestro Fénix @ 14 May 2010, 16:47) *
Abre un post tio, que este lleva muerto la tela.

Y aprendetelo de una vez. ESTA PROHIBIDO resucitar post antiguos.


Y apréndetelo tú de una vez. En artículos NO SE APLICA esta normativa.


--------------------
Move along, citizen.
Go to the top of the page
+Quote Post
ARN
mensaje 17 May 2010, 23:28
Publicado: #15


.: Miembro :.


Grupo: Miembros



Muy bueno el articulo, te felicito ^^
espero los próximos...

Mensaje modificado por ARN el 17 May 2010, 23:33
Go to the top of the page
+Quote Post
 

2 Páginas: V   1 2 >
Reply to this topic Start new topic

 

Versión Lo-Fi Fecha y Hora actual: 7 Feb 2016 - 06:39