|  | Страницы (5):     [1]  2  3  4  5  » Показать все 75 сообщений этой темы на одной странице | 
HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Исходные коды оружия (https://hlfx.ru/forum/showthread.php?threadid=611)
 Исходные коды оружия
 Исходные коды оружия
Вот я решил выложить на форуме несколько своих творений - исходников оружия. Возможно, они не совсем оригинальны, но для модостроителей могут оказаться полезными.
И начну я со своего любимого оружия ближнего боя - ножа.
Вот значит, weapon_knife (Нож) с двумя режимами атаки: Slash и Stab.
Нож мой похож на нож в Counter-Strike. Кто хочет - юзайте как хотите и где хотите.
В Readme можете меня не упомянать(Если не хотите). 
Для начала надо добавить в проект файл knife.cpp
Потом открываем game.cpp и добавляем в него:
 
// Tripmine
cvar_t	sk_plr_tripmine1 = {"sk_plr_tripmine1","0"};
cvar_t	sk_plr_tripmine2 = {"sk_plr_tripmine2","0"};
cvar_t	sk_plr_tripmine3 = {"sk_plr_tripmine3","0"};// <= уже есть этот код 
// Knife slash
cvar_t	sk_plr_knife1 = {"sk_plr_knife1","0"}; 
cvar_t	sk_plr_knife2 = {"sk_plr_knife2","0"};
cvar_t	sk_plr_knife3 = {"sk_plr_knife3","0"};
// Knife stab
cvar_t	sk_plr_knife_stab1 = {"sk_plr_knife_stab1","0"};
cvar_t	sk_plr_knife_stab2 = {"sk_plr_knife_stab2","0"};
cvar_t	sk_plr_knife_stab3 = {"sk_plr_knife_stab3","0"}; //новый код
Затем спускаемся ниже и аналогично добавляем:
// Tripmine
CVAR_REGISTER ( &sk_plr_tripmine1 );// {"sk_plr_tripmine1","0"};
CVAR_REGISTER ( &sk_plr_tripmine2 );// {"sk_plr_tripmine2","0"};
CVAR_REGISTER ( &sk_plr_tripmine3 );// {"sk_plr_tripmine3","0"};//существующий код
// Knife slash
CVAR_REGISTER ( &sk_plr_knife1 );// {"sk_plr_knife1","0"};
CVAR_REGISTER ( &sk_plr_knife2 );// {"sk_plr_knife2","0"};
CVAR_REGISTER ( &sk_plr_knife3 );// {"sk_plr_knife3","0"};
// Knife stab
CVAR_REGISTER ( &sk_plr_knife_stab1 );// {"sk_plr_knife_stab1","0"};
CVAR_REGISTER ( &sk_plr_knife_stab2 );// {"sk_plr_knife_stab2","0"};
CVAR_REGISTER ( &sk_plr_knife_stab3 );// {"sk_plr_knife_stab3","0"};//новый код
После этого открываем gamerules.cpp и дописываем после
// Tripmine
gSkillData.plrDmgTripmine = GetSkillCvar( "sk_plr_tripmine");
вот это:
// Knife slash
gSkillData.plrDmgKnife = GetSkillCvar( "sk_plr_knife");
// Knife stab
gSkillData.plrDmgKnifeStab = GetSkillCvar( "sk_plr_knife_stab");
Потом надо открыть multiplay_gamerules.cpp и точно также после
// Tripmine
gSkillData.plrDmgTripmine = 150;
добавить:
// Knife  slash
gSkillData.plrDmgKnife = 15;
// Knife  stab
gSkillData.plrDmgKnifeStab = 35;//значения могут быть любыми, это убойная сила ножа в мультиплеере
Если вы хотите, чтобы нож можно было получить с помощью 
команды impulse 101, то откройте player.cpp и сделайте следующее:
	case 101:
		gEvilImpulse101 = TRUE;
		GiveNamedItem( "item_suit" );
		GiveNamedItem( "item_battery" );
		GiveNamedItem( "weapon_crowbar" );
		GiveNamedItem( "weapon_9mmhandgun" );
		GiveNamedItem( "ammo_9mmclip" );
		GiveNamedItem( "weapon_shotgun" );
		GiveNamedItem( "ammo_buckshot" );
		GiveNamedItem( "weapon_9mmAR" );
		GiveNamedItem( "ammo_9mmAR" );
		GiveNamedItem( "ammo_ARgrenades" );
		GiveNamedItem( "weapon_handgrenade" );
		GiveNamedItem( "weapon_tripmine" );
                GiveNamedItem( "weapon_knife" );//новая строчка
#ifndef OEM_BUILD
Затем в файле skill.h добавьте:
float plrDmgRPG;
float plrDmgGauss;
float plrDmgEgonNarrow;
float plrDmgEgonWide;
float plrDmgHornet;
float plrDmgHandGrenade;
float plrDmgSatchel;
float plrDmgTripmine;
float plrDmgKnife;  
float plrDmgKnifeStab;//для ножа
После в weapons.cpp в функцию void W_Precache(void) добавьте
// knife
UTIL_PrecacheOtherWeapon( "weapon_knife" );
Потом надо добавить новые значения в weapons.h:
#define WEAPON_HORNETGUN		11
#define WEAPON_HANDGRENADE		12
#define WEAPON_TRIPMINE			13
#define	WEAPON_SATCHEL			14
#define	WEAPON_SNARK			15
#define WEAPON_KNIFE			16//Новая строчка
Ниже:
#define HORNETGUN_WEIGHT	10
#define HANDGRENADE_WEIGHT	5
#define AKM_WEIGHT		20
#define SATCHEL_WEIGHT		-10
#define TRIPMINE_WEIGHT		-10
#define SNARK_WEIGHT		-10
#define KNIFE_WEIGHT		10//Новая строчка
И, наконец в самом низу файла после
class CTripmine : public CBasePlayerWeapon
{
public:
	void Spawn( void );
	void Precache( void );
	int iItemSlot( void ) { return 5; }
	int GetItemInfo(ItemInfo *p);
	void SetObjectCollisionBox( void )
	{
		//!!!BUGBUG - fix the model!
		pev->absmin = pev->origin + Vector(-16, -16, -5);
		pev->absmax = pev->origin + Vector(16, 16, 28); 
	}
	void PrimaryAttack( void );
	BOOL Deploy( void );
	void Holster( int skiplocal = 0 );
	void WeaponIdle( void );
	virtual BOOL UseDecrement( void )
	{ 
#if defined( CLIENT_WEAPONS )
		return TRUE;
#else
		return FALSE;
#endif
	}
private:
	unsigned short m_usTripFire;
};
Нужно вставить вот это:
class CKnife : public CBasePlayerWeapon
{
public:
	void Spawn( void );
	void Precache( void );
	int iItemSlot( void ) { return 1; }
	void EXPORT SlashAgain( void );
        void EXPORT StabAgain( void );
	int GetItemInfo(ItemInfo *p);
	void EXPORT Smack( void );
	void WeaponIdle( void );
	void PrimaryAttack( void );
      void SecondaryAttack( void );
	int Stab( int fFirst );
	int Slash( int fFirst );
	BOOL Deploy( void );
      void Holster( int skiplocal = 0 );
	int m_iSlash;
	int m_iStab;
	TraceResult m_trHit;
	virtual BOOL UseDecrement( void )
	{ 
#if defined( CLIENT_WEAPONS )
		return TRUE;
#else
		return FALSE;
#endif
	}
private:
	unsigned short m_usKnife;
};
С сервером мы закончили, переходим на клиент.
В папке cl_dll находим файл EV_HLDM.cpp и добавляем:
void EV_EgonStop( struct event_args_s *args  );
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_Knife( struct event_args_s *args  );//Новая строчка
После спускаемся вниз и после
//======================
//	   SQUEAK START
//======================
enum squeak_e {
	SQUEAK_IDLE1 = 0,
	SQUEAK_FIDGETFIT,
	SQUEAK_FIDGETNIP,
	SQUEAK_DOWN,
	SQUEAK_UP,
	SQUEAK_THROW
};
#define VEC_HULL_MIN		Vector(-16, -16, -36)
#define VEC_DUCK_HULL_MIN	Vector(-16, -16, -18 )
void EV_SnarkFire( event_args_t *args )
{
	int idx;
	vec3_t vecSrc, angles, view_ofs, forward;
	pmtrace_t tr;
	idx = args->entindex;
	VectorCopy( args->origin, vecSrc );
	VectorCopy( args->angles, angles );
	AngleVectors ( angles, forward, NULL, NULL );
		
	if ( !EV_IsLocal ( idx ) )
		return;
	
	if ( args->ducking )
		vecSrc = vecSrc - ( VEC_HULL_MIN - VEC_DUCK_HULL_MIN );
	
	// Store off the old count
	gEngfuncs.pEventAPI->EV_PushPMStates();
	// Now add in all of the players.
	gEngfuncs.pEventAPI->EV_SetSolidPlayers ( idx - 1 );	
	gEngfuncs.pEventAPI->EV_SetTraceHull( 2 );
	gEngfuncs.pEventAPI->EV_PlayerTrace( vecSrc + forward * 20, vecSrc + forward * 64, PM_NORMAL, -1, &tr );
	//Find space to drop the thing.
	if ( tr.allsolid == 0 && tr.startsolid == 0 && tr.fraction > 0.25 )
		 gEngfuncs.pEventAPI->EV_WeaponAnimation ( SQUEAK_THROW, 0 );
	
	gEngfuncs.pEventAPI->EV_PopPMStates();
}
//======================
//	   SQUEAK END
//======================
Добавляем новый event:
//======================
//	   KNIFE START
//======================
enum knife_e {
	KNIFE_IDLE = 0,
	KNIFE_DRAW,
        KNIFE_HOLSTER,
	KNIFE_SLASH,
	KNIFE_STAB,
	KNIFE_STABMISS
};
void EV_Knife( event_args_t *args )
{
	int idx;
	vec3_t origin;
	idx = args->entindex;
	VectorCopy( args->origin, origin );
	
	//Play Swing sound
	gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/knife_miss1.wav", 1, ATTN_NORM, 0, PITCH_NORM); 
}
//======================
//	  KNIFE END 
//======================
Потом идём в файл view.cpp
{ "models/p_shotgun.mdl",		"models/v_shotgun.mdl"		},
{ "models/p_squeak.mdl",		"models/v_squeak.mdl"		},
{ "models/p_tripmine.mdl",		"models/v_tripmine.mdl"		},
{ "models/p_satchel_radio.mdl",	"models/v_satchel_radio.mdl"  },
{ "models/p_satchel.mdl",		"models/v_satchel.mdl"		},
{ "models/p_knife.mdl",		      "models/v_knife.mdl"		},//Новая строчка
После открываем hl_events.cpp
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_Knife( struct event_args_s *args );//Новая строчка
Затем спускаемся ниже:
gEngfuncs.pfnHookEvent( "events/firehornet.sc",				EV_HornetGunFire );
gEngfuncs.pfnHookEvent( "events/tripfire.sc",				EV_TripmineFire );
gEngfuncs.pfnHookEvent( "events/snarkfire.sc",				EV_SnarkFire );
gEngfuncs.pfnHookEvent( "events/knife.sc",				EV_Knife );//Новая строчка
И последний файл клиента hl_weapons.cpp
CHgun g_HGun;
CHandGrenade g_HandGren;
CSatchel g_Satchel;
CTripmine g_Tripmine;
CSqueak g_Snark;
CKnife g_Knife;//Новая строчка
Затем ниже в функции void HUD_InitClientWeapons( void )
HUD_PrepEntity( &g_HGun	, &player );
HUD_PrepEntity( &g_HandGren	, &player );
HUD_PrepEntity( &g_Satchel	, &player );
HUD_PrepEntity( &g_Tripmine	, &player );
HUD_PrepEntity( &g_Snark	, &player );
HUD_PrepEntity( &g_Knife	, &player );//Новая строчка
Ещё ниже после 
case WEAPON_SNARK:
pWeapon = &g_Snark;
break;   
Пишем:
		
case WEAPON_KNIFE:
pWeapon = &g_Knife;
break;
На этом всё и не забудте создать файл knife.sc в папке events вашего мода.
Модели, звуки для ножа и сам knife.cpp в архиве. 
 
спасибо за код ножа
просьба напиши еще какие-нибудь,
коды оружия
желательно не стандартного
типа лучевого излучателя
Fire64 я пробовал писать лучемёт, но он у меня не получился, надо будет спросить у XaeroX'a
Скоро я выложу ещё снайперку, кластерную гранату и дымовую гранату(но это лишь баловство для мультиплеера, т.к. в сингле боты видят сквозь дым)
P.S. Если нож не будет компилиться поменяй в нём параметр BULLET_PLAYER_KNIFE на BULLET_PLAYER_CROWBAR. А то я забыл поменять...
Ku2zoff наловчи ботов не видеть сквозъ дым 
Ku2zoff ну что сложного с дымом то... Определяешь радиус, в котором дым есть, центр - это граната. В ф-и "смотрения вперед" бота делаешь проверку на пересечение луча (взгляда бота) и сферы (дыма) и в завис. от расстояния до центра сферы и плотности дыма определяешь, видит он или нет.
__________________
Ладно, попробую я же не профи, а любитель
XaeroX , Дядя Миша  на какую оценку потянет мой нож по пятибальной системе?
 Ничего особо оригинального в коде не заметил.
 Ничего особо оригинального в коде не заметил.__________________
не получается создать нож
view.cpp
   Creating library .\Release/client.lib and object .\Release/client.exp
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual void
 __thiscall CKnife::WeaponIdle(void)" (?WeaponIdle@CKnife@@UAEXXZ)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual void
 __thiscall CKnife::SecondaryAttack(void)" (?SecondaryAttack@CKnife@@UAEXXZ)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual void
 __thiscall CKnife::PrimaryAttack(void)" (?PrimaryAttack@CKnife@@UAEXXZ)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual void
 __thiscall CKnife::Holster(int)" (?Holster@CKnife@@UAEXH@Z)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual int
__thiscall CKnife::Deploy(void)" (?Deploy@CKnife@@UAEHXZ)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual int
__thiscall CKnife::GetItemInfo(struct ItemInfo *)" (?GetItemInfo@CKnife@@UAEHPAU
ItemInfo@@@Z)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual void
 __thiscall CKnife::Precache(void)" (?Precache@CKnife@@UAEXXZ)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual void
 __thiscall CKnife::Spawn(void)" (?Spawn@CKnife@@UAEXXZ)
