Source SDK

Source SDK

Not enough ratings
Añadir nuevos tipos de munición - Motor Source
By Oitnemood
Este tutorial te enseñará a crear tus propios tipos de munición para tus armas.

Tutorial traducido de https://developer.valvesoftware.com/wiki/Adding_New_Ammotypes
originalmente de https://developer.valvesoftware.com
   
Award
Favorite
Favorited
Unfavorite
Nota importante
Nota del autor de la traducción
hay algunas cosas que no se han confirmado como otras que si se ha investigado, parece que tengas Microsoft Visual C++ 2003/2005 así que se sospecha que quizás no este actualizado, así que se estará checando esta guía, se quitara este anuncio cuando se actualice (si hay algo no compatible con el source sdk 2013)

Si planeas añadir varios tipos de munición nuevos, puedes llegar a un límite que hará que tu munición no se recoja. Esto se puede solucionar cambiando los siguientes valores en shareddefs.h para que sean más altos que en el HL2 original:

Sin editar
#define MAX_AMMO_TYPES 32 // ??? #define MAX_AMMO_SLOTS 32 // no son ranuras
Editado
#define MAX_AMMO_TYPES 128 // ??? #define MAX_AMMO_SLOTS 128 // no son ranuras
Definir la munición
Primero tendrá que definir la Munición en las Reglas del Juego

primero define la munision en items.h ubicado en game/server

en la linea 24
define abajo de todo lo definido y pon
#define SIZE_AMMO_ARMA 1
en donde dice arma pon el nombre de tu arma y listo esto lo debes definir en el siguiente comando que vamos a poner

Para hacer esto, primero navegue a hl2mp_gamerules.cpp/hl2_gamerules.cpp en el proyecto del servidor, (Bajo Source Files/HL2 DLL) y navegue a la función CAmmoDef *GetAmmoDef().

En esta función, los tipos de munición necesarios se definen en la estructura tipo tabla, empezando por def.AddAmmoTypes.

Al final de estas definiciones, añada una nueva fila y añada la suya propia, siguiendo la misma estructura (Copiar, pegar y editar funcionará). Como ejemplo, se utilizará la siguiente línea:

def.AddAmmoType("SMG2", DMG_BULLET, TRACER_LINE_AND_WHIZ, "sk_plr_dmg_smg2", "sk_npc_dmg_smg2", "sk_max_smg2", BULLET_IMPULSE(200, 1225), 0 );

Con esta línea se define un nuevo tipo de munición 'SMG2'.

