Создание нового оружия
В этом туторе не будет обьяснено КАК сделать новое оружие, ибо для каждого оружия нужен свой код.Здесь просто будет приведена информация о тех нюансах без которых ваше оружие не будет работать
Оружие мы сделаем на базе мп5, которое будет называться просто - ExampleGun
Итак для начала открываем серверную часть - hl.dsw
Доя начала давайте напишем наше оружие, код у нас будет очень простой :
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
LINK_ENTITY_TO_CLASS( weapon_example, CExampleGun );
void CExampleGun::Spawn( )
{
pev->classname = MAKE_STRING("weapon_example"); // здесь имя энтити которое надо будет затем вписать в фгд
Precache( );
SET_MODEL(ENT(pev), "models/w_9mmAR.mdl"); // Тут должна быть модель вашего оружия
m_iId = WEAPON_EXAMPLE;
m_iDefaultAmmo = 50;
FallInit();
}
void CExampleGun::Precache( void )
{
// Тут вы прекешите звуки и модели для вашего оружия
PRECACHE_MODEL("models/v_9mmAR.mdl");
PRECACHE_MODEL("models/w_9mmAR.mdl");
PRECACHE_MODEL("models/p_9mmAR.mdl");
PRECACHE_SOUND("items/9mmclip1.wav");
PRECACHE_SOUND("items/clipinsert1.wav");
PRECACHE_SOUND("items/cliprelease1.wav");
PRECACHE_SOUND ("weapons/hks1.wav");
PRECACHE_SOUND ("weapons/hks2.wav"); PRECACHE_SOUND ("weapons/hks3.wav");
// this is to hook your client-side event
m_usExampleFire = PRECACHE_EVENT( 1, "events/example.sc" );
}
int CExampleGun::GetItemInfo(ItemInfo *p)
{
p->pszName = STRING(pev->classname);
p->pszAmmo1 = "9mm";
p->iMaxAmmo1 = 200;
p->iMaxClip = -1;
p->iSlot = 3;
// слот в худе ( помните также, что елси здесь вы написали например 2 то в игре будет занят 3 слот, т.к в коде исчесление начинаеться от нуля) p->iPosition = 4;
// позиция в слоте ( то же самое что и в слоте - елси вам надо занять 4 позицию , то пишите 3 в коде) p->iFlags = 0;
p->iId = m_iId = WEAPON_EXAMPLE;
p->iWeight = MP5_WEIGHT; //
p->pszAmmo2 = NULL; //
p->iMaxAmmo2 = -1;
return 1;
}
int CExampleGun::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;
}
Когда код вашего оружия готов, идите в фаил под названием weapons.cpp и примерно в районе строчки 340 сделайте UTIL_PrecacheOtherWeapon , после мп5:
// glock
UTIL_PrecacheOtherWeapon( "weapon_9mmhandgun" );
UTIL_PrecacheOther( "ammo_9mmclip" );
// mp5
UTIL_PrecacheOtherWeapon( "weapon_9mmAR" );
UTIL_PrecacheOther( "ammo_9mmAR" );
UTIL_PrecacheOther( "ammo_ARgrenades" );
// Тут добавляете прекеш своего оружия
// example_weapon
UTIL_PrecacheOtherWeapon( "weapon_example" );
Сохраняете это как example.cpp и добавляете в проект
Затем откройте фаил weapons.h , и в районе строчки 89 и задефайнте имя своего оружия после снарка
#define WEAPON_TRIPMINE 13
#define WEAPON_SATCHEL 14
#define WEAPON_SNARK 15
#define WEAPON_EXAMPLE 16
Затем идите вниз этого же фаила и добавьте класс воего оружия под снарками, выглядеть он должен так :
class CExampleGun : public CBasePlayerWeapon
{
public:
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 4; }
int GetItemInfo(ItemInfo *p);
void PrimaryAttack( void );
void SecondaryAttack( void );
BOOL Deploy( void );
void WeaponIdle( void );
int AddToPlayer( CBasePlayer* );
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
return FALSE;
#endif
}
private:
unsigned short m_usExampleFire;
};
После этого если хотите, можете добавить ваше оружие в список тех, кто будет спавниться в разбиваемых обьектах (func_breakable)
Для этого откройте func_break.cpp и в районе строчки 62 добавьте свое оружие в список оружий, появляющихся при разбивании обьекта :
const char *CBreakable::pSpawnObjects[] =
{
NULL, ? ?// 0
"item_battery", ?// 1
"item_healthkit", // 2
"weapon_9mmhandgun",// 3
"ammo_9mmclip", ?// 4
"weapon_9mmAR", ?// 5
"ammo_9mmAR", ?// 6
"ammo_ARgrenades", // 7
"weapon_shotgun", // 8
"ammo_buckshot", // 9
"weapon_crossbow", // 10
"ammo_crossbow", // 11
"weapon_357", ?// 12
"ammo_357", ? // 13
"weapon_rpg", ?// 14
"ammo_rpgclip", ?// 15
"ammo_gaussclip", // 16
"weapon_handgrenade",// 17
"weapon_tripmine", // 18
"weapon_satchel", // 19
"weapon_snark", ?// 20
"weapon_hornetgun", // 21
"weapon_example", // 22 - ваше оружие
};
Так, с серверной частью мы покончили - теперь идем в клиент ( cl_dll.dsw )
В клиенте для начала откроем папку hl и в нее добавим наш example.cpp. Затем идем в фаил ev_hldm.cpp и добавляем в районе строчки 67 свое оружие :
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_ExampleFire( struct event_args_s *args );
// ваше оружие
Идите вниз и там введите определение вашего оружия:
CHandGrenade g_HandGren;
CSatchel g_Satchel;
CTripmine g_Tripmine;
CSqueak g_Snark;
CExampleGun g_ExampleGun // ваше оружие
Затем все в том же фаиле идите в район строчки 637 и добавьте там свое оружие :
HUD_PrepEntity( &g_HandGren , &player );
HUD_PrepEntity( &g_Satchel , &player );
HUD_PrepEntity( &g_Tripmine , &player );
HUD_PrepEntity( &g_Snark , &player );
HUD_PrepEntity( &g_ExampleGun , &player ); // ваше оружие
И наконец спуститесь в район строчки 761 и добавьте :
case WEAPON_TRIPMINE:
pWeapon = &g_Tripmine;
break;
case WEAPON_SNARK:
pWeapon = &g_Snark;
break;
case WEAPON_EXAMPLE: // ваше оружие
pWeapon = &g_ExampleGun;
break;
Теперь идите в фаил hl_events.cpp и там в районе строчки 40 добавьте : 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_ExampleFire( struct event_args_s *args ); // ваше оружие
Это как вы заметили то же самое что вы сделали в начале ev_hldm.cpp. Теперь спуститесь в район строчки 88 и добавьте :
gEngfuncs.pfnHookEvent( "events/egon_stop.sc", EV_EgonStop );
gEngfuncs.pfnHookEvent( "events/firehornet.sc", EV_HornetGunFire );
gEngfuncs.pfnHookEvent( "events/tripfire.sc", EV_TripmineFire );
gEngfuncs.pfnHookEvent( "events/snarkfire.sc", EV_SnarkFire );
gEngfuncs.pfnHookEvent( "events/example.sc", EV_ExampleFire ); // ваше оружие
Теперь вы можете смело компилить. После компила идите в папку со своим модом, создайте папку events, если таковой нету и создайте там фаил example.sc ( Содержимое этого фаила можете скопировать из sc фаила мп5, который находиться в паке). Затем идете в папку sprites своего мода и создайте там weapon_example.txt ( содержимое также можете скопировать из мп5 и затем исправлять, так как там нужно указать спрайты которые будут в отражаться в худе, при подборе и и тд)
Вот пожалуй и все что вам ндао для создания оружия. Если хотите создавать новое оружие с новыми эффектами то работайте с основным кодом оружия, который я написал самым первым.
Спасибо за внимание !
Прим. Если вы будете копировать код прямо из статьи - не забудьте стереть мои коментарии - ибо C++ русский шрифт не понимает
Mitoh