tosqualler Posté(e) le 5 mars 2006 Signaler Posté(e) le 5 mars 2006 Dans ce tutoriale, je vais vous montrer comment ajouter une arme, pour ce faire nous allons dupliquer le python 357 magnums. Choix simple car l'arme possède que très peux de fonctions. Nous nommerons le double du 357 un USP. Logiciel utilisé -Steam. -SDK. -Editeur C++. -Recherche windows. Créons les munitions. Pour éviter toutes confusion, nous allons crée des munitions pour notre nouvelle arme. Pour cela, rendez-vous dans la source "item_ammo.cpp". Et faites une recherche a 357. Vous obitendrez 2grosses fonctions. [cpp] // ======================================================================== // >> CItem_Box357Rounds // ======================================================================== class CItem_Box357Rounds : public CItem { public: DECLARE_CLASS( CItem_Box357Rounds, CItem ); void Precache( void ) { PrecacheModel ("models/items/357ammo.mdl"); } void Spawn( void ) { Precache( ); SetModel( "models/items/357ammo.mdl"); BaseClass::Spawn( ); } bool MyTouch( CBasePlayer *pPlayer ) { if (ITEM_GiveAmmo( pPlayer, SIZE_AMMO_357, "357")) { if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_NO ) { UTIL_Remove(this); } return true; } return false; } }; LINK_ENTITY_TO_CLASS(item_ammo_357, CItem_Box357Rounds); // ======================================================================== // >> CItem_LargeBox357Rounds // ======================================================================== class CItem_LargeBox357Rounds : public CItem { public: DECLARE_CLASS( CItem_LargeBox357Rounds, CItem ); void Precache( void ) { PrecacheModel ("models/items/357ammobox.mdl"); } void Spawn( void ) { Precache( ); SetModel( "models/items/357ammobox.mdl"); BaseClass::Spawn( ); } bool MyTouch( CBasePlayer *pPlayer ) { if (ITEM_GiveAmmo( pPlayer, SIZE_AMMO_357_LARGE, "357")) { if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_NO ) { UTIL_Remove(this); } return true; } if (ITEM_GiveAmmo( pPlayer, SIZE_AMMO_357_LARGE, "usp")) { if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_NO ) { UTIL_Remove(this); } return true; } return false; } }; LINK_ENTITY_TO_CLASS(item_ammo_357_large, CItem_LargeBox357Rounds); [/cpp] Faites en un copier/coller a la suite de ces dernières et changer les 357 par usp. ATTENTION AUX MAJUSCULES... VERIFIER BIEN QUE VOUS SUIVEZ BIEN LES MAJUSCULES COMME POUR LE PISTOL PAR EXEMPLE !!! ça donnera ceci [cpp] ///// // ======================================================================== // >> CItem_BoxUSPRounds // ======================================================================== class CItem_BoxUspRounds : public CItem { public: DECLARE_CLASS( CItem_BoxUspRounds, CItem ); // declaration void Precache( void ) // mise en memoir { PrecacheModel ("models/items/357ammo.mdl"); // mise en memoir du model } void Spawn( void ) // mise en jeux { Precache( ); SetModel( "models/items/357ammo.mdl"); // mise en jeux du model BaseClass::Spawn( ); } bool MyTouch( CBasePlayer *pPlayer ) // quand le joeur touche l'entitée mise en jeux { if (ITEM_GiveAmmo( pPlayer, SIZE_AMMO_USP, "USP")) // si il a besoin de munition il lui en donne { if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_NO ) { UTIL_Remove(this); } return true; } return false; } }; LINK_ENTITY_TO_CLASS(item_ammo_usp, CItem_BoxUspRounds); // deffinition de la class xD // ======================================================================== // >> CItem_LargeBoxUSPRounds // ======================================================================== class CItem_LargeBoxUspRounds : public CItem { public: DECLARE_CLASS( CItem_LargeBoxUspRounds, CItem ); /declaration void Precache( void ) // mise en memoir { PrecacheModel ("models/items/357ammobox.mdl"); // mise en memoir du model } void Spawn( void ) // mise en jeux { Precache( ); SetModel( "models/items/357ammobox.mdl"); // mise en jeux du model BaseClass::Spawn( ); } bool MyTouch( CBasePlayer *pPlayer ) // quand le joeur touche l'entitée mise en jeux { if (ITEM_GiveAmmo( pPlayer, SIZE_AMMO_USP_LARGE, "USP")) // si il a besoin de munition il lui en donne { if ( g_pGameRules->ItemShouldRespawn( this ) == GR_ITEM_RESPAWN_NO ) { UTIL_Remove(this); } return true; } return false; } }; LINK_ENTITY_TO_CLASS(item_ammo_USP_large, CItem_LargeBoxUspRounds); // deffinition de la class xD ///// [/cpp] ATTENTION :: laisser bien les models du 357, nous codons !! Nous ne modelons pas Différence entre LARGE et BOX ::-Box = petite caisse de munition -LARGE = grosse caisse de munition Continuons notre recherche du 357 dans cette source, nous trouvons ceci [cpp] // Ammo types enum { AMMOCRATE_SMALL_ROUNDS, AMMOCRATE_MEDIUM_ROUNDS, AMMOCRATE_LARGE_ROUNDS, AMMOCRATE_RPG_ROUNDS, AMMOCRATE_BUCKSHOT, AMMOCRATE_GRENADES, AMMOCRATE_357, AMMOCRATE_CROSSBOW, AMMOCRATE_AR2_ALTFIRE, NUM_AMMO_CRATE_TYPES, }; [/cpp] devient logiquement [cpp] // Ammo types enum { AMMOCRATE_SMALL_ROUNDS, AMMOCRATE_MEDIUM_ROUNDS, AMMOCRATE_LARGE_ROUNDS, AMMOCRATE_RPG_ROUNDS, AMMOCRATE_BUCKSHOT, AMMOCRATE_GRENADES, AMMOCRATE_357, AMMOCRATE_USP, AMMOCRATE_CROSSBOW, AMMOCRATE_AR2_ALTFIRE, NUM_AMMO_CRATE_TYPES, }; [/cpp] Continuons... [cpp] // Models names const char *CItem_AmmoCrate::m_lpzModelNames[NUM_AMMO_CRATE_TYPES] = { "models/items/ammocrate_bullets.mdl", // Small rounds "models/items/ammocrate_smg1.mdl", // Medium rounds "models/items/ammocrate_ar2.mdl", // Large rounds "models/items/ammocrate_rockets.mdl", // RPG rounds "models/items/ammocrate_buckshot.mdl", // Buckshot "models/items/ammocrate_grenade.mdl", // Grenades "models/items/ammocrate_357.mdl", // 357 "models/items/ammocrate_bullets.mdl", // Crossbow //FIXME: This model is incorrect! "models/items/ammocrate_ar2.mdl", // Combine Ball }; [/cpp] devient [cpp] // Models names const char *CItem_AmmoCrate::m_lpzModelNames[NUM_AMMO_CRATE_TYPES] = { "models/items/ammocrate_bullets.mdl", // Small rounds "models/items/ammocrate_smg1.mdl", // Medium rounds "models/items/ammocrate_ar2.mdl", // Large rounds "models/items/ammocrate_rockets.mdl", // RPG rounds "models/items/ammocrate_buckshot.mdl", // Buckshot "models/items/ammocrate_grenade.mdl", // Grenades "models/items/ammocrate_357.mdl", // 357 "models/items/ammocrate_357.mdl", // usp "models/items/ammocrate_bullets.mdl", // Crossbow //FIXME: This model is incorrect! "models/items/ammocrate_ar2.mdl", // Combine Ball }; [/cpp] Pourquoi, je ne sais pas vraiment...Continuons encore notre recherche. [cpp] // Ammo type names const char *CItem_AmmoCrate::m_lpzAmmoNames[NUM_AMMO_CRATE_TYPES] = { "Pistol", "SMG1", "AR2", "RPG_Round", "Buckshot", "Grenade", "357", "XBowBolt", "AR2AltFire", }; [/cpp] devient logiquement [cpp] // Ammo type names const char *CItem_AmmoCrate::m_lpzAmmoNames[NUM_AMMO_CRATE_TYPES] = { "Pistol", "SMG1", "AR2", "RPG_Round", "Buckshot", "Grenade", "357", "Usp", "XBowBolt", "AR2AltFire", }; [/cpp] C'est ici que sont donné les nom des munitions, qui seront apres dans le script de l'arme...Voir plus loin. Apres nous trouvons ceci. [cpp] // Ammo amount given per +use int CItem_AmmoCrate::m_nAmmoAmounts[NUM_AMMO_CRATE_TYPES] = { 300, // Pistol 300, // SMG1 300, // AR2 3, // RPG rounds 120, // Buckshot 5, // Grenades 50, // 357 50, // Crossbow 3, // AR2 alt-fire }; const char *CItem_AmmoCrate::m_pGiveWeapon[NUM_AMMO_CRATE_TYPES] = { NULL, // Pistol NULL, // SMG1 NULL, // AR2 NULL, // RPG rounds NULL, // Buckshot "weapon_frag", // Grenades NULL, // 357 NULL, // Crossbow NULL, // AR2 alt-fire }; #define AMMO_CRATE_CLOSE_DELAY 1.5f [/cpp] qui devient, comme d'habitude... [cpp] // Ammo amount given per +use int CItem_AmmoCrate::m_nAmmoAmounts[NUM_AMMO_CRATE_TYPES] = { 300, // Pistol 300, // SMG1 300, // AR2 3, // RPG rounds 120, // Buckshot 5, // Grenades 50, // 357 50, // usp 50, // Crossbow 3, // AR2 alt-fire }; const char *CItem_AmmoCrate::m_pGiveWeapon[NUM_AMMO_CRATE_TYPES] = { NULL, // Pistol NULL, // SMG1 NULL, // AR2 NULL, // RPG rounds NULL, // Buckshot "weapon_frag", // Grenades NULL, // 357 NULL, // Usp NULL, // Crossbow NULL, // AR2 alt-fire }; #define AMMO_CRATE_CLOSE_DELAY 1.5f [/cpp] Voila les munitions sont crées, des points restent obscure...Si quelqu'un a une réponse au point obscure qu'il la donne Création de l'arme. Ici, c'est le plus dure et le plus fastidieux...Crée un fichier weapon_usp.cpp dans le dossier C:\Program Files\Steam\SteamApps\SourceMods\test\src\dlls\hl2_dll Prenez la source de weapon_357.cpp et faites un copier/coller total dans le weapon_usp.cpp, et changer les 357 par des usp ATTENTION AUX MAJUSCULES... VERIFIER BIEN QUE VOUS SUIVEZ BIEN LES MAJUSCULES COMME POUR LE PISTOL PAR EXEMPLE !!! ceci donnera [cpp] //========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: usp - hand gun // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "NPCEvent.h" #include "basehlcombatweapon.h" #include "basecombatcharacter.h" #include "AI_BaseNPC.h" #include "player.h" #include "gamerules.h" #include "in_buttons.h" #include "soundent.h" #include "game.h" #include "vstdlib/random.h" #include "engine/IEngineSound.h" #include "te_effect_dispatch.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" //----------------------------------------------------------------------------- // CWeaponUsp //----------------------------------------------------------------------------- class CWeaponUsp : public CBaseHLCombatWeapon { DECLARE_CLASS( CWeaponUsp, CBaseHLCombatWeapon ); public: CWeaponUsp( void ); void PrimaryAttack( void ); void Operator_HandleAnimEvent( animevent_t *pEvent, CBaseCombatCharacter *pOperator ); DECLARE_SERVERCLASS(); DECLARE_DATADESC(); }; LINK_ENTITY_TO_CLASS( weapon_usp, CWeaponUsp ); PRECACHE_WEAPON_REGISTER( weapon_usp ); IMPLEMENT_SERVERCLASS_ST( CWeaponUsp, DT_WeaponUsp ) END_SEND_TABLE() BEGIN_DATADESC( CWeaponUsp ) END_DATADESC() //----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- CWeaponUsp::CWeaponUsp( void ) { m_bReloadsSingly = false; m_bFiresUnderwater = false; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponUsp::Operator_HandleAnimEvent( animevent_t *pEvent, CBaseCombatCharacter *pOperator ) { CBasePlayer *pOwner = ToBasePlayer( GetOwner() ); switch( pEvent->event ) { case EVENT_WEAPON_RELOAD: { CEffectData data; // Emit six spent shells for ( int i = 0; i < 6; i++ ) { data.m_vOrigin = pOwner->WorldSpaceCenter() + RandomVector( -4, 4 ); data.m_vAngles = QAngle( 90, random->RandomInt( 0, 360 ), 0 ); data.m_nEntIndex = entindex(); DispatchEffect( "ShellEject", data ); } break; } } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CWeaponUsp::PrimaryAttack( void ) { // Only the player fires this way so we can cast CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); if ( !pPlayer ) // si player n'existe aps { return; // fin } if ( m_iClip1 <= 0 ) // si plus de munition dans le chargeur { if ( !m_bFireOnEmpty ) // si il en reste en poche { Reload(); // reload } else // sinon { WeaponSound( EMPTY ); // son d'arme vide m_flNextPrimaryAttack = 0.15; } return; // fin de la condition } WeaponSound( SINGLE ); pPlayer->DoMuzzleFlash(); // aucune idée de ce qu'est le "flash" SendWeaponAnim( ACT_VM_PRIMARYATTACK ); // animation de l'attack pPlayer->SetAnimation( PLAYER_ATTACK1 ); // animation de l'attack m_flNextPrimaryAttack = gpGlobals->curtime + 0.75; m_flNextSecondaryAttack = gpGlobals->curtime + 0.75; m_iClip1--; Vector vecSrc = pPlayer->Weapon_ShootPosition(); Vector vecAiming = pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); pPlayer->FireBullets( 1, vecSrc, vecAiming, vec3_origin, MAX_TRACE_LENGTH, m_iPrimaryAmmoType, 0 ); // choix des munitions en rapport avec le script de l'arme pPlayer->SetMuzzleFlashTime( gpGlobals->curtime + 0.5 ); //Disorient the player QAngle angles = pPlayer->GetLocalAngles(); angles.x += random->RandomInt( -1, 1 );//c'est 3commandes angles.y += random->RandomInt( -1, 1 );//dirigent le recule avec angles.z = 0; //les axes x,y,z pPlayer->SnapEyeAngles( angles ); pPlayer->ViewPunch( QAngle( -8, random->RandomFloat( -2, 2 ), 0 ) ); CSoundEnt::InsertSound( SOUND_COMBAT, GetAbsOrigin(), 600, 0.2, GetOwner() );// le son joué if ( !m_iClip1 && pPlayer->GetAmmoCount( m_iPrimaryAmmoType ) <= 0 ) // si plus de muntions dans le chargeur et dans la poche xD { // HEV suit - indicate out of ammo condition pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 ); // indication sur l'HUD qu'on en a plus } } [/cpp] Lancer une recherche Windows ( démarrer => recherche ), mettez comme destination le dossier du MOD, et taper 357, après votre recherche qui ne donnera rien, ajouter la fonction recherche dans le contenu du fichier. Et la une liste de source s'affiche c'est toute celle a modifier !! Enfin presque. Commençons par "c_baseanimating.cpp" Trouvez les lignes du 357, faites-en un copier/coller a la suite du 357 et changer 357 par USP [cpp] else if ( Q_stricmp( token, "357" ) == 0 ) { weaponType = MUZZLEFLASH_357; } else if ( Q_stricmp( token, "USP" ) == 0 ) { weaponType = MUZZLEFLASH_USP; } [/cpp] Maintenant "c_te_legacytempents.cpp", un peux plus dure, faites comme pour la source précédente un copier/coller... [cpp] case MUZZLEFLASH_357: if ( firstPerson ) { MuzzleFlash_357_Player( entityIndex, attachmentIndex ); } break; case MUZZLEFLASH_USP: if ( firstPerson ) { MuzzleFlash_Usp_Player( entityIndex, attachmentIndex ); } break; [/cpp] C’est une condition d'existence utilisant un switch... En cherchant dans cette source, nous trouvons une énorme fonction [cpp] void CTempEnts::MuzzleFlash_357_Player( int entityIndex, int attachmentIndex ) { ... } [/cpp] Ben comme a notre habitudes, copier/coller la a la suite, en changeant les 357 par usp... ATTENTION AUX MAJUSCULES... VERIFIER BIEN QUE VOUS SUIVEZ BIEN LES MAJUSCULES COMME POUR LE PISTOL PAR EXEMPLE !!! Cela donne... [cpp] //////////////////// //================================================== // Purpose: //================================================== void CTempEnts::MuzzleFlash_Usp_Player( int entityIndex, int attachmentIndex ) { VPROF_BUDGET( "MuzzleFlash_USP_Player", VPROF_BUDGETGROUP_PARTICLE_RENDERING ); CSmartPtr pSimple = CSimpleEmitter::Create( "MuzzleFlash_Usp_Player" ); pSimple->SetDrawBeforeViewModel( true ); Vector origin; QAngle angles; // Get our attachment's transformation matrix FX_GetAttachmentTransform( entityIndex, attachmentIndex, &origin, &angles ); Vector forward; AngleVectors( angles, &forward, NULL, NULL ); SimpleParticle *pParticle; Vector offset; // Smoke offset = origin + forward * 8.0f; pParticle = (SimpleParticle *) pSimple->AddParticle( sizeof( SimpleParticle ), pSimple->GetPMaterial( "particle/particle_smokegrenade" ), offset ); if ( pParticle == NULL ) return; pParticle->m_flLifetime = 0.0f; pParticle->m_flDieTime = random->RandomFloat( 0.5f, 1.0f ); pParticle->m_vecVelocity.Init(); pParticle->m_vecVelocity = forward * random->RandomFloat( 8.0f, 64.0f ); pParticle->m_vecVelocity[2] += random->RandomFloat( 4.0f, 16.0f ); int color = random->RandomInt( 200, 255 ); pParticle->m_uchColor[0] = color; pParticle->m_uchColor[1] = color; pParticle->m_uchColor[2] = color; pParticle->m_uchStartAlpha = random->RandomInt( 64, 128 ); pParticle->m_uchEndAlpha = 0; pParticle->m_uchStartSize = random->RandomInt( 2, 4 ); pParticle->m_uchEndSize = pParticle->m_uchStartSize * 8.0f; pParticle->m_flRoll = random->RandomInt( 0, 360 ); pParticle->m_flRollDelta = random->RandomFloat( -0.5f, 0.5f ); float flScale = random->RandomFloat( 1.25f, 1.5f ); // Flash for ( int i = 1; i < 6; i++ ) { offset = origin + (forward * (i*8.0f*flScale)); pParticle = (SimpleParticle *) pSimple->AddParticle( sizeof( SimpleParticle ), pSimple->GetPMaterial( VarArgs( "effects/muzzleflash%d_noz", random->RandomInt(1,4) ) ), offset ); if ( pParticle == NULL ) return; pParticle->m_flLifetime = 0.0f; pParticle->m_flDieTime = 0.01f; pParticle->m_vecVelocity.Init(); pParticle->m_uchColor[0] = 255; pParticle->m_uchColor[1] = 255; pParticle->m_uchColor[2] = 200+random->RandomInt(0,55); pParticle->m_uchStartAlpha = 255; pParticle->m_uchEndAlpha = 255; pParticle->m_uchStartSize = ( (random->RandomFloat( 6.0f, 8.0f ) * (8-(i))/6) * flScale ); pParticle->m_uchEndSize = pParticle->m_uchStartSize; pParticle->m_flRoll = random->RandomInt( 0, 360 ); pParticle->m_flRollDelta = 0.0f; //les "pParticle" concerne les reflets sur le model de l'arme } } //////////////////// [/cpp] Voila nous avons fini le "c_te_legacytempents.cpp", passons au suivant le "c_te_legacytempents.h" ( la seront déclaré ce qui a dans "c_te_legacytempents.cpp" ) Copier/coller/renommer comme d'habitude ce que vous trouvez... [cpp] // Combine void MuzzleFlash_Combine_Player( int entityIndex, int attachmentIndex ); void MuzzleFlash_Combine_NPC( int entityIndex, int attachmentIndex ); // 357 void MuzzleFlash_357_Player( int entityIndex, int attachmentIndex ); // USP void MuzzleFlash_Usp_Player( int entityIndex, int attachmentIndex ); // RPG void MuzzleFlash_RPG_NPC( int entityIndex, int attachmentIndex ); [/cpp] Suivant..."func_break.cpp" Copier/coller/renommer comme d'habitude ce que vous trouvez... ( ça devient lourd n'est-ce pas xD bah nous dupliquons donc logique xD) [cpp] "weapon_357", // 12 "ammo_357", // 13 "weapon_usp", // 12 "ammo_usp", // 13 [/cpp] Suivant..."items.h" Copier/coller/renomer comme d'habitude ce que vous trouvez... [cpp] #define SIZE_AMMO_357 6 #define SIZE_AMMO_357_LARGE 20 #define SIZE_AMMO_USP 6 #define SIZE_AMMO_USP_LARGE 20 [/cpp] ICI c'est intéressant...C'est les munitions ce trouvant dans les boite de munitions...Voir la partie "crée munition" Suivant..."shareddefs.h" Copier/coller/renommer comme d'habitude ce que vous trouvez... [cpp] MUZZLEFLASH_COMBINE, MUZZLEFLASH_357, MUZZLEFLASH_USP, MUZZLEFLASH_RPG, [/cpp] Ici c'est les déclarations des variables flash mais qu'est-ce c'est flash? Point obscur pour moi... Suivant..."c_weapon__stubs_hl2.cpp" Copier/coller/renommer comme d'habitude ce que vous trouvez...Même si ici vous voyez HL2MP ( ça ne changera peut être rien mais on ne sait jamais ) [cpp] #ifndef HL2MP STUB_WEAPON_CLASS( weapon_ar2, WeaponAR2, C_HLMachineGun ); STUB_WEAPON_CLASS( weapon_frag, WeaponFrag, C_BaseHLCombatWeapon ); STUB_WEAPON_CLASS( weapon_rpg, WeaponRPG, C_BaseHLCombatWeapon ); STUB_WEAPON_CLASS( weapon_pistol, WeaponPistol, C_BaseHLCombatWeapon ); STUB_WEAPON_CLASS( weapon_shotgun, WeaponShotgun, C_BaseHLCombatWeapon ); STUB_WEAPON_CLASS( weapon_smg1, WeaponSMG1, C_HLSelectFireMachineGun ); STUB_WEAPON_CLASS( weapon_357, Weapon357, C_BaseHLCombatWeapon ); STUB_WEAPON_CLASS( weapon_usp, WeaponUsp, C_BaseHLCombatWeapon ); STUB_WEAPON_CLASS( weapon_crossbow, WeaponCrossbow, C_BaseHLCombatWeapon ); STUB_WEAPON_CLASS( weapon_slam, Weapon_SLAM, C_BaseHLCombatWeapon ); STUB_WEAPON_CLASS( weapon_crowbar, WeaponCrowbar, C_BaseHLBludgeonWeapon ); #endif [/cpp] Suivant..."hl2mp_player.cpp" Copier/coller/renommer comme d'habitude ce que vous trouvez...Même si ici vous voyez HL2MP ( ça ne changera peut être rien mais on ne sait jamais ) [cpp] CBasePlayer::GiveAmmo( 32, "357" ); // nombre de munitions de type 357 CBasePlayer::GiveAmmo( 32, "usp" ); // nombre de munitions de type usp ... GiveNamedItem( "weapon_pistol" ); // donne l'arme pistol GiveNamedItem( "weapon_357" ); // donne l'arme 357 GiveNamedItem( "weapon_usp" ); // donne l'arme usp [/cpp] Au fait, c'est ce qui gère la commande, "impulse 101" qui donne toute les armes Suivant..."hl2_player.cpp" Copier/coller/renommer comme d'habitude ce que vous trouvez... [cpp] BaseClass::GiveAmmo( 5, "grenade"); BaseClass::GiveAmmo( 32, "357" ); BaseClass::GiveAmmo( 32, "Usp" ); BaseClass::GiveAmmo( 16, "XBowBolt" ); ... GiveNamedItem( "weapon_357" ); GiveNamedItem( "weapon_usp" ); GiveNamedItem( "weapon_crossbow" ); [/cpp] ICI EST GERER TOUT LES VARIABLES DU IMPULSE...Regardez ce que donne par exemple le 83 ou le 82... Suivant..."item_ammo.cpp" DEJA FAIT Suivant..."item_dynamic_resupply.cpp" Copier/coller/renommer comme d'habitude ce que vous trouvez... [cpp] { "weapon_frag", "Grenade", 1, 0.1f }, { "item_ammo_357", "357", SIZE_AMMO_357, 0.0f }, { "item_ammo_usp", "Usp", SIZE_AMMO_USP, 0.0f }, { "item_ammo_crossbow", "XBowBolt", SIZE_AMMO_CROSSBOW, 0.0f }, [/cpp] [cpp] DEFINE_KEYFIELD( m_flDesiredAmmo[6], FIELD_FLOAT, "DesiredAmmoGrenade" ), DEFINE_KEYFIELD( m_flDesiredAmmo[7], FIELD_FLOAT, "DesiredAmmo357" ), DEFINE_KEYFIELD( m_flDesiredAmmo[8], FIELD_FLOAT, "DesiredAmmoUsp" ), DEFINE_KEYFIELD( m_flDesiredAmmo[9], FIELD_FLOAT, "DesiredAmmoCrossbow" ), [/cpp] [cpp] m_flDesiredAmmo[6] = 0.1; // Grenade m_flDesiredAmmo[7] = 0; // 357 m_flDesiredAmmo[8] = 0; // usp m_flDesiredAmmo[9] = 0; // Crossbow [/cpp] Suivant..."npc_combines.cpp" On n'y touche pas Suivant..."weapon_357.cpp" On l'a déjà fait Suivant..."hl2_gamerules.cpp" Copier/coller/renommer comme d'habitude ce que vous trouvez... [cpp] ConVar sk_plr_dmg_357 ( "sk_plr_dmg_357", "0", FCVAR_REPLICATED ); ConVar sk_npc_dmg_357 ( "sk_npc_dmg_357", "0", FCVAR_REPLICATED ); ConVar sk_max_357 ( "sk_max_357", "0", FCVAR_REPLICATED ); ConVar sk_plr_dmg_usp ( "sk_plr_dmg_usp", "10", FCVAR_REPLICATED ); // 10 comme 10 de dégats ConVar sk_npc_dmg_usp ( "sk_npc_dmg_usp", "60", FCVAR_REPLICATED ); // 60 comme 60munitions en poche ConVar sk_max_usp ( "sk_max_usp", "0", FCVAR_REPLICATED ); [/cpp] Vous pouvez a tout moment changer la valeur des variables grace au commande pile apres ConVar ( = commande console ) [cpp] def.AddAmmoType("357", DMG_BULLET, TRACER_LINE_AND_WHIZ, "sk_plr_dmg_357", "sk_npc_dmg_357", "sk_max_357", BULLET_IMPULSE(800, 5000), 0 ); def.AddAmmoType("Usp", DMG_BULLET, TRACER_LINE_AND_WHIZ, "sk_plr_dmg_usp", "sk_npc_dmg_usp", "sk_max_usp", BULLET_IMPULSE(800, 5000), 0 ); [/cpp] Suivant..."weapon_357.cpp" du dossier HL2MP On n'y touche pas Suivant..."hl2mp_gamerules.cpp" Copier/coller/renommer comme d'habitude ce que vous trouvez...Même si ici vous voyez HL2MP ( ça ne changera peut etre rien mais on ne sait jamais ) [cpp] def.AddAmmoType("SMG1", DMG_BULLET, TRACER_LINE_AND_WHIZ, 0, 0, 225, BULLET_IMPULSE(200, 1225), 0 ); def.AddAmmoType("357", DMG_BULLET, TRACER_LINE_AND_WHIZ, 0, 0, 12, BULLET_IMPULSE(800, 5000), 0 ); def.AddAmmoType("Usp", DMG_BULLET, TRACER_LINE_AND_WHIZ, 0, 0, 12, BULLET_IMPULSE(800, 5000), 0 ); def.AddAmmoType("XBowBolt", DMG_BULLET, TRACER_LINE, 0, 0, 10, BULLET_IMPULSE(800, 8000), 0 ); [/cpp] VOTRE ARME EST CRÉE... Faire le script de son arme. Aller dans le dossier C:\Program Files\Steam\SteamApps\SourceMods\test\scripts Copier/coller le fichier weapon_357.txt en weapon_usp.txt [cpp] // 357 WeaponData { // Weapon data is loaded by both the Game and Client DLLs. "printname" "#HL2_357Handgun" // nom de l'arme dans le HUD "viewmodel" "models/weapons/v_357.mdl" // mode de l'arme en vue FPS "playermodel" "models/weapons/w_357.mdl" // model de l'arme a terre "anim_prefix" "python" // nom de l'animation de la prise de l'arme "bucket" "1" // position dans le menu des armes ( 1 = les pistolets ) "bucket_position" "1" // position par rapport au autre pistolet ( 0 = pistol, 1 = 357, nous mettrons 2 ) "clip_size" "6" "default_clip" "6" "primary_ammo" "357" // type de munition, nous mettrons usp au lieu de 357 "secondary_ammo" "None" "weight" "7" "item_flags" "0" // Sounds for the weapon. There is a max of 16 sounds per category (i.e. max 16 "single_shot" sounds) SoundData { "empty" "Weapon_Pistol.Empty" "single_shot" "Weapon_357.Single" } // Weapon Sprite data is loaded by the Client DLL. TextureData { "weapon" { "font" "WeaponIcons" "character" "e" } "weapon_s" { "font" "WeaponIconsSelected" "character" "e" } "ammo" { "font" "WeaponIcons" "character" "q" } "crosshair" { "font" "Crosshairs" "character" "Q" } "autoaim" { "file" "sprites/crosshairs" "x" "0" "y" "48" "width" "24" "height" "24" } } } [/cpp] Le reste, il suffit de lire, les lettres correspondent à la place dans les fichiers des textures... Mon weapon_usp [cpp] // USP WeaponData { // Weapon data is loaded by both the Game and Client DLLs. "printname" "USP" "viewmodel" "models/weapons/v_357.mdl" "playermodel" "models/weapons/w_357.mdl" "anim_prefix" "python" "bucket" "1" "bucket_position" "3" "clip_size" "6" "default_clip" "10" "primary_ammo" "usp" "secondary_ammo" "None" "weight" "7" "item_flags" "0" // Sounds for the weapon. There is a max of 16 sounds per category (i.e. max 16 "single_shot" sounds) SoundData { "empty" "Weapon_Pistol.Empty" "single_shot" "Weapon_357.Single" } // Weapon Sprite data is loaded by the Client DLL. TextureData { "weapon" { "font" "WeaponIcons" "character" "e" } "weapon_s" { "font" "WeaponIconsSelected" "character" "e" } "ammo" { "font" "WeaponIcons" "character" "q" } "crosshair" { "font" "Crosshairs" "character" "Q" } "autoaim" { "file" "sprites/crosshairs" "x" "0" "y" "48" "width" "24" "height" "24" } } } [/cpp] Tester son arme. Utilisez la source de la map test, enlevé les entités pour le 357...compiler, lancer. Dans le jeu taper dans la console give weapon_357 give weapon_usp Et vous aurez 2armes différentes Ajouter les entités de son arme dans une map. Une recherche préalable dans la configuration de hammer est préférable, car vous devrez changer le chemin du fichier FGD... Direction C:\Program Files\Steam\SteamApps\votre_compte\sourcesdk\bin Copier/coller le fichier halflife2.fgd Dans C:\Program Files\Steam\SteamApps\SourceMods\test Et faites en sorte que hammer l'utilise Ouvrez halflife2.fgd avec bloc-notes par exemple Et comme a notre habitude copier/coller tout ce qui se rapporte au 357 et renommer usp... Maintenant dans hammer se trouveront les entités pour l'usp... Je n’ai pas retesté après. Ce tutos et ces recherches dans le SDK m’ont prit toute une après-midi… Les sources et le MOD viendront plus tard...Mal de tete xD EDIT :: bug trouvé, les munitions ne sont pas encore associer a l'arme...Je travaille encore dessu... EDIT2 :: bug corriger, les variables gerant les munitions et les degat etaient sur 0 voir le "hl2_gamerules.cpp". Normalement tout fonctionne, je dis normalement car pour trouver se bug j'ai dut beaucoup beaucoup modifier la source et ça un peu partout
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.