Итак, прежде всего.... Да, скачаем файл w-saw.cpp и включим его в серверной проект. Затем, открываем weapons.cpp И пишем там примерно 328 строчке(после UTIL_PrecacheOther( "item_longjump" );) Code //SAW UTIL_PrecacheOther( "ammo_556" ); На 180: Code case BULLET_PLAYER_556: Переходим на район 362 строчки(сразу после блока с python`ом): Code #if !defined( OEM_BUILD ) && !defined( HLDEMO_BUILD ) // SAW UTIL_PrecacheOtherWeapon( "weapon_saw" ); UTIL_PrecacheOther( "ammo_556" ); #endif Теперь открываем weapons.h на 83-82 строчке и пишем: Code #define WEAPON_SAW 18//SAW Дальше на 108-107: Code #define SAW_WEIGHT 20//SAW Затем чуть ниже, после #define _357_MAX_CARRY 240, пишем Code #define _556_MAX_CARRY 250//SAW CARTRIGES На 147 строчке пишем максимальное кол-во патронов в магазине для нашего пулемёта: Code #define SAW_MAX_CLIP 100//SAW clip 167: Code #define SAW_DEFAULT_GIVE 100 182: Code #define AMMO_556_BOXGIVE 100//SAW Чуть ниже в typedef enum добавим: Code BULLET_PLAYER_556, //SAW PLAYER А на 658-663 строчке добавим новый класс: Code class CSAW : public CBasePlayerWeapon { public: void Spawn( void ); void Precache( void ); int iItemSlot( void ) { return 6; } int GetItemInfo(ItemInfo *p); int AddToPlayer( CBasePlayer *pPlayer ); void PrimaryAttack( void ); BOOL Deploy( void ); void Holster( int skiplocal = 0 ); void Reload( void ); void WeaponIdle( void ); float m_flSoundDelay;
int m_iShell; int m_iLink;
virtual BOOL UseDecrement( void ) { #if defined( CLIENT_WEAPONS ) return TRUE; #else return FALSE; #endif }
private: unsigned short m_usFireSAW; }; Откроем теперь skill.h и на 102: Code float plrDmg556;//SAW dmg Откроем player.cpp и зайдём в void CBasePlayer::TabulateAmmo(): Code ammo_556 = AmmoInventory( GetAmmoIndex( "556" ) );//SAW Перейдём на 3693: Code GiveNamedItem( "ammo_556" );//SAW ammo GiveNamedItem( "weapon_saw" );//SAW gun multiplay_gamerules.cpp(150): Code // 556 Round - SAW and Rifle gSkillData.plrDmg556 = 23; gamerules(244): Code // 556 Round - SAW gSkillData.plrDmg556 = GetSkillCvar( "sk_plr_556_bullet"); game(769): Code // 556 Round - SAW CVAR_REGISTER ( &sk_plr_556_bullet1 );// {"sk_plr_357_bullet1","0"}; CVAR_REGISTER ( &sk_plr_556_bullet2 );// {"sk_plr_357_bullet2","0"}; CVAR_REGISTER ( &sk_plr_556_bullet3 );// {"sk_plr_357_bullet3","0"}; Там же на 308: Code // 556 Round SAW cvar_t sk_plr_556_bullet1 = {"sk_plr_556_bullet1","0"}; cvar_t sk_plr_556_bullet2 = {"sk_plr_556_bullet2","0"}; cvar_t sk_plr_556_bullet3 = {"sk_plr_556_bullet3","0"}; func_break(65): у последнего оружия в том списке сначала поставьте запятую Code "weapon_saw", //26 "ammo_556" //27 combat.cpp(1568): Code case BULLET_PLAYER_556: //SAW pEntity->TraceAttack(pevAttacker, gSkillData.plrDmg556, vecDir, &tr, DMG_BULLET); //Saw break; client.cpp(1584): Code cd->vuser2.y = pl->ammo_556;//SAW cbase.h(344): Code int ammo_556;//5,56 mm for SAW stats.cpp(33): Code if ( !strcmp( pName, "556" ) ) return gSkillData.plrDmg556; ВСЁ с сервером, теперь переходим на КЛИЕНТ и включаем w_saw.cpp в проект. Открываем теперь ev_hldm.cpp(75): Code void EV_FireSAW( struct event_args_s *args );//SAW На 300: Code case BULLET_PLAYER_556: //SAW На 441: Code case BULLET_PLAYER_556: EV_HLDM_PlayTextureSound( idx, &tr, vecSrc, vecEnd, iBulletType ); EV_HLDM_DecalGunshot( &tr, iBulletType ); break; На 960 примерно: Code //====================== // SAW START // ( 5.56 ) //====================== void EV_FireSAW( event_args_t *args ) { int idx; vec3_t origin; vec3_t angles; vec3_t velocity;
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 ) ) { // Python uses different body in multiplayer versus single player int multiplayer = gEngfuncs.GetMaxClients() == 1 ? 0 : 1;
// Add muzzle flash to current weapon model EV_MuzzleFlash(); gEngfuncs.pEventAPI->EV_WeaponAnimation( SAW_SHOOT, multiplayer ? 1 : 0 );
V_PunchAxis( 0, -10.0 ); } switch( gEngfuncs.pfnRandomLong( 0, 2 ) ) { case 0:
gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON,
"weapons/saw_fire1.wav", gEngfuncs.pfnRandomFloat(0.8, 0.9), ATTN_NORM,
0, PITCH_NORM ); break; case 1:
gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON,
"weapons/saw_fire2.wav", gEngfuncs.pfnRandomFloat(0.8, 0.9), ATTN_NORM,
0, PITCH_NORM ); break; case 2:
gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON,
"weapons/saw_fire3.wav", gEngfuncs.pfnRandomFloat(0.8, 0.9), ATTN_NORM,
0, PITCH_NORM ); break; } EV_GetGunPosition( args, vecSrc, origin ); VectorCopy( forward, vecAiming );
EV_HLDM_FireBullets( idx, forward, right, up, 1, vecSrc, vecAiming,
8192, BULLET_PLAYER_556, 0, 0, args->fparam1, args->fparam2 ); } //====================== // SAW END // ( 5.56 ) //====================== ev_hldm.h(18): Code BULLET_PLAYER_556, //SAW Чуть ниже между enum`ами добавим свой enum: Code enum saw_e { SAW_SLOWIDLE = 0, SAW_IDLE2, SAW_RELOAD1, SAW_RELOAD2, SAW_HOLSTER, SAW_DRAW, SAW_SHOOT, SAW_SHOOT2, SAW_SHOOT3 }; hl_events.cpp(30): Code void EV_FireSAW( struct event_args_s *args );//SAW А на 86 - среди подобных добавим: Code gEngfuncs.pfnHookEvent( "events/saw.sc", EV_FireSAW );//SAW hl_weapons.cpp(60): А на 635: Code HUD_PrepEntity( &g_SAW , &player ); 713: Code case WEAPON_SAW: //SAW pWeapon = &g_SAW; break; 885: Code player.ammo_556 = (int)from->client.vuser2[1]; Там же на 962: Code to->client.vuser2[1] = player.ammo_556; ХУУУУХХХХ вроде с кодом всё....
Компилим, коли ошибки будут - сначала всё проверьте, всё ли сделали,
что написано, и даже если да - прверьте чтобы, например везде case
WEAPON_... { .... } а вы наш case засунули внутрь первого, во второе
многоточие .... - короче - что бы всё правильно чисто по смыслу и
только потом - жаловаться мне Так стоп, ещё пару штрихов с ресурсами:
Нам нужен saw.sc в папке events, все модели и звуки, связанные с нашим
оружием, ну и спрайты следует все заменить на OpFor`овские. - вроде всё
|