// Гауссовский разброс do { x = random->RandomFloat(-0.5,0.5) +
random->RandomFloat(-0.5,0.5); y = random->RandomFloat(-0.5,0.5) +
random->RandomFloat(-0.5,0.5); z = x*x+y*y; } while (z > 1);
aimDir = aimDir + x *
GetBulletSpread().x * vecRight + y * GetBulletSpread().y * vecUp;
if ( pHit != NULL ) { CalculateBulletDamageForce( &dmgInfo,
m_iPrimaryAmmoType, aimDir, tr.endpos ); pHit->DispatchTraceAttack( dmgInfo,
aimDir, &tr ); } // Проверяем на наличие
воды по пути луча ShouldDrawWaterImpacts( tr );
if ( m_flNextChargeTime >
gpGlobals->curtime || !pOwner ){ return; }
// Сверим
время накопления if ( ( gpGlobals->curtime -
m_flChargeStartTime ) > MAX_GAUSS_CHARGE_TIME ) { // Предупредим игрока
что он на максимальной стадии накопления if ( m_bChargeIndicated == false ) { WeaponSound( SPECIAL2 ); m_bChargeIndicated = true; }
if ( ( gpGlobals->curtime -
m_flChargeStartTime ) > DANGER_GAUSS_CHARGE_TIME ) { // Раним игрока за то,
что он передержал WeaponSound( SPECIAL2
);
//
Добавим DMG_CRUSH
потому что не хотим никакой физической
силы pOwner->TakeDamage(
CTakeDamageInfo( this, this, 25, DMG_SHOCK | DMG_CRUSH ) );
if ( pPlayer->m_afButtonReleased &
IN_ATTACK2 ) { if ( m_bCharging ){ ChargedFire(); } }
BaseClass::ItemPostFrame();} //-----------------------------------------------------------------------------// Purpose: Останавливаем
раскруточный звук//-----------------------------------------------------------------------------void CWeaponTauCannon::StopChargeSound( void ){ if ( m_sndCharge != NULL ) { (CSoundEnvelopeController::GetController()).SoundFadeOut(
m_sndCharge, 0.1f ); }} //-----------------------------------------------------------------------------// Purpose: Сворачивание
оружия в кобуру// Input :
*pSwitchingTo - // Output : Returns true on
success, false on failure.//-----------------------------------------------------------------------------bool CWeaponTauCannon::Holster( CBaseCombatWeapon
*pSwitchingTo ){ StopChargeSound(); //
останавливаем звук раскрутки m_bCharging = false; m_bChargeIndicated = false;
return BaseClass::Holster(
pSwitchingTo );}//-----------------------------------------------// Purpose: Время на
раскрутку//-----------------------------------------------float CWeaponTauCannon::GetFullChargeTime( void ){ if ( g_pGameRules->IsMultiplayer()
) { return 1.5; } else { return 4; } } //---------------------------------------------------------------------------------- // Purpose:
Добавляет брызги на воду при стрельбе
по оной //----------------------------------------------------------------------------------#define FSetBit(iBitVector, bits) ((iBitVector) |=
(bits)) // LOLMEN : Set some bits to bit vec#define FBitSet(iBitVector, bit) ((iBitVector) &
(bit)) // LOLMEN : Do that bit set in bit vec?#define TraceContents( vec ) (
enginetrace->GetPointContents( vec ) ) //
LOLMEN : Do some test?#define WaterContents( vec ) ( FBitSet(
TraceContents( vec ), CONTENTS_WATER|CONTENTS_SLIME ) ) //
Lolmen : For water bool CWeaponTauCannon::ShouldDrawWaterImpacts(
const trace_t &shot_trace ){ //FIXME:
This doesn't handle the case of trying to splash while being
underwater, but that's not goingto
look good // right now
anyway...
// We must start
outside the water if ( WaterContents(
shot_trace.startpos ) ) return false;
// We must end
inside of water if ( !WaterContents( shot_trace.endpos
) ) return false;
C серверной частью
закончили, теперь займёмся клиентской...
зайдем в moddir\src\cl_dll\hl2_hud\
и откроем там c_weapon__stubs_hl2.cpp
В нём вы увидите список оружия, так
сразу закомментируем строчку вот так:
//STUB_WEAPON_CLASS(
weapon_gauss, WeaponGaussGun, C_BaseHLCombatWeapon );STUB_WEAPON_CLASS( weapon_cubemap, WeaponCubemap,
C_BaseCombatWeapon );И куданить например после:
STUB_WEAPON_CLASS( weapon_357, Weapon357,
C_BaseHLCombatWeapon ); Вставим строчечку:STUB_WEAPON_CLASS( weapon_gauss, WeaponTauCannon,
C_BaseHLCombatWeapon );
Так, теперь есть файл который и на
клиенсткой и на серверной части,
hl2_gamerules.cpp
в нём найдём
CAmmoDef *GetAmmoDef() После этой строчки будет идти список
типов патронов доступных в игре... Впишем
туда после def.AddAmmoType("GaussEnergy",
DMG_SHOCK, TRACER_NONE, "sk_jeep_gauss_damage",
"sk_jeep_gauss_damage", "sk_max_gauss_round",
BULLET_IMPULSE(650, 8000), 0 ); вот это:
def.AddAmmoType("Uranium", DMG_SHOCK |
DMG_ENERGYBEAM, TRACER_NONE, "sk_plr_dmg_gauss",
"sk_npc_dmg_gauss", "sk_max_gauss_round",
BULLET_IMPULSE(650, 8000), 0 );
Это необходимо, чтобы багги не
конфликтовал с ручным гауссом.
также там-же найдём :
ConVar sk_max_gauss_round ( "sk_max_gauss_round",
"300", FCVAR_REPLICATED ); И перед, впишем:
ConVar sk_plr_dmg_gauss( "sk_plr_dmg_gauss",
"0" );ConVar sk_npc_dmg_gauss( "sk_plr_dmg_gauss",
"0" );ConVar sk_plr_max_dmg_gauss(
"sk_plr_max_dmg_gauss", "0" );
Эти переменные будем контролировать
из skill.cfg
который должен храниться в moddir/cfg
Дальше, нам хотелось бы заюзать
коробочки с патронами для гаусса...
Откроем moddir\src\dlls\hl2_dll\item_ammo.cpp
И разместим там где-нить после строчки
:LINK_ENTITY_TO_CLASS( item_rpg_round,
CItem_RPG_Round ); Такое:
#define AMMO_GAUSS_GIVE 20#define AMMO_GAUSS_MODEL "models/w_gaussammo.mdl"
// УКАЖИТЕ вашу модель для
коробочки тут class CItem_GaussAmmo : public CItem{public: DECLARE_CLASS( CItem_GaussAmmo, CItem
);
Агась :D А игрока
проэквипить забыли? Ну помните impulse
101? :D Так, тогда лезем в
player.cpp и
ищем там: case 101: и там уже
по вашему усмотрению... А
по-моему добавим там: GiveAmmo( 150, "Uranium" );GiveNamedItem( "weapon_gauss" );
Так теперь идём в действительную папку
с модом, залазим там в scripts,
и создаём текстовик weapon_gauss.txt
вот с такими внутренностями :
// Gauss Gun WeaponData{ // Weapon fdata
is loaded by both the Game and Client DLLs. "printname" "Tau
Cannon" // Сделайте имя в resources если надо
и юзайте #ResourcesName "viewmodel"
"models/weapons/v_gauss.mdl" "playermodel"
"models/weapons/w_gauss.mdl" "anim_prefix" "gauss" "bucket" "4" //
--- \|/-------------- "bucket_position"
"5" // Отрегулируйте
положение в слоте
"clip_size" "-1" "default_clip" "20"
"primary_ammo" "Uranium" "secondary_ammo" "None"
"weight" "2" "item_flags" "0"
//
Sounds for the weapon. There is a max of 16 sounds per category (i.e.
max 16 "single_shot"sounds) SoundData { "single_shot"
"Weapon_Gauss.Single" "special1"
"Weapon_Gauss.Special1" "special2"
"Weapon_Gauss.Special2" }
// Weapon Sprite data is loaded by the
Client DLL. TextureData { "weapon" { "file" "sprites/w_icons1" "x" "128" "y" "64" "width" "128" "height" "64" } "weapon_s" { "file" "sprites/w_icons1b" "x" "128" "y" "64" "width" "128" "height" "64" } "ammo" { "file" "sprites/a_icons1" "x" "55" "y" "130" "width" "73" "height" "20" } "crosshair" { "file" "sprites/crosshairs" "x" "0" "y" "48" "width" "24" "height" "24" } "autoaim" { "file" "sprites/crosshairs" "x" "0" "y" "48" "width" "24" "height" "24" } } }
Еще придётся где-то разжиться и положить
три electro звука, вот по
таким путям:
moddir\sound\weapons\gauss\electro1.wavmoddir\sound\weapons\gauss\electro2.wavmoddir\sound\weapons\gauss\electro3.wav
Если возникнут проблемы, обращаемся
на форум Категория: Туториалы по
программированию (HL2)
| Автор: Lolmen
(24.07.2007)