.\Release\client.dll : fatal error LNK1120: 8 unresolved externals
"Dll compiling failed!"
А ты в Клиентскую Длл добавь файл ножа.
__________________
Сайт латвийского мода
Игроки в халф лайф делятся на две больше группы - те, кто не доехал на поезде и те, кто прошел несколько раз.
вроде откомпилировал без ошибок
сейчас буду тестить
Добавлено сегодня в 17:17:
все работает 
Чтож, в ноже действительно нет ничего оригинального. Может снайперка окажется лучше.
Как я и обещал, я выложил снайперку (weapon_sniperrifle) с оптическим прицелом.
Вот она:
Добавим в проект файл rifle.cpp
Потом открываем game.cpp и аналогично, как было с ножом, добавляем в него:
 
// Rifle
cvar_t	sk_plr_snpr_bullet1 = {"sk_plr_snpr_bullet1","0"};
cvar_t	sk_plr_snpr_bullet2 = {"sk_plr_snpr_bullet2","0"};
cvar_t	sk_plr_snpr_bullet3 = {"sk_plr_snpr_bullet3","0"};
Затем спускаемся ниже и добавляем:
// Rifle
CVAR_REGISTER ( &sk_plr_snpr_bullet1 );// {"sk_plr_bullet1","0"};
CVAR_REGISTER ( &sk_plr_snpr_bullet2 );// {"sk_plr_bullet2","0"};
CVAR_REGISTER ( &sk_plr_snpr_bullet3 );// {"sk_plr_bullet3","0"};
После этого открываем gamerules.cpp и дописываем: 
// Rifle
gSkillData.plrDmgSniper = GetSkillCvar( "sk_plr_snpr_bullet");
Потом в multiplay_gamerules.cpp добавляем:
// Rifle
gSkillData.plrDmgSniper = 100;//значения могут быть любыми, это убойная сила винтовки в мультиплеере
Если вы хотите, чтобы винтовку можно было получить с помощью 
команды impulse 101, то откройте player.cpp и сделайте следующее:
	case 101:
		gEvilImpulse101 = TRUE;
		GiveNamedItem( "item_suit" );
		GiveNamedItem( "item_battery" );
		GiveNamedItem( "weapon_crowbar" );
		GiveNamedItem( "weapon_9mmhandgun" );
		GiveNamedItem( "ammo_9mmclip" );
		GiveNamedItem( "weapon_shotgun" );
		GiveNamedItem( "ammo_buckshot" );
		GiveNamedItem( "weapon_9mmAR" );
		GiveNamedItem( "ammo_9mmAR" );
		GiveNamedItem( "ammo_ARgrenades" );
		GiveNamedItem( "weapon_handgrenade" );
		GiveNamedItem( "weapon_tripmine" );
                GiveNamedItem( "weapon_knife" );
                GiveNamedItem( "weapon_sniperrifle" );//новая строчка
