Статистика ( по goldsrc пакам ), шт.
В этом туторе не будет объяснено КАК сделать новое оружие, ибо для каждого оружия нужен свой код. Здесь просто будет приведена информация о тех нюансах без которых ваше оружие не будет работать
Создание нового оружия
В этом туторе не будет объяснено КАК сделать новое оружие, ибо для каждого оружия нужен свой код. Здесь просто будет приведена информация о тех нюансах без которых ваше оружие не будет работать
Автор / ы урока : Дядя Миша & Mitoh Просмотров : 5812 ( +1 ) Скачиваний : 0 Прислал / (а) : Streit Дата создания : 07.04.2011 20:30:04 Источник : http://www.xash.ru Рейтинг : ( 5 ) Поделиться :
Имеются следующие переводы : |
русский |
Оружие мы сделаем на базе мп5, которое будет называться просто - ExampleGun
Итак для начала открываем серверную часть - hl.dsp
Примечание редактора: для этого откройте в Visual C++ файл hl.dsp (в папке Single-Player Source\dlls) .
Для начала давайте напишем наше оружие, код у нас будет очень простой :
#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 = 0; // слот в худе ( помните также, что елси здесь вы написали например 2 то в игре будет занят 3 слот, т.к в коде исчесление начинаеться от нуля)
p->iPosition = 1; // позиция в слоте ( то же самое что и в слоте - елси вам надо занять 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;
}
Сохраняете это как example.cpp и добавляете в проект. Примечание редактора: для этого в меню выберите File→New, выберите C++ Sourse File потом введите имя создаваемого файла и нажмите OK. В этот файл вставьте этот код.
Когда код вашего оружия готов, идите в файл под названием 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" );
Затем откройте фаил 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 0; }
int GetItemInfo(ItemInfo *p);
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.dsp )
Примечание редактора: для этого откройте в Visual C++ файл cl_dll.dsp (в папке Single-Player Source\cl_dll) .
В клиенте для начала откроем папку hl и в нее добавим наш example.cpp. Примечание редактора: для этого щёлкните в окне File View по папке hl правой кнопкой мыши и выбирете Add Files To Folder, в открывшемся окне укажите путь к нашему, ранее созданному 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 ); // ваше оружие
Идите в hl_weapons.cpp и там введите определение вашего оружия:
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 ); // ваше оружие
Теперь вы можете смело компилить. После компила идите в папку со своим модом, создайте папку events, если таковой нету и создайте там фаил example.sc ( Содержимое этого фаила можете скопировать из sc фаила мп5, который находиться в паке). Затем идете в папку sprites своего мода и создайте там weapon_example.txt ( содержимое также можете скопировать из мп5 и затем исправлять, так как там нужно указать спрайты которые будут в отражаться в худе, при подборе и и тд)
Вот пожалуй и все что вам надо для создания оружия. Если хотите создавать новое оружие с новыми эффектами то работайте с основным кодом оружия, который я написал самым первым.
Осталось добавить описания нашего оружия в FGD файл. В его конец halflife.fgd добавьте:
@PointClass base(Weapon, Targetx) studio("models/w_9mmar.mdl") = weapon_example : "ExampleGun" []
Примечание редактора: это оружие не может ни стрелять, ни перезаряжаться, ни бездействовать, оно даже не отображается в руках. Его можно только положить на карту, взять игроком и отображать при выборе оружия. Что бы дать игроку это оружие поместите на вашу карту энтити weapon_example .
Похожие 1. weapon_flamethrower - Играя в Халф-Лайф, вы не задумывались над тем, что в нем чего-то не хватает? Чего-то очень близкого, родного, горячего... 2. Исходный код снайперки - weapon_sniperrifle с оптическим прицелом 3. И снова наследование классов :) - Казалось бы тема наследования классов давно избита, ан нет всё ещё существуют вопросы, правда про чуть боле сложное наследование. 4. учёные не отставали - Как сделать так, чтобы учёные не отставали на каждом препятствии 5. Смена моделей персонажей - Смена моделей персонажей прямо в Хамере 6. Замедление игрока - Довольно забавно наблюдать, как игрок одинаково быстро бегает как с монтировкой в руках, так и с тяжелой базукой, хотя логичнее, что держа в руках сей девайс, он будет бегать медленнее 7. Переключение оружия a la HL2 - Мне не нравится, как переключается оружие в ХЛ. Может, кому-то и интересно тыкать по менюшкам худа, но мне больше нравится реализация переключения в Unreal RTN, Quake Mission Packs и HL2 8. Как сделать вортигонта из HL1 другом - Моя первая статья 9. Звук попадания как в HL2 - Работа на клиенте
Jendr 26.08.2011, 16:01:19 пишет :
#1 Пробовал и нифига только весь код ХЛ испортил сделай видео уроггг
3037 28.01.2021, 10:22:36 пишет :
#2 Отличный код. Делаю по нему уже второе оружие
#3 СРАБОТАЛО, СПАСИБО ВАМ ОГРОМНОЕ, ЩАСТЬЯ И ЗДОРОВЬЯ
Вы не можете комментировать, т.к. вы не зарегистрированы.