Explicación de def.AddAmmoType:
def.AddAmmoType( const char *name //El nombre del nuevo tipo de munición (Para usar en el script del arma). por ejemplo "SMG2" int damageType //El tipo(s) de daño que tendrá esta munición. por ejemplo "DMG_BULLET . Para más de un tipo de daño, utilice un separador | ( DMG_BULLET | DMG_SNIPER ) int tracerType //El tipo de rastreo a utilizar. Posible de TRACER_NONE, TRACER_LINE y TRACER_LINE_AND_WIZZ int plr_dmg //Un convar de habilidad (sk_) para permitir la modificación dinámica del daño que hará esta munición si se dispara desde el jugador. Defina todas las variables sk_ necesarias en el listado de ConVar alrededor de la línea 100, o escriba un número aquí. por ejemplo, sk_plr_dmg_smg2 int npc_dmg //Lo mismo que lo anterior, excepto el daño causado cuando un NPC usa esta munición int carry //La cantidad máxima de munición permitida. Puede ser un número o un convar sk_. Por ejemplo, sk_max_smg2 float physicsForceImpulse //La fuerza de la munición. Puede ser un número, un cálculo o puedes usar la función BULLET_IMPULSE(grain, ftpersec) para convertir las unidades del mundo real a unidades del juego fácilmente. int nFlags //flags específicas. Siendo posibles AMMO_FORCE_DROP_IF_CARRIED (Si el jugador es golpeado, deja caer cualquier accesorio de física que estuviera sosteniendo) y AMMO_INTERPRET_PLRDAMAGE_AS_DAMAGE_TO_PLAYER (Hace que el plr_dmg varíe el daño al jugador en lugar de desde). Ambos )
Son todo lo que debería necesitar.
Añadir una entidad ammobox
Ahora un Item (Entidad) debe ser provisto, ser renunciado así una la munición (nuevo tipo de munición) puede.


En el archivo Item_Ammo.cpp se definen las clases y las implementaciones.

También allí se define e implementa el Item (Entidad).
// ======================================================================== // >> BoxMRounds // ======================================================================== class CItem_BoxMRounds : public CItem { public: DECLARE_CLASS( CItem_BoxMRounds, CItem ); void Spawn( void ) { Precache( ); SetModel( "models/items/boxmrounds.mdl"); BaseClass::Spawn( ); } void Precache( void ) { PrecacheModel ("models/items/boxmrounds.mdl"); } bool MyTouch( CBasePlayer *pPlayer ) { if (ITEM_GiveAmmo( pPlayer, SIZE_AMMO_SMG1, "SMG1")) { if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_NO ) { UTIL_Remove(this); } return true; } return false; } }; LINK_ENTITY_TO_CLASS(item_box_mrounds, CItem_BoxMRounds); LINK_ENTITY_TO_CLASS(item_ammo_smg1, CItem_BoxMRounds); // ======================================================================== // >> LargeBoxMRounds // ======================================================================== class CItem_LargeBoxMRounds : public CItem { public: DECLARE_CLASS( CItem_LargeBoxMRounds, CItem ); void Spawn( void ) { Precache( ); SetModel( "models/items/boxmrounds.mdl"); BaseClass::Spawn( ); } void Precache( void ) { PrecacheModel ("models/items/boxmrounds.mdl"); } bool MyTouch( CBasePlayer *pPlayer ) { if (ITEM_GiveAmmo( pPlayer, SIZE_AMMO_SMG1_LARGE, "SMG1")) { if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_NO ) { UTIL_Remove(this); } return true; } return false; } }; LINK_ENTITY_TO_CLASS(item_large_box_mrounds, CItem_LargeBoxMRounds); LINK_ENTITY_TO_CLASS(item_ammo_smg1_large, CItem_LargeBoxMRounds);

Nuestras clases se llaman en lugar de:
  • CItem_SmallBoxSMG1
  • CItem_BigBoxSMG1
ahora:
  • CItem_SmallBoxSMG2
  • CItem_BigBoxSMG2
Cuando todo está instalado hay que cambiar 2 cosas más. Estos cambios afectan a ambas clases en el método bool MyTouch( CBasePlayer *pPlayer ) de CSMG2.

Allí debemos cambiar la consulta if (ITEM_GiveAmmo( pPlayer, SIZE_AMMO_SMG1_LARGE, "SMG1")) Hay que cambiar dos cosas.

Y aunque debemos definir SIZE_AMMO_SMG1_ ya sea nuevo, para el SMG2, o puede definir directamente el tamaño de la munición grabable.

Si se desea definir a sí mismo, sólo tiene que insertar el número pertinente de bolas que se debe añadir al toque. Si se quiere definir pero entonces hay que abrir el items.h. Allí, sólo hay que instalar dos nuevos defines.

El segundo es sólo el nombre ser cambiado de SMG1 a SMG2 (sus tipos de munición) debe ser.


Ahora todavía los métodos Spawn y Prechace deben ser cambiados.

Debe ser el nombre de la Modelo( Con ruta de acceso) Introduzca. Si quieres cambiar el nich de los modelos entonces deja estos métodos.

Así tenemos las clases y los métodos. Ahora el código para la entidad en sí sigue


Para esto tienes con las funciones LINK TO ENTITY para enlazar el nombre de la clase con el nombre de la entidad.


Ahora la Entidad debe ser fusionada aún en el FGD del Mod.

Para esto tienes que abrir el FGD y escribir lo siguiente:
@PointClass base(Item) studio("models/items/boxmrounds.mdl")= item_ammo_smg2 : "Box of SMG2 ammo" []

Para una entidad es de tipo item con el modelo models/items/boxmrounds.mdl para el editor del hammer proporcionado.

El artículo se llama entonces item_ammo_smg2 y contiene la descripción Caja de munición SMG2.
Implementación de la munición en un arma
Problema:

  • Valve tiene archivos txt de las armas codificadas
Por lo tanto, debemos crear usted mismo un arma.


Si ya has codificado tu propia arma, entonces debes abrir el arma Weapons_Name.txt.

Si no abrir el arma_smg1.txt


Sólo debe haber la línea
"primary_ammo" "SMG1"
a través de
"primary_ammo" "SMG2"
Reemplazar