#ifndef OEM_BUILD
Затем в файле skill.h добавьте:
float plrDmgSniper;
После в weapons.cpp в функцию void W_Precache(void) добавьте
// Rifle
UTIL_PrecacheOtherWeapon( "weapon_sniperrifle" );
UTIL_PrecacheOther( "ammo_338" );
Потом надо добавить новые значения в weapons.h:
#define	WEAPON_SNARK			15
#define WEAPON_KNIFE			16
#define WEAPON_SNIPERRIFLE		17//Новая строчка
Ниже:
#define SNARK_WEIGHT		-10
#define KNIFE_WEIGHT		10
#define SNIPERRIFLE_WEIGHT	10//Новая строчка
Затем ещё ниже:
#define TRIPMINE_MAX_CARRY		8
#define SNARK_MAX_CARRY			15
#define HORNET_MAX_CARRY		10
#define M203_GRENADE_MAX_CARRY	10
#define _338_MAX_CARRY			30//Максимум патронов для винтовки
И затем ещё ниже:
#define SATCHEL_MAX_CLIP		WEAPON_NOCLIP
#define TRIPMINE_MAX_CLIP		WEAPON_NOCLIP
#define SNARK_MAX_CLIP			WEAPON_NOCLIP
#define SNIPERRIFLE_MAX_CLIP		10//Количество патронов в магазине у винтовки
Потом ещё ниже:
#define TRIPMINE_DEFAULT_GIVE		1
#define SNARK_DEFAULT_GIVE		5
#define HIVEHAND_DEFAULT_GIVE		10
#define SNIPERRIFLE_DEFAULT_GIVE	10//Патроны в магазине только что поднятой винтовки
Далее, разумеется, ещё ниже:
#define AMMO_RPGCLIP_GIVE		RPG_MAX_CLIP
#define AMMO_URANIUMBOX_GIVE	        20
#define AMMO_SNARKBOX_GIVE		5
#define AMMO_SNIPERRIFLECLIP_GIVE	SNIPERRIFLE_MAX_CLIP//Сколько патронов в только что поднятой обойме 
И, наконец в самом низу файла нужно вставить вот это:
class CSniperrifle : 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 );
	void SecondaryAttack( void );
	BOOL Deploy( void );
	void Holster( int skiplocal = 0 );
	void Reload( void );
	void WeaponIdle( void );
	void Shoot( float flSpread, float flCycleTime, BOOL fUseAutoAim );
	float m_flSoundDelay;
	BOOL m_fInZoom;// don't save this. 
	virtual BOOL UseDecrement( void )
	{ 
#if defined( CLIENT_WEAPONS )
		return TRUE;
#else
		return FALSE;
#endif
	}
private:
	unsigned short m_usFireSniper;
};
Так как винтовка это огнестрельное оружие, надо 
провести ещё несколько операций, для полной её работоспособности:
Открывем файл cbase.h и добавляем:
int ammo_9mm;
int ammo_357;
int ammo_bolts;
int ammo_buckshot;
int ammo_rockets;
int ammo_uranium;
int ammo_hornets;
int ammo_argrens;
int ammo_338;//Если мы создали для винтовки новые патроны, то придётся повозиться, иначе будут косяки с перезарядкой
После идём в client.cpp и в функции void UpdateClientData делаем так:
cd->ammo_rockets	= pl->ammo_rockets;
cd->ammo_cells		= pl->ammo_uranium;
cd->vuser2.x		= pl->ammo_hornets;
cd->vuser2.y		= pl->ammo_338;//Если это не сделать то время от времени у винтовки не будет рисоваться анимация перезарядки
!!!Внимание!!! параметр cd->vuser2.y обязательно должен отличаться от уже имеющихся cd->ammo_rockets, cd->vuser2.x и других подобных им
После этого идём в combat.cpp и добавляем в функцию Vector CBaseEntity::FireBulletsPlayer вот это:
case BULLET_PLAYER_BUCKSHOT:	
         // make distance based!
       pEntity->TraceAttack(pevAttacker, gSkillData.plrDmgBuckshot, vecDir, &tr, DMG_BULLET); 
break;
			
case BULLET_PLAYER_357:		
	pEntity->TraceAttack(pevAttacker, gSkillData.plrDmg357, vecDir, &tr, DMG_BULLET); 
break;
case BULLET_PLAYER_338:		
	pEntity->TraceAttack(pevAttacker, gSkillData.plrDmgSniper, vecDir, &tr, DMG_BULLET); //Вот она, убойная сила винтовки  
break;
После этого открываем player.cpp и дописываем в функцию void CBasePlayer::TabulateAmmo() это:
ammo_rockets = AmmoInventory( GetAmmoIndex( "rockets" ) );
ammo_uranium = AmmoInventory( GetAmmoIndex( "uranium" ) );
ammo_hornets = AmmoInventory( GetAmmoIndex( "Hornets" ) );
ammo_338 = AmmoInventory( GetAmmoIndex( "338" ) );//Патроны снайперки
После спускаемся к коду impulse 101 и дописываем:
  #ifndef OEM_BUILD
		GiveNamedItem( "weapon_357" );
		GiveNamedItem( "ammo_357" );
		GiveNamedItem( "weapon_crossbow" );
		GiveNamedItem( "ammo_crossbow" );
		GiveNamedItem( "weapon_egon" );
		GiveNamedItem( "weapon_gauss" );
		GiveNamedItem( "ammo_gaussclip" );
		GiveNamedItem( "weapon_rpg" );
		GiveNamedItem( "ammo_rpgclip" );
		GiveNamedItem( "weapon_satchel" );
		GiveNamedItem( "weapon_snark" );
		GiveNamedItem( "weapon_hornetgun" );
                GiveNamedItem( "ammo_338" );//Получаем патроны для винтовки при повторном вводе impulse 101
  #endif
После этого нам надо вернуться в weapons.h и добавить:
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_338,//Для винтовки
	BULLET_MONSTER_9MM,
	BULLET_MONSTER_MP5,
	BULLET_MONSTER_12MM,
} Bullet;
С сервером всё, переходим на клиентскую сторону.
В  ev_hldm.cpp добавляем:
void EV_EgonStop( struct event_args_s *args  );
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_Knife( struct event_args_s *args  );
void EV_FireSniper( struct event_args_s *args  );//Новая строчка
Потом спускаемся вниз и добавляем новый event:
//======================
//	  RIFLE START
//======================
enum sniperrifle_e {
	SNIPERRIFLE_DRAW = 0,
	SNIPERRIFLE_SLOWIDLE,
	SNIPERRIFLE_FIRE1,
	SNIPERRIFLE_FIRELASTROUND,
	SNIPERRIFLE_RELOAD,
	SNIPERRIFLE_RELOAD2,
	SNIPERRIFLE_SLOWIDLEEMPTY,
	SNIPERRIFLE_HOLSTER,
};
void EV_FireSniper( event_args_t *args )
{
	int idx;
	int empty;
	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 );
      empty = args->bparam1;
	AngleVectors( angles, forward, right, up );
	
	if ( EV_IsLocal( idx ) )
	{
		// Add muzzle flash to current weapon model
		EV_MuzzleFlash();
		gEngfuncs.pEventAPI->EV_WeaponAnimation( empty ? SNIPERRIFLE_FIRELASTROUND : SNIPERRIFLE_FIRE1, 2 );
		V_PunchAxis( 0, -20.0 );
	}
	gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/sniper_fire1.wav", gEngfuncs.pfnRandomFloat(0.8, 0.9), ATTN_NORM, 0, PITCH_NORM );
	
	EV_GetGunPosition( args, vecSrc, origin );
	
	VectorCopy( forward, vecAiming );
	EV_HLDM_FireBullets( idx, forward, right, up, 1, vecSrc, vecAiming, 8192, BULLET_PLAYER_M4A1, 0, 0, args->fparam1, args->fparam2 );
}
//======================
//	   RIFLE END 
//======================
Потом идём в файл view.cpp
{ "models/p_shotgun.mdl",		"models/v_shotgun.mdl"		},
{ "models/p_squeak.mdl",		"models/v_squeak.mdl"		},
{ "models/p_tripmine.mdl",		"models/v_tripmine.mdl"		},
{ "models/p_satchel_radio.mdl",	"models/v_satchel_radio.mdl"  },
{ "models/p_satchel.mdl",		"models/v_satchel.mdl"		},
{ "models/p_knife.mdl",		      "models/v_knife.mdl"		},
{ "models/p_sniper.mdl",		"models/v_sniper.mdl"		},//Новая строчка
После открываем hl_events.cpp
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_Knife( struct event_args_s *args );
void EV_FireSniper( struct event_args_s *args );//Новая строчка
Затем спускаемся ниже:
gEngfuncs.pfnHookEvent( "events/firehornet.sc",				EV_HornetGunFire );
gEngfuncs.pfnHookEvent( "events/tripfire.sc",				EV_TripmineFire );
gEngfuncs.pfnHookEvent( "events/snarkfire.sc",				EV_SnarkFire );
gEngfuncs.pfnHookEvent( "events/knife.sc",				EV_Knife );
gEngfuncs.pfnHookEvent( "events/sniper.sc",				EV_FireSniper );//Новая строчка
И последний файл клиента hl_weapons.cpp
CHgun g_HGun;
CHandGrenade g_HandGren;
CSatchel g_Satchel;
CTripmine g_Tripmine;
CSqueak g_Snark;
CKnife g_Knife;
CSniperrifle g_Sniperrifle;//Новая строчка
Затем ниже в функции void HUD_InitClientWeapons( void )
HUD_PrepEntity( &g_HGun	, &player );
HUD_PrepEntity( &g_HandGren	, &player );
HUD_PrepEntity( &g_Satchel	, &player );
HUD_PrepEntity( &g_Tripmine	, &player );
HUD_PrepEntity( &g_Snark	, &player );
HUD_PrepEntity( &g_Knife	, &player );
HUD_PrepEntity( &g_Sniperrifle	, &player );//Новая строчка
Ещё ниже к подобным параметрам пишем:
		
case WEAPON_SNIPERRIFLE:
pWeapon = &g_Sniperrifle;
break;
На этом кодинг винтовки закончен. Начинаем работу с оптическим прицелом.
Добавляем в клиент zoom.cpp
В файле hud.cpp в функцию void CHud :: Init( void ) добавляем:
m_StatusBar.Init();
m_DeathNotice.Init();
m_AmmoSecondary.Init();
m_TextMessage.Init();
m_StatusIcons.Init();
m_Zoom.Init();//новая строчка 
GetClientVoiceMgr()->Init(&g_VoiceStatusHelper, (vgui::Panel**)&gViewPort);
Потом, по такому же принципу в функцию void CHud :: VidInit( void ) добавляем: 
m_Menu.VidInit();
m_AmmoSecondary.VidInit();
m_TextMessage.VidInit();
m_StatusIcons.VidInit();
m_Zoom.VidInit();//Новая строчка
GetClientVoiceMgr()->VidInit();
После этого в hud.h создаём новый класс:
class CHudZoom: public CHudBase
{
public:
    int Init( void );
    int VidInit( void );
    int Draw(float flTime);
    int MsgFunc_ZoomHUD(const char *pszName,  int iSize, void *pbuf );
    int m_iHudMode;
private:
    HSPRITE m_hBottom_Left;
    HSPRITE m_hBottom_Right;
    HSPRITE m_hTop_Left;
    HSPRITE m_hTop_Right;
    HSPRITE m_hBlack;
};
Ниже в описании самого класса CHud добавляем:
CHudSayText		m_SayText;
CHudMenu		m_Menu;
CHudAmmoSecondary	m_AmmoSecondary;
CHudTextMessage m_TextMessage;
CHudStatusIcons m_StatusIcons;
CHudZoom                m_Zoom;//новая строчка
Затем открываем hud_redraw.cpp и в функции int CHud :: Redraw после
if (m_flShotTime && m_flShotTime < flTime)
{
	gEngfuncs.pfnClientCmd("snapshot\n");
	m_flShotTime = 0;
}
m_iIntermission = intermission;
добавляем:
if(m_Zoom.m_iHudMode > 0)
{
     m_Zoom.Draw( flTime );
     return 1;
}
С клиентом всё, идём на серверную сторону.
Открываем player.cpp и пишем:
extern void CopyToBodyQue(entvars_t* pev);
extern void respawn(entvars_t *pev, BOOL fCopyCorpse);
extern Vector VecBModelOrigin(entvars_t *pevBModel );
extern edict_t *EntSelectSpawnPoint( CBaseEntity *pPlayer );
extern int gmsgZoom;//Новая строчка
Затем чуть ниже:
int gmsgTextMsg = 0;
int gmsgSetFOV = 0;
int gmsgShowMenu = 0;
int gmsgGeigerRange = 0;
int gmsgTeamNames = 0;
int gmsgZoom = 0;//Новая строчка
Потом ещё ниже:
gmsgAmmoX = REG_USER_MSG("AmmoX", 2);
gmsgTeamNames = REG_USER_MSG( "TeamNames", -1 );
gmsgStatusText = REG_USER_MSG("StatusText", -1);
gmsgStatusValue = REG_USER_MSG("StatusValue", 3); 
gmsgZoom = REG_USER_MSG( "ZoomHud", 1);//Новая строчка
Теперь нам надо задать условие, при котором на экране будет отображаться оптический прицел.
Прокрутим вниз до функции void CBasePlayer :: UpdateClientData( void )
и добавим в неё:
if ( m_iFOV != 0 && m_iFOV != 20 && m_iFOV != 40 )
	{
                MESSAGE_BEGIN( MSG_ONE, gmsgZoom, NULL, pev );
	                WRITE_BYTE(1);
	        MESSAGE_END();
        }
Если вы хотите, чтобы оптический прицел рисовался не только у снайперки, но и
у арбалета и револьвера, то уберите условия m_iFOV != 20 и m_iFOV != 40
(20 это арбалет, а 40 это револьвер) И не забывайте стирать лишние &&
В этой же функции замените условие 
	if ( m_iFOV != m_iClientFOV )
	{
		MESSAGE_BEGIN( MSG_ONE, gmsgSetFOV, NULL, pev );
			WRITE_BYTE( m_iFOV );
		MESSAGE_END();
		// cache FOV change at end of function, so weapon updates can see that FOV has changed
	}
На вот это:
	if ( m_iFOV != m_iClientFOV )
	{
		MESSAGE_BEGIN( MSG_ONE, gmsgSetFOV, NULL, pev );
			WRITE_BYTE( m_iFOV );
		MESSAGE_END();
                MESSAGE_BEGIN( MSG_ONE, gmsgZoom, NULL, pev );
	                WRITE_BYTE(0);
	        MESSAGE_END();
		// cache FOV change at end of function, so weapon updates can see that FOV has changed
	}
Нам ведь нужно чтобы оптический прицел отключался. 
 
На этом всё, не забудте создать файл sniper.sc в папке events вашего мода.
Модели, звуки, спрайты и файлы rifle.cpp и zoom.cpp в архиве.
P.S. Спасибо, Дядя Миша, за тутор по оптическому прицелу
Добавлено сегодня в 09:40:
Вот ссылка на архив с моделями, звуками и спрайтами:
http://www.ifolder.ru/1763404
Ku2zoff мне-то за что? этот Xwider написал, еще в каком-то далеком лохматом году.
опять глюки с компилятором
ev_hldm.cpp(1651) : error C2065: 'BULLET_PLAYER_M4A1' : undeclared identifier
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual void
 __thiscall CSniperrifle::Holster(int)" (?Holster@CSniperrifle@@UAEXH@Z)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual int
__thiscall CSniperrifle::Deploy(void)" (?Deploy@CSniperrifle@@UAEHXZ)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual int
__thiscall CSniperrifle::GetItemInfo(struct ItemInfo *)" (?GetItemInfo@CSniperri
fle@@UAEHPAUItemInfo@@@Z)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual int
__thiscall CSniperrifle::AddToPlayer(class CBasePlayer *)" (?AddToPlayer@CSniper
rifle@@UAEHPAVCBasePlayer@@@Z)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual void
 __thiscall CSniperrifle::Precache(void)" (?Precache@CSniperrifle@@UAEXXZ)
hl_weapons.obj : error LNK2001: unresolved external symbol "public: virtual void
 __thiscall CSniperrifle::Spawn(void)" (?Spawn@CSniperrifle@@UAEXXZ)
.\Release\client.dll : fatal error LNK1120: 11 unresolved externals
"Dll compiling failed!"
rifle.cpp
rifle.cpp(278) : error C2143: syntax error : missing ')' before 'constant'
rifle.cpp(278) : error C2660: 'GiveAmmo' : function does not take 1 parameters
rifle.cpp(278) : error C2059: syntax error : ')'
rifle.cpp(279) : error C2143: syntax error : missing ';' before '{'
__________________
fire64 компилятор в порядке.
глюки с кодом.
Компилятор вообще является, по определению, самой надежной программой.
| Временная зона GMT. Текущее время 15:00. | Страницы (5):     [1]  2  3  4  5  » Показать все 75 сообщений этой темы на одной странице | 
  На основе vBulletin версии 2.3.0
  Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
  Дизайн и программирование: Crystice Softworks © 2005 - 2024