From a000cbf8ad13115f55c9278bc081962b163314c4 Mon Sep 17 00:00:00 2001 From: Night Owl Date: Tue, 27 Feb 2018 16:46:58 +0500 Subject: [PATCH] Merge recreated "Afraid of Monsters: Director's Cut" source code. --- Readme.txt | 41 + cl_dll/Android.mk | 27 +- cl_dll/CMakeLists.txt | 29 +- cl_dll/ammo.cpp | 39 +- cl_dll/aomdc/blackbar.cpp | 72 ++ cl_dll/aomdc/neffect.cpp | 86 ++ cl_dll/battery.cpp | 8 +- cl_dll/ev_common.cpp | 6 +- cl_dll/ev_hldm.cpp | 1982 +++++++++++++--------------------- cl_dll/ev_hldm.h | 68 -- cl_dll/flashlight.cpp | 64 +- cl_dll/health.cpp | 15 +- cl_dll/hl/hl_baseentity.cpp | 2 +- cl_dll/hl/hl_events.cpp | 66 +- cl_dll/hl/hl_objects.cpp | 16 - cl_dll/hl/hl_weapons.cpp | 135 +-- cl_dll/hud.cpp | 7 +- cl_dll/hud.h | 39 + cl_dll/hud_msg.cpp | 6 - cl_dll/input.cpp | 3 + cl_dll/view.cpp | 20 +- dlls/Android.mk | 27 +- dlls/CMakeLists.txt | 42 +- dlls/agrunt.cpp | 10 +- dlls/aomdc/axe.cpp | 282 +++++ dlls/aomdc/baddavid.cpp | 446 ++++++++ dlls/aomdc/beretta.cpp | 211 ++++ dlls/aomdc/deagle.cpp | 206 ++++ dlls/aomdc/ghost.cpp | 171 +++ dlls/aomdc/glock.cpp | 224 ++++ dlls/aomdc/gmgeneral.cpp | 212 ++++ dlls/aomdc/hammer.cpp | 239 ++++ dlls/aomdc/knife.cpp | 315 ++++++ dlls/aomdc/mp5k.cpp | 213 ++++ dlls/aomdc/p228.cpp | 207 ++++ dlls/aomdc/revolver.cpp | 208 ++++ dlls/aomdc/spear.cpp | 268 +++++ dlls/aomdc/uzi.cpp | 209 ++++ dlls/aomdc/wheelchair.cpp | 237 ++++ dlls/aomdc/zombie.h | 51 + dlls/aomdc/zombie2.cpp | 256 +++++ dlls/aomdc/zombie3.cpp | 256 +++++ dlls/aomdc/zombie4.cpp | 256 +++++ dlls/barnacle.cpp | 6 +- dlls/bmodels.cpp | 39 + dlls/bullsquid.cpp | 2 +- dlls/cbase.h | 11 +- dlls/cdll_dll.h | 7 +- dlls/client.cpp | 14 +- dlls/combat.cpp | 14 +- dlls/controller.cpp | 8 +- dlls/doors.cpp | 8 - dlls/effects.cpp | 124 ++- dlls/func_break.cpp | 39 +- dlls/game.cpp | 288 ++--- dlls/game.h | 2 +- dlls/gamerules.cpp | 78 +- dlls/gamerules.h | 2 +- dlls/ggrenade.cpp | 2 +- dlls/headcrab.cpp | 2 +- dlls/healthkit.cpp | 3 + dlls/hornet.cpp | 11 +- dlls/houndeye.cpp | 12 +- dlls/items.cpp | 43 +- dlls/monsters.cpp | 2 +- dlls/multiplay_gamerules.cpp | 44 +- dlls/player.cpp | 218 ++-- dlls/player.h | 6 +- dlls/rpg.cpp | 511 --------- dlls/scripted.cpp | 32 +- dlls/shotgun.cpp | 295 ++--- dlls/skill.h | 36 +- dlls/squeakgrenade.cpp | 177 --- dlls/stats.cpp | 4 +- dlls/triggers.cpp | 32 +- dlls/util.cpp | 26 + dlls/util.h | 2 + dlls/weapons.cpp | 203 ++-- dlls/weapons.h | 828 ++++++-------- dlls/zombie.cpp | 49 +- 80 files changed, 6891 insertions(+), 3566 deletions(-) create mode 100644 Readme.txt create mode 100644 cl_dll/aomdc/blackbar.cpp create mode 100644 cl_dll/aomdc/neffect.cpp create mode 100644 dlls/aomdc/axe.cpp create mode 100644 dlls/aomdc/baddavid.cpp create mode 100644 dlls/aomdc/beretta.cpp create mode 100644 dlls/aomdc/deagle.cpp create mode 100644 dlls/aomdc/ghost.cpp create mode 100644 dlls/aomdc/glock.cpp create mode 100644 dlls/aomdc/gmgeneral.cpp create mode 100644 dlls/aomdc/hammer.cpp create mode 100644 dlls/aomdc/knife.cpp create mode 100644 dlls/aomdc/mp5k.cpp create mode 100644 dlls/aomdc/p228.cpp create mode 100644 dlls/aomdc/revolver.cpp create mode 100644 dlls/aomdc/spear.cpp create mode 100644 dlls/aomdc/uzi.cpp create mode 100644 dlls/aomdc/wheelchair.cpp create mode 100644 dlls/aomdc/zombie.h create mode 100644 dlls/aomdc/zombie2.cpp create mode 100644 dlls/aomdc/zombie3.cpp create mode 100644 dlls/aomdc/zombie4.cpp diff --git a/Readme.txt b/Readme.txt new file mode 100644 index 00000000..b6d1bb44 --- /dev/null +++ b/Readme.txt @@ -0,0 +1,41 @@ +Afraid of Monsters Director's Cut recreation + +List of new entities: +ammo_beretta +ammo_deagle +ammo_glock +ammo_gmgeneral +ammo_mp5k +ammo_P228 +ammo_revolver +ammo_uzi +env_drawbars +env_drawstatic +env_gamebeaten1 +env_gamebeaten2 +env_gamebeaten3 +env_gamebeaten4 +env_hidehud +flashlight_manager(Not implemented. It's crap.) +func_lol +item_flashlight +lightning_effect_boss +monster_david +monster_ghost +monster_lakeboss(Not implemented. Excluded from AoMDC release.) +monster_wheelchair +monster_zombie2 +monster_zombie3 +monster_zombie4 +weapon_Spear +weapon_axe +weapon_beretta +weapon_deagle +weapon_glock +weapon_hammer +weapon_knife +weapon_mp5k +weapon_P228 +weapon_revolver +weapon_uzi +weapon_gmgeneral diff --git a/cl_dll/Android.mk b/cl_dll/Android.mk index 68917633..a23dbff8 100755 --- a/cl_dll/Android.mk +++ b/cl_dll/Android.mk @@ -24,25 +24,26 @@ LOCAL_CFLAGS += -DCLIENT_DLL=1 SRCS= SRCS_C= -SRCS+=../dlls/crossbow.cpp -SRCS+=../dlls/crowbar.cpp -SRCS+=../dlls/egon.cpp SRCS+=./ev_hldm.cpp -SRCS+=../dlls/gauss.cpp -SRCS+=../dlls/handgrenade.cpp SRCS+=./hl/hl_baseentity.cpp SRCS+=./hl/hl_events.cpp SRCS+=./hl/hl_objects.cpp SRCS+=./hl/hl_weapons.cpp -SRCS+=../dlls/hornetgun.cpp -SRCS+=../dlls/mp5.cpp -SRCS+=../dlls/python.cpp -SRCS+=../dlls/rpg.cpp -SRCS+=../dlls/satchel.cpp +SRCS+=../dlls/aomdc/knife.cpp +SRCS+=../dlls/aomdc/axe.cpp +SRCS+=../dlls/aomdc/hammer.cpp +SRCS+=../dlls/aomdc/spear.cpp +SRCS+=../dlls/aomdc/glock.cpp +SRCS+=../dlls/aomdc/beretta.cpp +SRCS+=../dlls/aomdc/p228.cpp +SRCS+=../dlls/aomdc/deagle.cpp +SRCS+=../dlls/aomdc/revolver.cpp +SRCS+=../dlls/aomdc/mp5k.cpp +SRCS+=../dlls/aomdc/uzi.cpp +SRCS+=../dlls/aomdc/gmgeneral.cpp SRCS+=../dlls/shotgun.cpp -SRCS+=../dlls/squeakgrenade.cpp -SRCS+=../dlls/tripmine.cpp -SRCS+=../dlls/glock.cpp +SRCS+=./aomdc/blackbar.cpp +SRCS+=./aomdc/neffect.cpp #SRCS+=../game_shared/voice_banmgr.cpp #SRCS+=../game_shared/voice_status.cpp SRCS+=./ammo.cpp diff --git a/cl_dll/CMakeLists.txt b/cl_dll/CMakeLists.txt index b945d70c..e442d499 100644 --- a/cl_dll/CMakeLists.txt +++ b/cl_dll/CMakeLists.txt @@ -43,20 +43,21 @@ endif() set (CLDLL_SOURCES - ../dlls/crossbow.cpp - ../dlls/crowbar.cpp - ../dlls/egon.cpp - ../dlls/gauss.cpp - ../dlls/handgrenade.cpp - ../dlls/hornetgun.cpp - ../dlls/mp5.cpp - ../dlls/python.cpp - ../dlls/rpg.cpp - ../dlls/satchel.cpp + aomdc/blackbar.cpp + aomdc/neffect.cpp + ../dlls/aomdc/axe.cpp + ../dlls/aomdc/beretta.cpp + ../dlls/aomdc/deagle.cpp + ../dlls/aomdc/glock.cpp + ../dlls/aomdc/gmgeneral.cpp + ../dlls/aomdc/hammer.cpp + ../dlls/aomdc/knife.cpp + ../dlls/aomdc/mp5k.cpp + ../dlls/aomdc/p228.cpp + ../dlls/aomdc/revolver.cpp + ../dlls/aomdc/spear.cpp + ../dlls/aomdc/uzi.cpp ../dlls/shotgun.cpp - ../dlls/squeakgrenade.cpp - ../dlls/tripmine.cpp - ../dlls/glock.cpp ev_hldm.cpp hl/hl_baseentity.cpp hl/hl_events.cpp @@ -110,7 +111,7 @@ set (CLDLL_SOURCES scoreboard.cpp MOTD.cpp) -include_directories (. hl/ ../dlls ../dlls/wpn_shared ../common ../engine ../pm_shared ../game_shared ../public ../utils/false_vgui/include) +include_directories (. hl/ ../dlls ../dlls/wpn_shared ../common ../engine ../pm_shared ../game_shared ../public ../utils/false_vgui/include ../dlls/aomdc) if(USE_VOICEMGR) #set(CLDLL_SOURCES diff --git a/cl_dll/ammo.cpp b/cl_dll/ammo.cpp index 10f8e524..aad2f7f3 100644 --- a/cl_dll/ammo.cpp +++ b/cl_dll/ammo.cpp @@ -315,12 +315,15 @@ int CHudAmmo::VidInit( void ) // Load sprites for buckets (top row of weapon menu) m_HUD_bucket0 = gHUD.GetSpriteIndex( "bucket1" ); m_HUD_selection = gHUD.GetSpriteIndex( "selection" ); + m_HUD_infinite_ammo = gHUD.GetSpriteIndex( "gm_inf" ); ghsprBuckets = gHUD.GetSprite( m_HUD_bucket0 ); giBucketWidth = gHUD.GetSpriteRect( m_HUD_bucket0 ).right - gHUD.GetSpriteRect( m_HUD_bucket0 ).left; giBucketHeight = gHUD.GetSpriteRect( m_HUD_bucket0 ).bottom - gHUD.GetSpriteRect( m_HUD_bucket0 ).top; + ghsprGMinf = gHUD.GetSprite( m_HUD_infinite_ammo ); gHR.iHistoryGap = max( gHR.iHistoryGap, gHUD.GetSpriteRect( m_HUD_bucket0 ).bottom - gHUD.GetSpriteRect( m_HUD_bucket0 ).top ); + gGMinfrc = &gHUD.GetSpriteRect( m_HUD_infinite_ammo ); // If we've already loaded weapons, let's get new sprites gWR.LoadAllWeaponSprites(); @@ -422,13 +425,7 @@ void WeaponsResource::SelectSlot( int iSlot, int fAdvance, int iDirection ) if( iSlot > MAX_WEAPON_SLOTS ) return; - if( gHUD.m_fPlayerDead || gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL ) ) - return; - - if ( !( gHUD.m_iWeaponBits & ( 1 << ( WEAPON_SUIT ) ) ) ) - return; - - if( ! ( gHUD.m_iWeaponBits & ~( 1 << ( WEAPON_SUIT ) ) ) ) + if( gHUD.m_fPlayerDead || gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL | HIDEHUD_ALL_EXCLUDEMESSAGE ) ) return; WEAPON *p = NULL; @@ -543,7 +540,7 @@ int CHudAmmo::MsgFunc_HideWeapon( const char *pszName, int iSize, void *pbuf ) SetCrosshair( pWeapon->hCrosshair, pWeapon->rcCrosshair, 255, 255, 255 ); // CONPRINT("Selecting custom crosshair"); } - else if ( (m_pWeapon == NULL) || (gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL )) ) + else if ( (m_pWeapon == NULL) || (gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL | HIDEHUD_ALL_EXCLUDEMESSAGE ) ) ) { wrect_t nullrc = {0,}; gpActiveSel = NULL; @@ -623,7 +620,7 @@ int CHudAmmo::MsgFunc_CurWeapon( const char *pszName, int iSize, void *pbuf ) WEAPON *ccWeapon = gWR.GetWeapon(7); SetCrosshair(ccWeapon->hCrosshair, ccWeapon->rcCrosshair, 255, 255, 255); } - else if ( !(gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL )) ) + else if ( !(gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL | HIDEHUD_ALL_EXCLUDEMESSAGE ) ) ) { if( gHUD.m_iFOV >= 90 ) { @@ -760,7 +757,7 @@ void CHudAmmo::UserCmd_Close( void ) // Selects the next item in the weapon menu void CHudAmmo::UserCmd_NextWeapon( void ) { - if( gHUD.m_fPlayerDead || ( gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL ) ) ) + if( gHUD.m_fPlayerDead || ( gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL | HIDEHUD_ALL_EXCLUDEMESSAGE ) ) ) return; if( !gpActiveSel || gpActiveSel == (WEAPON*)1 ) @@ -801,7 +798,7 @@ void CHudAmmo::UserCmd_NextWeapon( void ) // Selects the previous item in the menu void CHudAmmo::UserCmd_PrevWeapon( void ) { - if( gHUD.m_fPlayerDead || ( gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL ) ) ) + if( gHUD.m_fPlayerDead || ( gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL | HIDEHUD_ALL_EXCLUDEMESSAGE ) ) ) return; if( !gpActiveSel || gpActiveSel == (WEAPON*) 1 ) @@ -846,11 +843,9 @@ int CHudAmmo::Draw( float flTime ) { int a, x, y, r, g, b; int AmmoWidth; + bool IsGMGeneral; - if( !( gHUD.m_iWeaponBits & ( 1 << ( WEAPON_SUIT ) ) ) ) - return 1; - - if( ( gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL ) ) ) + if( ( gHUD.m_iHideHUDDisplay & ( HIDEHUD_WEAPONS | HIDEHUD_ALL | HIDEHUD_ALL_EXCLUDEMESSAGE ) ) ) return 1; // Draw Weapon Menu @@ -871,8 +866,9 @@ int CHudAmmo::Draw( float flTime ) WEAPON *pw = m_pWeapon; // shorthand + IsGMGeneral = strcmp( pw->szName,"weapon_gmgeneral" ) ? 0 : 1; // SPR_Draw Ammo - if( ( pw->iAmmoType < 0 ) && ( pw->iAmmo2Type < 0 ) ) + if( ( pw->iAmmoType < 0 ) && ( pw->iAmmo2Type < 0 ) && !IsGMGeneral ) return 0; int iFlags = DHN_DRAWZERO; // draw 0 values @@ -891,6 +887,17 @@ int CHudAmmo::Draw( float flTime ) // Does this weapon have a clip? y = ScreenHeight - gHUD.m_iFontHeight - gHUD.m_iFontHeight / 2; + if( IsGMGeneral ) + { + int gm_infHeight = gGMinfrc->bottom - gGMinfrc->top; + y = ScreenHeight - ( gm_infHeight + gm_infHeight / 3 ); + x = ScreenWidth - 3 * gm_infHeight; + + // Draw the ammo Icon + SPR_Set( ghsprGMinf, r, g, b ); + SPR_DrawAdditive( 0, x, y, gGMinfrc ); + } + else // Does weapon have any ammo at all? if( m_pWeapon->iAmmoType > 0 ) { diff --git a/cl_dll/aomdc/blackbar.cpp b/cl_dll/aomdc/blackbar.cpp new file mode 100644 index 00000000..1746eb38 --- /dev/null +++ b/cl_dll/aomdc/blackbar.cpp @@ -0,0 +1,72 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +// +// Blackbar.cpp +// +// implementation of CHudBlackBar class +// + +#include "hud.h" +#include "cl_util.h" +#include +#include +#include + +int CHudBlackBar::Init(void) +{ + m_iFlags |= HUD_ACTIVE; + + gHUD.AddHudElem(this); + + return 1; +}; + +int CHudBlackBar::VidInit(void) +{ + int HUD_blackbar = gHUD.GetSpriteIndex( "blackbar" ); + m_hSprite = gHUD.GetSprite( HUD_blackbar ); + m_prc = &gHUD.GetSpriteRect( HUD_blackbar ); + m_iHeight = m_prc->bottom - m_prc->top; + m_iWidth = m_prc->right - m_prc->left; + + return 1; +}; + +int CHudBlackBar::Draw (float flTime) +{ + if( !( gHUD.m_iHideHUDDisplay & HIDEHUD_BLACKBARS) ) + return 1; + + int r, g, b, x, y, sliceCount; + + sliceCount = ScreenWidth / m_iWidth; + + if( ScreenWidth > m_iWidth * sliceCount ) + sliceCount++; + + UnpackRGB( r,g,b, gHUD.m_iHUDColor ); + + SPR_Set( m_hSprite, r, g, b ); + + y = ScreenHeight - m_iHeight; + + for( int i = 0; i < sliceCount; i++ ) + { + x = i * m_iWidth; + SPR_Draw( 0, x, -1, m_prc ); + SPR_Draw( 0, x, y, m_prc ); + } + return 1; +} diff --git a/cl_dll/aomdc/neffect.cpp b/cl_dll/aomdc/neffect.cpp new file mode 100644 index 00000000..cfe7dc93 --- /dev/null +++ b/cl_dll/aomdc/neffect.cpp @@ -0,0 +1,86 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +// +// neffect.cpp +// +// implementation of CHudNoiseEffect class +// + +#include "hud.h" +#include "cl_util.h" +#include +#include +#include + +#define MAX_NOISE_EFFECT_FRAMES 13 + +int grgNEffectFrame[MAX_NOISE_EFFECT_FRAMES] = { 1, 2, 3, 4, 3, 2, 1, 2, 3, 4, 3, 2, 1 }; + +extern cvar_t *cl_noiseeffect; + +int CHudNoiseEffect::Init(void) +{ + m_iFlags |= HUD_ACTIVE; + + gHUD.AddHudElem(this); + + return 1; +}; + +int CHudNoiseEffect::VidInit(void) +{ + int HUD_neffect = gHUD.GetSpriteIndex( "neffect" ); + m_hSprite = gHUD.GetSprite( HUD_neffect ); + m_prc = &gHUD.GetSpriteRect( HUD_neffect ); + m_iWidth = m_prc->right - m_prc->left; + + return 1; +}; + +int CHudNoiseEffect::Draw (float flTime) +{ + int r, g, b, x, y, sliceCountX, sliceCountY, frame; + + if( !cl_noiseeffect->value ) + return 1; + + if( !( gHUD.m_iHideHUDDisplay & HIDEHUD_NOISEEFFECT ) ) + return 1; + + frame = grgNEffectFrame[(int)(flTime * 20) % MAX_NOISE_EFFECT_FRAMES] - 1; + sliceCountX = ScreenWidth / m_iWidth; + sliceCountY = ScreenHeight / m_iWidth; + + if( ScreenWidth > m_iWidth * sliceCountX ) + sliceCountX++; + + if( ScreenHeight > m_iWidth * sliceCountY ) + sliceCountY++; + + UnpackRGB( r,g,b, gHUD.m_iHUDColor ); + + SPR_Set( m_hSprite, r, g, b ); + + for( int j = 0; j < sliceCountY; j++ ) + { + y = j * m_iWidth; + for( int i = 0; i < sliceCountX; i++ ) + { + x = i * m_iWidth; + SPR_DrawAdditive( gEngfuncs.pfnRandomLong( 0, 1 ) ? 3 - frame : frame, x, y, m_prc ); + } + } + return 1; +} diff --git a/cl_dll/battery.cpp b/cl_dll/battery.cpp index f73b6d08..197bc413 100644 --- a/cl_dll/battery.cpp +++ b/cl_dll/battery.cpp @@ -71,7 +71,7 @@ int CHudBattery::MsgFunc_Battery( const char *pszName, int iSize, void *pbuf ) int CHudBattery::Draw( float flTime ) { - if( gHUD.m_iHideHUDDisplay & HIDEHUD_HEALTH ) + if( gHUD.m_iHideHUDDisplay & ( HIDEHUD_HEALTH | HIDEHUD_ALL_EXCLUDEMESSAGE ) ) return 1; int r, g, b, x, y, a; @@ -82,7 +82,7 @@ int CHudBattery::Draw( float flTime ) UnpackRGB(r,g,b, gHUD.m_iHUDColor); - if( !( gHUD.m_iWeaponBits & ( 1 << ( WEAPON_SUIT ) ) ) ) + if( !( gHUD.m_iWeaponBits & ( 1 << ( WEAPON_FLASHLIGHT ) ) ) ) return 1; // Has health changed? Flash the health # @@ -108,8 +108,8 @@ int CHudBattery::Draw( float flTime ) int iOffset = ( m_prc1->bottom - m_prc1->top ) / 6; - y = ScreenHeight - gHUD.m_iFontHeight - gHUD.m_iFontHeight / 2; - x = ScreenWidth / 5; + y = m_iHeight + m_iHeight / 2; + x = ScreenWidth - m_iHeight * 3; // make sure we have the right sprite handles if( !m_hSprite1 ) diff --git a/cl_dll/ev_common.cpp b/cl_dll/ev_common.cpp index ebba9cb2..55326e6b 100644 --- a/cl_dll/ev_common.cpp +++ b/cl_dll/ev_common.cpp @@ -175,12 +175,12 @@ void EV_GetDefaultShellInfo( event_args_t *args, float *origin, float *velocity, } } - fR = gEngfuncs.pfnRandomFloat( 50, 70 ); - fU = gEngfuncs.pfnRandomFloat( 100, 150 ); + fR = 60; + fU = 200; for( i = 0; i < 3; i++ ) { - ShellVelocity[i] = velocity[i] + right[i] * fR + up[i] * fU + forward[i] * 25; + ShellVelocity[i] = velocity[i] + right[i] * fR + up[i] * fU + forward[i] * 40; ShellOrigin[i] = origin[i] + view_ofs[i] + up[i] * upScale + forward[i] * forwardScale + right[i] * rightScale; } } diff --git a/cl_dll/ev_hldm.cpp b/cl_dll/ev_hldm.cpp index 628b5bfa..ad09e648 100644 --- a/cl_dll/ev_hldm.cpp +++ b/cl_dll/ev_hldm.cpp @@ -50,24 +50,20 @@ extern cvar_t *cl_lw; extern "C" { // HLDM +void EV_Knife( struct event_args_s *args ); +void EV_Axe( struct event_args_s *args ); +void EV_Hammer( struct event_args_s *args ); +void EV_Spear( struct event_args_s *args ); void EV_FireGlock1( struct event_args_s *args ); void EV_FireGlock2( struct event_args_s *args ); +void EV_FireBeretta( struct event_args_s *args ); +void EV_FireP228( struct event_args_s *args ); +void EV_FireDeagle( struct event_args_s *args ); +void EV_FireRevolver( struct event_args_s *args ); void EV_FireShotGunSingle( struct event_args_s *args ); -void EV_FireShotGunDouble( struct event_args_s *args ); -void EV_FireMP5( struct event_args_s *args ); -void EV_FireMP52( struct event_args_s *args ); -void EV_FirePython( struct event_args_s *args ); -void EV_FireGauss( struct event_args_s *args ); -void EV_SpinGauss( struct event_args_s *args ); -void EV_Crowbar( struct event_args_s *args ); -void EV_FireCrossbow( struct event_args_s *args ); -void EV_FireCrossbow2( struct event_args_s *args ); -void EV_FireRpg( struct event_args_s *args ); -void EV_EgonFire( struct event_args_s *args ); -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_FireMP5K( struct event_args_s *args ); +void EV_FireUzi( struct event_args_s *args ); +void EV_FireGMGeneral( struct event_args_s *args ); void EV_TrainPitchAdjust( struct event_args_s *args ); } @@ -422,7 +418,7 @@ void EV_HLDM_FireBullets( int idx, float *forward, float *right, float *up, int gEngfuncs.pEventAPI->EV_SetTraceHull( 2 ); gEngfuncs.pEventAPI->EV_PlayerTrace( vecSrc, vecEnd, PM_STUDIO_BOX, -1, &tr ); - tracer = EV_HLDM_CheckTracer( idx, vecSrc, tr.endpos, forward, right, iBulletType, iTracerFreq, tracerCount ); + // tracer = EV_HLDM_CheckTracer( idx, vecSrc, tr.endpos, forward, right, iBulletType, iTracerFreq, tracerCount ); // do damage, paint decals if( tr.fraction != 1.0 ) @@ -435,7 +431,7 @@ void EV_HLDM_FireBullets( int idx, float *forward, float *right, float *up, int EV_HLDM_DecalGunshot( &tr, iBulletType ); break; case BULLET_PLAYER_MP5: - if( !tracer ) + //if( !tracer ) { EV_HLDM_PlayTextureSound( idx, &tr, vecSrc, vecEnd, iBulletType ); EV_HLDM_DecalGunshot( &tr, iBulletType ); @@ -455,1240 +451,7 @@ void EV_HLDM_FireBullets( int idx, float *forward, float *right, float *up, int } } -//====================== -// GLOCK START -//====================== -void EV_FireGlock1( event_args_t *args ) -{ - int idx; - vec3_t origin; - vec3_t angles; - vec3_t velocity; - int empty; - - vec3_t ShellVelocity; - vec3_t ShellOrigin; - int shell; - vec3_t vecSrc, vecAiming; - vec3_t up, right, forward; - - idx = args->entindex; - VectorCopy( args->origin, origin ); - VectorCopy( args->angles, angles ); - VectorCopy( args->velocity, velocity ); - - empty = args->bparam1; - AngleVectors( angles, forward, right, up ); - - shell = gEngfuncs.pEventAPI->EV_FindModelIndex( "models/shell.mdl" );// brass shell - - if( EV_IsLocal( idx ) ) - { - EV_MuzzleFlash(); - gEngfuncs.pEventAPI->EV_WeaponAnimation( empty ? GLOCK_SHOOT_EMPTY : GLOCK_SHOOT, 2 ); - - V_PunchAxis( 0, -2.0 ); - } - - EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 20, -12, 4 ); - - EV_EjectBrass( ShellOrigin, ShellVelocity, angles[YAW], shell, TE_BOUNCE_SHELL ); - - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/pl_gun3.wav", gEngfuncs.pfnRandomFloat( 0.92, 1.0 ), ATTN_NORM, 0, 98 + gEngfuncs.pfnRandomLong( 0, 3 ) ); - - EV_GetGunPosition( args, vecSrc, origin ); - - VectorCopy( forward, vecAiming ); - - EV_HLDM_FireBullets( idx, forward, right, up, 1, vecSrc, vecAiming, 8192, BULLET_PLAYER_9MM, 0, 0, args->fparam1, args->fparam2 ); -} - -void EV_FireGlock2( event_args_t *args ) -{ - int idx; - vec3_t origin; - vec3_t angles; - vec3_t velocity; - - vec3_t ShellVelocity; - vec3_t ShellOrigin; - int shell; - vec3_t vecSrc, vecAiming; - vec3_t vecSpread; - vec3_t up, right, forward; - - idx = args->entindex; - VectorCopy( args->origin, origin ); - VectorCopy( args->angles, angles ); - VectorCopy( args->velocity, velocity ); - int empty = args->bparam1; - - AngleVectors( angles, forward, right, up ); - - shell = gEngfuncs.pEventAPI->EV_FindModelIndex( "models/shell.mdl" );// brass shell - - if( EV_IsLocal( idx ) ) - { - // Add muzzle flash to current weapon model - EV_MuzzleFlash(); - gEngfuncs.pEventAPI->EV_WeaponAnimation( empty ? GLOCK_SHOOT_EMPTY : GLOCK_SHOOT, 2 ); - - V_PunchAxis( 0, -2.0 ); - } - - EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 20, -12, 4 ); - - EV_EjectBrass ( ShellOrigin, ShellVelocity, angles[YAW], shell, TE_BOUNCE_SHELL ); - - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/pl_gun3.wav", gEngfuncs.pfnRandomFloat( 0.92, 1.0 ), ATTN_NORM, 0, 98 + gEngfuncs.pfnRandomLong( 0, 3 ) ); - - EV_GetGunPosition( args, vecSrc, origin ); - - VectorCopy( forward, vecAiming ); - - EV_HLDM_FireBullets( idx, forward, right, up, 1, vecSrc, vecAiming, 8192, BULLET_PLAYER_9MM, 0, &g_tracerCount[idx - 1], args->fparam1, args->fparam2 ); -} -//====================== -// GLOCK END -//====================== - -//====================== -// SHOTGUN START -//====================== -void EV_FireShotGunDouble( event_args_t *args ) -{ - int idx; - vec3_t origin; - vec3_t angles; - vec3_t velocity; - - int j; - vec3_t ShellVelocity; - vec3_t ShellOrigin; - int shell; - vec3_t vecSrc, vecAiming; - vec3_t vecSpread; - 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 ); - - shell = gEngfuncs.pEventAPI->EV_FindModelIndex("models/shotgunshell.mdl");// brass shell - - if( EV_IsLocal( idx ) ) - { - // Add muzzle flash to current weapon model - EV_MuzzleFlash(); - gEngfuncs.pEventAPI->EV_WeaponAnimation( SHOTGUN_FIRE2, 2 ); - V_PunchAxis( 0, -10.0 ); - } - - for( j = 0; j < 2; j++ ) - { - EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 32, -12, 6 ); - - EV_EjectBrass( ShellOrigin, ShellVelocity, angles[ YAW ], shell, TE_BOUNCE_SHOTSHELL ); - } - - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/dbarrel1.wav", gEngfuncs.pfnRandomFloat( 0.98, 1.0 ), ATTN_NORM, 0, 85 + gEngfuncs.pfnRandomLong( 0, 0x1f ) ); - - EV_GetGunPosition( args, vecSrc, origin ); - VectorCopy( forward, vecAiming ); - - if( gEngfuncs.GetMaxClients() > 1 ) - { - EV_HLDM_FireBullets( idx, forward, right, up, 8, vecSrc, vecAiming, 2048, BULLET_PLAYER_BUCKSHOT, 0, &g_tracerCount[idx - 1], 0.17365, 0.04362 ); - } - else - { - EV_HLDM_FireBullets( idx, forward, right, up, 12, vecSrc, vecAiming, 2048, BULLET_PLAYER_BUCKSHOT, 0, &g_tracerCount[idx - 1], 0.08716, 0.08716 ); - } -} - -void EV_FireShotGunSingle( event_args_t *args ) -{ - int idx; - vec3_t origin; - vec3_t angles; - vec3_t velocity; - - vec3_t ShellVelocity; - vec3_t ShellOrigin; - int shell; - vec3_t vecSrc, vecAiming; - vec3_t vecSpread; - 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 ); - - shell = gEngfuncs.pEventAPI->EV_FindModelIndex("models/shotgunshell.mdl");// brass shell - - if( EV_IsLocal( idx ) ) - { - // Add muzzle flash to current weapon model - EV_MuzzleFlash(); - gEngfuncs.pEventAPI->EV_WeaponAnimation( SHOTGUN_FIRE, 2 ); - - V_PunchAxis( 0, -5.0 ); - } - - EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 32, -12, 6 ); - - EV_EjectBrass ( ShellOrigin, ShellVelocity, angles[YAW], shell, TE_BOUNCE_SHOTSHELL ); - - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/sbarrel1.wav", gEngfuncs.pfnRandomFloat( 0.95, 1.0 ), ATTN_NORM, 0, 93 + gEngfuncs.pfnRandomLong( 0, 0x1f ) ); - - EV_GetGunPosition( args, vecSrc, origin ); - VectorCopy( forward, vecAiming ); - - if( gEngfuncs.GetMaxClients() > 1 ) - { - EV_HLDM_FireBullets( idx, forward, right, up, 4, vecSrc, vecAiming, 2048, BULLET_PLAYER_BUCKSHOT, 0, &g_tracerCount[idx - 1], 0.08716, 0.04362 ); - } - else - { - EV_HLDM_FireBullets( idx, forward, right, up, 6, vecSrc, vecAiming, 2048, BULLET_PLAYER_BUCKSHOT, 0, &g_tracerCount[idx - 1], 0.08716, 0.08716 ); - } -} -//====================== -// SHOTGUN END -//====================== - -//====================== -// MP5 START -//====================== -void EV_FireMP5( event_args_t *args ) -{ - int idx; - vec3_t origin; - vec3_t angles; - vec3_t velocity; - - vec3_t ShellVelocity; - vec3_t ShellOrigin; - int shell; - 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 ); - - shell = gEngfuncs.pEventAPI->EV_FindModelIndex("models/shell.mdl");// brass shell - - if( EV_IsLocal( idx ) ) - { - // Add muzzle flash to current weapon model - EV_MuzzleFlash(); - gEngfuncs.pEventAPI->EV_WeaponAnimation( MP5_FIRE1 + gEngfuncs.pfnRandomLong( 0, 2 ), 2 ); - - V_PunchAxis( 0, gEngfuncs.pfnRandomFloat( -2, 2 ) ); - } - - EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 20, -12, 4 ); - - EV_EjectBrass ( ShellOrigin, ShellVelocity, angles[YAW], shell, TE_BOUNCE_SHELL ); - - switch( gEngfuncs.pfnRandomLong( 0, 1 ) ) - { - case 0: - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/hks1.wav", 1, ATTN_NORM, 0, 94 + gEngfuncs.pfnRandomLong( 0, 0xf ) ); - break; - case 1: - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/hks2.wav", 1, ATTN_NORM, 0, 94 + gEngfuncs.pfnRandomLong( 0, 0xf ) ); - break; - } - - EV_GetGunPosition( args, vecSrc, origin ); - VectorCopy( forward, vecAiming ); - - if( gEngfuncs.GetMaxClients() > 1 ) - { - EV_HLDM_FireBullets( idx, forward, right, up, 1, vecSrc, vecAiming, 8192, BULLET_PLAYER_MP5, 2, &g_tracerCount[idx - 1], args->fparam1, args->fparam2 ); - } - else - { - EV_HLDM_FireBullets( idx, forward, right, up, 1, vecSrc, vecAiming, 8192, BULLET_PLAYER_MP5, 2, &g_tracerCount[idx - 1], args->fparam1, args->fparam2 ); - } -} - -// We only predict the animation and sound -// The grenade is still launched from the server. -void EV_FireMP52( event_args_t *args ) -{ - int idx; - vec3_t origin; - - idx = args->entindex; - VectorCopy( args->origin, origin ); - - if( EV_IsLocal( idx ) ) - { - gEngfuncs.pEventAPI->EV_WeaponAnimation( MP5_LAUNCH, 2 ); - V_PunchAxis( 0, -10 ); - } - - switch( gEngfuncs.pfnRandomLong( 0, 1 ) ) - { - case 0: - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/glauncher.wav", 1, ATTN_NORM, 0, 94 + gEngfuncs.pfnRandomLong( 0, 0xf ) ); - break; - case 1: - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/glauncher2.wav", 1, ATTN_NORM, 0, 94 + gEngfuncs.pfnRandomLong( 0, 0xf ) ); - break; - } -} -//====================== -// MP5 END -//====================== - -//====================== -// PHYTON START -// ( .357 ) -//====================== -void EV_FirePython( 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( PYTHON_FIRE1, multiplayer ? 1 : 0 ); - - V_PunchAxis( 0, -10.0 ); - } - - switch( gEngfuncs.pfnRandomLong( 0, 1 ) ) - { - case 0: - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/357_shot1.wav", gEngfuncs.pfnRandomFloat( 0.8, 0.9 ), ATTN_NORM, 0, PITCH_NORM ); - break; - case 1: - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/357_shot2.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_357, 0, 0, args->fparam1, args->fparam2 ); -} -//====================== -// PHYTON END -// ( .357 ) -//====================== - -//====================== -// GAUSS START -//====================== -#define SND_CHANGE_PITCH (1 << 7) // duplicated in protocol.h change sound pitch - -void EV_SpinGauss( event_args_t *args ) -{ - int idx; - vec3_t origin; - vec3_t angles; - vec3_t velocity; - int iSoundState = 0; - - int pitch; - - idx = args->entindex; - VectorCopy( args->origin, origin ); - VectorCopy( args->angles, angles ); - VectorCopy( args->velocity, velocity ); - - pitch = args->iparam1; - - iSoundState = args->bparam1 ? SND_CHANGE_PITCH : 0; - - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "ambience/pulsemachine.wav", 1.0, ATTN_NORM, iSoundState, pitch ); -} - -/* -============================== -EV_StopPreviousGauss - -============================== -*/ -void EV_StopPreviousGauss( int idx ) -{ - // Make sure we don't have a gauss spin event in the queue for this guy - gEngfuncs.pEventAPI->EV_KillEvents( idx, "events/gaussspin.sc" ); - gEngfuncs.pEventAPI->EV_StopSound( idx, CHAN_WEAPON, "ambience/pulsemachine.wav" ); -} - -extern float g_flApplyVel; - -void EV_FireGauss( event_args_t *args ) -{ - int idx; - vec3_t origin; - vec3_t angles; - vec3_t velocity; - float flDamage = args->fparam1; - //int primaryfire = args->bparam1; - - int m_fPrimaryFire = args->bparam1; - //int m_iWeaponVolume = GAUSS_PRIMARY_FIRE_VOLUME; - vec3_t vecSrc; - vec3_t vecDest; - //edict_t *pentIgnore; - pmtrace_t tr, beam_tr; - float flMaxFrac = 1.0; - //int nTotal = 0; - int fHasPunched = 0; - int fFirstBeam = 1; - int nMaxHits = 10; - physent_t *pEntity; - int m_iBeam, m_iGlow, m_iBalls; - vec3_t up, right, forward; - - idx = args->entindex; - VectorCopy( args->origin, origin ); - VectorCopy( args->angles, angles ); - VectorCopy( args->velocity, velocity ); - - if( args->bparam2 ) - { - EV_StopPreviousGauss( idx ); - return; - } - - //Con_Printf( "Firing gauss with %f\n", flDamage ); - EV_GetGunPosition( args, vecSrc, origin ); - - m_iBeam = gEngfuncs.pEventAPI->EV_FindModelIndex( "sprites/smoke.spr" ); - m_iBalls = m_iGlow = gEngfuncs.pEventAPI->EV_FindModelIndex( "sprites/hotglow.spr" ); - - AngleVectors( angles, forward, right, up ); - - VectorMA( vecSrc, 8192, forward, vecDest ); - - if( EV_IsLocal( idx ) ) - { - V_PunchAxis( 0, -2.0 ); - gEngfuncs.pEventAPI->EV_WeaponAnimation( GAUSS_FIRE2, 2 ); - - if( m_fPrimaryFire == false ) - g_flApplyVel = flDamage; - } - - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/gauss2.wav", 0.5 + flDamage * ( 1.0 / 400.0 ), ATTN_NORM, 0, 85 + gEngfuncs.pfnRandomLong( 0, 0x1f ) ); - - while( flDamage > 10 && nMaxHits > 0 ) - { - nMaxHits--; - - gEngfuncs.pEventAPI->EV_SetUpPlayerPrediction( false, true ); - - // 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, vecDest, PM_STUDIO_BOX, -1, &tr ); - - gEngfuncs.pEventAPI->EV_PopPMStates(); - - if( tr.allsolid ) - break; - - if( fFirstBeam ) - { - if( EV_IsLocal( idx ) ) - { - // Add muzzle flash to current weapon model - EV_MuzzleFlash(); - } - fFirstBeam = 0; - - gEngfuncs.pEfxAPI->R_BeamEntPoint( - idx | 0x1000, - tr.endpos, - m_iBeam, - 0.1, - m_fPrimaryFire ? 1.0 : 2.5, - 0.0, - m_fPrimaryFire ? 128.0 : flDamage, - 0, - 0, - 0, - m_fPrimaryFire ? 255 : 255, - m_fPrimaryFire ? 128 : 255, - m_fPrimaryFire ? 0 : 255 - ); - } - else - { - gEngfuncs.pEfxAPI->R_BeamPoints( vecSrc, - tr.endpos, - m_iBeam, - 0.1, - m_fPrimaryFire ? 1.0 : 2.5, - 0.0, - m_fPrimaryFire ? 128.0 : flDamage, - 0, - 0, - 0, - m_fPrimaryFire ? 255 : 255, - m_fPrimaryFire ? 128 : 255, - m_fPrimaryFire ? 0 : 255 - ); - } - - pEntity = gEngfuncs.pEventAPI->EV_GetPhysent( tr.ent ); - if( pEntity == NULL ) - break; - - if( pEntity->solid == SOLID_BSP ) - { - float n; - - //pentIgnore = NULL; - - n = -DotProduct( tr.plane.normal, forward ); - - if( n < 0.5 ) // 60 degrees - { - // ALERT( at_console, "reflect %f\n", n ); - // reflect - vec3_t r; - - VectorMA( forward, 2.0 * n, tr.plane.normal, r ); - - flMaxFrac = flMaxFrac - tr.fraction; - - VectorCopy( r, forward ); - - VectorMA( tr.endpos, 8.0, forward, vecSrc ); - VectorMA( vecSrc, 8192.0, forward, vecDest ); - - gEngfuncs.pEfxAPI->R_TempSprite( tr.endpos, vec3_origin, 0.2, m_iGlow, kRenderGlow, kRenderFxNoDissipation, flDamage * n / 255.0, flDamage * n * 0.5 * 0.1, FTENT_FADEOUT ); - - vec3_t fwd; - VectorAdd( tr.endpos, tr.plane.normal, fwd ); - - gEngfuncs.pEfxAPI->R_Sprite_Trail( TE_SPRITETRAIL, tr.endpos, fwd, m_iBalls, 3, 0.1, gEngfuncs.pfnRandomFloat( 10, 20 ) / 100.0, 100, - 255, 100 ); - - // lose energy - if( n == 0 ) - { - n = 0.1; - } - - flDamage = flDamage * ( 1 - n ); - } - else - { - // tunnel - EV_HLDM_DecalGunshot( &tr, BULLET_MONSTER_12MM ); - - gEngfuncs.pEfxAPI->R_TempSprite( tr.endpos, vec3_origin, 1.0, m_iGlow, kRenderGlow, kRenderFxNoDissipation, flDamage / 255.0, 6.0, FTENT_FADEOUT ); - - // limit it to one hole punch - if( fHasPunched ) - { - break; - } - fHasPunched = 1; - - // try punching through wall if secondary attack (primary is incapable of breaking through) - if( !m_fPrimaryFire ) - { - vec3_t start; - - VectorMA( tr.endpos, 8.0, forward, start ); - - // 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( start, vecDest, PM_STUDIO_BOX, -1, &beam_tr ); - - if( !beam_tr.allsolid ) - { - vec3_t delta; - - // trace backwards to find exit point - gEngfuncs.pEventAPI->EV_PlayerTrace( beam_tr.endpos, tr.endpos, PM_STUDIO_BOX, -1, &beam_tr ); - - VectorSubtract( beam_tr.endpos, tr.endpos, delta ); - - n = Length( delta ); - - if( n < flDamage ) - { - if( n == 0 ) - n = 1; - flDamage -= n; - - // absorption balls - { - vec3_t fwd; - VectorSubtract( tr.endpos, forward, fwd ); - gEngfuncs.pEfxAPI->R_Sprite_Trail( TE_SPRITETRAIL, tr.endpos, fwd, m_iBalls, 3, 0.1, gEngfuncs.pfnRandomFloat( 10, 20 ) / 100.0, 100, - 255, 100 ); - } - - //////////////////////////////////// WHAT TO DO HERE - // CSoundEnt::InsertSound( bits_SOUND_COMBAT, pev->origin, NORMAL_EXPLOSION_VOLUME, 3.0 ); - - EV_HLDM_DecalGunshot( &beam_tr, BULLET_MONSTER_12MM ); - - gEngfuncs.pEfxAPI->R_TempSprite( beam_tr.endpos, vec3_origin, 0.1, m_iGlow, kRenderGlow, kRenderFxNoDissipation, flDamage / 255.0, 6.0, FTENT_FADEOUT ); - - // balls - { - vec3_t fwd; - VectorSubtract( beam_tr.endpos, forward, fwd ); - gEngfuncs.pEfxAPI->R_Sprite_Trail( TE_SPRITETRAIL, beam_tr.endpos, fwd, m_iBalls, (int)( flDamage * 0.3 ), 0.1, gEngfuncs.pfnRandomFloat( 10, 20 ) / 100.0, 200, - 255, 40 ); - } - - VectorAdd( beam_tr.endpos, forward, vecSrc ); - } - } - else - { - flDamage = 0; - } - - gEngfuncs.pEventAPI->EV_PopPMStates(); - } - else - { - if( m_fPrimaryFire ) - { - // slug doesn't punch through ever with primary - // fire, so leave a little glowy bit and make some balls - gEngfuncs.pEfxAPI->R_TempSprite( tr.endpos, vec3_origin, 0.2, m_iGlow, kRenderGlow, kRenderFxNoDissipation, 200.0 / 255.0, 0.3, FTENT_FADEOUT ); - { - vec3_t fwd; - VectorAdd( tr.endpos, tr.plane.normal, fwd ); - gEngfuncs.pEfxAPI->R_Sprite_Trail( TE_SPRITETRAIL, tr.endpos, fwd, m_iBalls, 8, 0.6, gEngfuncs.pfnRandomFloat( 10, 20 ) / 100.0, 100, - 255, 200 ); - } - } - - flDamage = 0; - } - } - } - else - { - VectorAdd( tr.endpos, forward, vecSrc ); - } - } -} -//====================== -// GAUSS END -//====================== - -//====================== -// CROWBAR START -//====================== -enum crowbar_e -{ - CROWBAR_IDLE = 0, - CROWBAR_DRAW, - CROWBAR_HOLSTER, - CROWBAR_ATTACK1HIT, - CROWBAR_ATTACK1MISS, - CROWBAR_ATTACK2MISS, - CROWBAR_ATTACK2HIT, - CROWBAR_ATTACK3MISS, -#ifndef CROWBAR_IDLE_ANIM - CROWBAR_ATTACK3HIT -#else - CROWBAR_ATTACK3HIT, - CROWBAR_IDLE2, - CROWBAR_IDLE3 -#endif -}; - -int g_iSwing; - -//Only predict the miss sounds, hit sounds are still played -//server side, so players don't get the wrong idea. -void EV_Crowbar( event_args_t *args ) -{ - int idx; - vec3_t origin; - vec3_t angles; - vec3_t velocity; - - idx = args->entindex; - VectorCopy( args->origin, origin ); - - //Play Swing sound - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/cbar_miss1.wav", 1, ATTN_NORM, 0, PITCH_NORM ); - - if( EV_IsLocal( idx ) ) - { - switch( (g_iSwing++) % 3 ) - { - case 0: - gEngfuncs.pEventAPI->EV_WeaponAnimation( CROWBAR_ATTACK1MISS, 1 ); - break; - case 1: - gEngfuncs.pEventAPI->EV_WeaponAnimation( CROWBAR_ATTACK2MISS, 1 ); - break; - case 2: - gEngfuncs.pEventAPI->EV_WeaponAnimation( CROWBAR_ATTACK3MISS, 1 ); - break; - } - } -} -//====================== -// CROWBAR END -//====================== - -//====================== -// CROSSBOW START -//====================== -enum crossbow_e -{ - CROSSBOW_IDLE1 = 0, // full - CROSSBOW_IDLE2, // empty - CROSSBOW_FIDGET1, // full - CROSSBOW_FIDGET2, // empty - CROSSBOW_FIRE1, // full - CROSSBOW_FIRE2, // reload - CROSSBOW_FIRE3, // empty - CROSSBOW_RELOAD, // from empty - CROSSBOW_DRAW1, // full - CROSSBOW_DRAW2, // empty - CROSSBOW_HOLSTER1, // full - CROSSBOW_HOLSTER2 // empty -}; - -//===================== -// EV_BoltCallback -// This function is used to correct the origin and angles -// of the bolt, so it looks like it's stuck on the wall. -//===================== -void EV_BoltCallback( struct tempent_s *ent, float frametime, float currenttime ) -{ - ent->entity.origin = ent->entity.baseline.vuser1; - ent->entity.angles = ent->entity.baseline.vuser2; -} - -void EV_FireCrossbow2( event_args_t *args ) -{ - vec3_t vecSrc, vecEnd; - vec3_t up, right, forward; - pmtrace_t tr; - - int idx; - vec3_t origin; - vec3_t angles; - vec3_t velocity; - - idx = args->entindex; - VectorCopy( args->origin, origin ); - VectorCopy( args->angles, angles ); - - VectorCopy( args->velocity, velocity ); - - AngleVectors( angles, forward, right, up ); - - EV_GetGunPosition( args, vecSrc, origin ); - - VectorMA( vecSrc, 8192, forward, vecEnd ); - - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/xbow_fire1.wav", 1, ATTN_NORM, 0, 93 + gEngfuncs.pfnRandomLong( 0, 0xF ) ); - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_ITEM, "weapons/xbow_reload1.wav", gEngfuncs.pfnRandomFloat( 0.95, 1.0 ), ATTN_NORM, 0, 93 + gEngfuncs.pfnRandomLong( 0, 0xF ) ); - - if( EV_IsLocal( idx ) ) - { - if( args->iparam1 ) - gEngfuncs.pEventAPI->EV_WeaponAnimation( CROSSBOW_FIRE1, 1 ); - else if( args->iparam2 ) - gEngfuncs.pEventAPI->EV_WeaponAnimation( CROSSBOW_FIRE3, 1 ); - } - - // 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, vecEnd, PM_STUDIO_BOX, -1, &tr ); - - //We hit something - if( tr.fraction < 1.0 ) - { - physent_t *pe = gEngfuncs.pEventAPI->EV_GetPhysent( tr.ent ); - - //Not the world, let's assume we hit something organic ( dog, cat, uncle joe, etc ). - if( pe->solid != SOLID_BSP ) - { - switch( gEngfuncs.pfnRandomLong( 0, 1 ) ) - { - case 0: - gEngfuncs.pEventAPI->EV_PlaySound( idx, tr.endpos, CHAN_BODY, "weapons/xbow_hitbod1.wav", 1, ATTN_NORM, 0, PITCH_NORM ); - break; - case 1: - gEngfuncs.pEventAPI->EV_PlaySound( idx, tr.endpos, CHAN_BODY, "weapons/xbow_hitbod2.wav", 1, ATTN_NORM, 0, PITCH_NORM ); - break; - } - } - //Stick to world but don't stick to glass, it might break and leave the bolt floating. It can still stick to other non-transparent breakables though. - else if( pe->rendermode == kRenderNormal ) - { - gEngfuncs.pEventAPI->EV_PlaySound( 0, tr.endpos, CHAN_BODY, "weapons/xbow_hit1.wav", gEngfuncs.pfnRandomFloat( 0.95, 1.0 ), ATTN_NORM, 0, PITCH_NORM ); - - //Not underwater, do some sparks... - if( gEngfuncs.PM_PointContents( tr.endpos, NULL ) != CONTENTS_WATER ) - gEngfuncs.pEfxAPI->R_SparkShower( tr.endpos ); - - vec3_t vBoltAngles; - int iModelIndex = gEngfuncs.pEventAPI->EV_FindModelIndex( "models/crossbow_bolt.mdl" ); - - VectorAngles( forward, vBoltAngles ); - - TEMPENTITY *bolt = gEngfuncs.pEfxAPI->R_TempModel( tr.endpos - forward * 10, Vector( 0, 0, 0 ), vBoltAngles , 5, iModelIndex, TE_BOUNCE_NULL ); - - if( bolt ) - { - bolt->flags |= ( FTENT_CLIENTCUSTOM ); //So it calls the callback function. - bolt->entity.baseline.vuser1 = tr.endpos - forward * 10; // Pull out a little bit - bolt->entity.baseline.vuser2 = vBoltAngles; //Look forward! - bolt->callback = EV_BoltCallback; //So we can set the angles and origin back. (Stick the bolt to the wall) - } - } - } - - gEngfuncs.pEventAPI->EV_PopPMStates(); -} - -//TODO: Fully predict the fliying bolt. -void EV_FireCrossbow( event_args_t *args ) -{ - int idx; - vec3_t origin; - - idx = args->entindex; - VectorCopy( args->origin, origin ); - - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/xbow_fire1.wav", 1, ATTN_NORM, 0, 93 + gEngfuncs.pfnRandomLong( 0, 0xF ) ); - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_ITEM, "weapons/xbow_reload1.wav", gEngfuncs.pfnRandomFloat( 0.95, 1.0 ), ATTN_NORM, 0, 93 + gEngfuncs.pfnRandomLong( 0, 0xF ) ); - - //Only play the weapon anims if I shot it. - if( EV_IsLocal( idx ) ) - { - if( args->iparam1 ) - gEngfuncs.pEventAPI->EV_WeaponAnimation( CROSSBOW_FIRE1, 1 ); - else if ( args->iparam2 ) - gEngfuncs.pEventAPI->EV_WeaponAnimation( CROSSBOW_FIRE3, 1 ); - - V_PunchAxis( 0, -2.0 ); - } -} -//====================== -// CROSSBOW END -//====================== - -//====================== -// RPG START -//====================== -enum rpg_e -{ - RPG_IDLE = 0, - RPG_FIDGET, - RPG_RELOAD, // to reload - RPG_FIRE2, // to empty - RPG_HOLSTER1, // loaded - RPG_DRAW1, // loaded - RPG_HOLSTER2, // unloaded - RPG_DRAW_UL, // unloaded - RPG_IDLE_UL, // unloaded idle - RPG_FIDGET_UL // unloaded fidget -}; - -void EV_FireRpg( event_args_t *args ) -{ - int idx; - vec3_t origin; - - idx = args->entindex; - VectorCopy( args->origin, origin ); - - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/rocketfire1.wav", 0.9, ATTN_NORM, 0, PITCH_NORM ); - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_ITEM, "weapons/glauncher.wav", 0.7, ATTN_NORM, 0, PITCH_NORM ); - - //Only play the weapon anims if I shot it. - if( EV_IsLocal( idx ) ) - { - gEngfuncs.pEventAPI->EV_WeaponAnimation( RPG_FIRE2, 1 ); - - V_PunchAxis( 0, -5.0 ); - } -} -//====================== -// RPG END -//====================== - -//====================== -// EGON END -//====================== -enum egon_e -{ - EGON_IDLE1 = 0, - EGON_FIDGET1, - EGON_ALTFIREON, - EGON_ALTFIRECYCLE, - EGON_ALTFIREOFF, - EGON_FIRE1, - EGON_FIRE2, - EGON_FIRE3, - EGON_FIRE4, - EGON_DRAW, - EGON_HOLSTER -}; - -int g_fireAnims1[] = { EGON_FIRE1, EGON_FIRE2, EGON_FIRE3, EGON_FIRE4 }; -int g_fireAnims2[] = { EGON_ALTFIRECYCLE }; - -enum EGON_FIRESTATE -{ - FIRE_OFF, - FIRE_CHARGE -}; - -enum EGON_FIREMODE -{ - FIRE_NARROW, - FIRE_WIDE -}; - -#define EGON_PRIMARY_VOLUME 450 -#define EGON_BEAM_SPRITE "sprites/xbeam1.spr" -#define EGON_FLARE_SPRITE "sprites/XSpark1.spr" -#define EGON_SOUND_OFF "weapons/egon_off1.wav" -#define EGON_SOUND_RUN "weapons/egon_run3.wav" -#define EGON_SOUND_STARTUP "weapons/egon_windup2.wav" - -#define ARRAYSIZE(p) ( sizeof(p) /sizeof(p[0]) ) - -BEAM *pBeam; -BEAM *pBeam2; - -void EV_EgonFire( event_args_t *args ) -{ - int idx, /*iFireState,*/ iFireMode; - vec3_t origin; - - idx = args->entindex; - VectorCopy( args->origin, origin ); - //iFireState = args->iparam1; - iFireMode = args->iparam2; - int iStartup = args->bparam1; - - if( iStartup ) - { - if( iFireMode == FIRE_WIDE ) - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, EGON_SOUND_STARTUP, 0.98, ATTN_NORM, 0, 125 ); - else - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, EGON_SOUND_STARTUP, 0.9, ATTN_NORM, 0, 100 ); - } - else - { - // If there is any sound playing already, kill it. - Solokiller - // This is necessary because multiple sounds can play on the same channel at the same time. - // In some cases, more than 1 run sound plays when the egon stops firing, in which case only the earliest entry in the list is stopped. - // This ensures no more than 1 of those is ever active at the same time. - gEngfuncs.pEventAPI->EV_StopSound( idx, CHAN_STATIC, EGON_SOUND_RUN ); - - if( iFireMode == FIRE_WIDE ) - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_STATIC, EGON_SOUND_RUN, 0.98, ATTN_NORM, 0, 125 ); - else - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_STATIC, EGON_SOUND_RUN, 0.9, ATTN_NORM, 0, 100 ); - } - - //Only play the weapon anims if I shot it. - if( EV_IsLocal( idx ) ) - gEngfuncs.pEventAPI->EV_WeaponAnimation( g_fireAnims1[gEngfuncs.pfnRandomLong( 0, 3 )], 1 ); - - if( iStartup == 1 && EV_IsLocal( idx ) && !pBeam && !pBeam2 && cl_lw->value ) //Adrian: Added the cl_lw check for those lital people that hate weapon prediction. - { - vec3_t vecSrc, vecEnd, angles, forward, right, up; - pmtrace_t tr; - - cl_entity_t *pl = gEngfuncs.GetEntityByIndex( idx ); - - if( pl ) - { - VectorCopy( gHUD.m_vecAngles, angles ); - - AngleVectors( angles, forward, right, up ); - - EV_GetGunPosition( args, vecSrc, pl->origin ); - - VectorMA( vecSrc, 2048, forward, vecEnd ); - - gEngfuncs.pEventAPI->EV_SetUpPlayerPrediction( false, true ); - - // 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, vecEnd, PM_STUDIO_BOX, -1, &tr ); - - gEngfuncs.pEventAPI->EV_PopPMStates(); - - int iBeamModelIndex = gEngfuncs.pEventAPI->EV_FindModelIndex( EGON_BEAM_SPRITE ); - - float r = 50.0f; - float g = 50.0f; - float b = 125.0f; - - if( IEngineStudio.IsHardware() ) - { - r /= 100.0f; - g /= 100.0f; - } - - pBeam = gEngfuncs.pEfxAPI->R_BeamEntPoint( idx | 0x1000, tr.endpos, iBeamModelIndex, 99999, 3.5, 0.2, 0.7, 55, 0, 0, r, g, b ); - - if( pBeam ) - pBeam->flags |= ( FBEAM_SINENOISE ); - - pBeam2 = gEngfuncs.pEfxAPI->R_BeamEntPoint( idx | 0x1000, tr.endpos, iBeamModelIndex, 99999, 5.0, 0.08, 0.7, 25, 0, 0, r, g, b ); - } - } -} - -void EV_EgonStop( event_args_t *args ) -{ - int idx; - vec3_t origin; - - idx = args->entindex; - VectorCopy( args->origin, origin ); - - gEngfuncs.pEventAPI->EV_StopSound( idx, CHAN_STATIC, EGON_SOUND_RUN ); - - if( args->iparam1 ) - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, EGON_SOUND_OFF, 0.98, ATTN_NORM, 0, 100 ); - - if( EV_IsLocal( idx ) ) - { - if( pBeam ) - { - pBeam->die = 0.0; - pBeam = NULL; - } - - if( pBeam2 ) - { - pBeam2->die = 0.0; - pBeam2 = NULL; - } - } -} -//====================== -// EGON END -//====================== - -//====================== -// HORNET START -//====================== -enum hgun_e -{ - HGUN_IDLE1 = 0, - HGUN_FIDGETSWAY, - HGUN_FIDGETSHAKE, - HGUN_DOWN, - HGUN_UP, - HGUN_SHOOT -}; - -void EV_HornetGunFire( event_args_t *args ) -{ - int idx; //, iFireMode; - vec3_t origin, angles, vecSrc, forward, right, up; - - idx = args->entindex; - VectorCopy( args->origin, origin ); - VectorCopy( args->angles, angles ); - //iFireMode = args->iparam1; - - //Only play the weapon anims if I shot it. - if( EV_IsLocal( idx ) ) - { - V_PunchAxis( 0, gEngfuncs.pfnRandomLong( 0, 2 ) ); - gEngfuncs.pEventAPI->EV_WeaponAnimation( HGUN_SHOOT, 1 ); - } - - switch( gEngfuncs.pfnRandomLong( 0, 2 ) ) - { - case 0: - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "agrunt/ag_fire1.wav", 1, ATTN_NORM, 0, 100 ); - break; - case 1: - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "agrunt/ag_fire2.wav", 1, ATTN_NORM, 0, 100 ); - break; - case 2: - gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "agrunt/ag_fire3.wav", 1, ATTN_NORM, 0, 100 ); - break; - } -} -//====================== -// HORNET END -//====================== - -//====================== -// TRIPMINE START -//====================== -enum tripmine_e -{ - TRIPMINE_IDLE1 = 0, - TRIPMINE_IDLE2, - TRIPMINE_ARM1, - TRIPMINE_ARM2, - TRIPMINE_FIDGET, - TRIPMINE_HOLSTER, - TRIPMINE_DRAW, - TRIPMINE_WORLD, - TRIPMINE_GROUND -}; - -//We only check if it's possible to put a trip mine -//and if it is, then we play the animation. Server still places it. -void EV_TripmineFire( 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; - - // Grab predicted result for local player - gEngfuncs.pEventAPI->EV_LocalPlayerViewheight( view_ofs ); - - vecSrc = vecSrc + view_ofs; - - // 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, vecSrc + forward * 128, PM_NORMAL, -1, &tr ); - - //Hit something solid - if( tr.fraction < 1.0 ) - gEngfuncs.pEventAPI->EV_WeaponAnimation ( TRIPMINE_DRAW, 0 ); - - gEngfuncs.pEventAPI->EV_PopPMStates(); -} -//====================== -// TRIPMINE END -//====================== - -//====================== -// 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 -//====================== +#define SND_CHANGE_PITCH (1 << 7) // duplicated in protocol.h change sound pitch void EV_TrainPitchAdjust( event_args_t *args ) { @@ -1753,3 +516,720 @@ int EV_TFC_IsAllyTeam( int iTeam1, int iTeam2 ) { return 0; } + +//====================== +// KNIFE START +//====================== +enum knife_e +{ + KNIFE_IDLE = 0, + KNIFE_DRAW, + KNIFE_HOLSTER, + KNIFE_SLASH1, + KNIFE_SLASH2 +}; + +//Only predict the miss sounds, hit sounds are still played +//server side, so players don't get the wrong idea. +void EV_Knife( event_args_t *args ) +{ + int idx; + vec3_t origin; + vec3_t angles; + vec3_t velocity; + + idx = args->entindex; + VectorCopy( args->origin, origin ); + + //Play Swing sound + gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/knife_swing1.wav", 1, ATTN_NORM, 0, PITCH_LOW + gEngfuncs.pfnRandomLong( -1, 0xf ) ); + + if ( EV_IsLocal( idx ) ) + { + gEngfuncs.pEventAPI->EV_WeaponAnimation ( KNIFE_SLASH1 + gEngfuncs.pfnRandomLong( 0, 1 ), 1 ); + } +} +//====================== +// KNIFE END +//====================== + +//====================== +// AXE START +//====================== +enum axe_e +{ + AXE_IDLE = 0, + AXE_SLASH, + AXE_DRAW +}; + +//Only predict the miss sounds, hit sounds are still played +//server side, so players don't get the wrong idea. +void EV_Axe( event_args_t *args ) +{ + int idx; + vec3_t origin; + vec3_t angles; + vec3_t velocity; + + idx = args->entindex; + VectorCopy( args->origin, origin ); + + //Play Swing sound + gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/axe_swing.wav", 1, ATTN_NORM, 0, PITCH_LOW + gEngfuncs.pfnRandomLong( -1, 0xf ) ); + + if ( EV_IsLocal( idx ) ) + { + gEngfuncs.pEventAPI->EV_WeaponAnimation ( AXE_SLASH, 1 ); + } +} +//====================== +// AXE END +//====================== + +//====================== +// HAMMER START +//====================== +enum hammer_e +{ + HAMMER_IDLE = 0, + HAMMER_WHACK, + HAMMER_DRAW +}; + +//Only predict the miss sounds, hit sounds are still played +//server side, so players don't get the wrong idea. +void EV_Hammer( event_args_t *args ) +{ + int idx; + vec3_t origin; + vec3_t angles; + vec3_t velocity; + + idx = args->entindex; + VectorCopy( args->origin, origin ); + + //Play Swing sound + gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/hammer_swing.wav", 1, ATTN_NORM, 0, PITCH_LOW + gEngfuncs.pfnRandomLong( -1, 0xf ) ); + + if ( EV_IsLocal( idx ) ) + { + gEngfuncs.pEventAPI->EV_WeaponAnimation ( HAMMER_WHACK, 1 ); + } +} +//====================== +// HAMMER END +//====================== + +//====================== +// SPEAR START +//====================== +enum spear_e +{ + SPEAR_IDLE = 0, + SPEAR_STAB_START, + SPEAR_STAB_MISS, + SPEAR_STAB, + SPEAR_DRAW, + SPEAR_ELECTROCUTE +}; + +//Only predict the miss sounds, hit sounds are still played +//server side, so players don't get the wrong idea. +void EV_Spear( event_args_t *args ) +{ + int idx; + vec3_t origin; + vec3_t angles; + vec3_t velocity; + + idx = args->entindex; + VectorCopy( args->origin, origin ); + + //Play Swing sound + gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/spear_swing.wav", 1, ATTN_NORM, 0, PITCH_LOW + gEngfuncs.pfnRandomLong( -1, 0xf ) ); + + if ( EV_IsLocal( idx ) ) + { + gEngfuncs.pEventAPI->EV_WeaponAnimation ( SPEAR_STAB_MISS, 1 ); + } +} +//====================== +// SPEAR END +//====================== + +//====================== +// GLOCK START +//====================== +enum glock_e +{ + GLOCK_IDLE1 = 0, + GLOCK_IDLE2, + GLOCK_FIRE1, + GLOCK_FIRE2, + GLOCK_FIRE_LOAD, + GLOCK_RELOAD, + GLOCK_RELOAD_EMPTY, + GLOCK_DRAW +}; + +void EV_FireGlock1( event_args_t *args ) +{ + int idx; + vec3_t origin; + vec3_t angles; + vec3_t velocity; + int empty; + + vec3_t ShellVelocity; + vec3_t ShellOrigin; + int shell; + vec3_t vecSrc, vecAiming; + vec3_t up, right, forward; + + idx = args->entindex; + VectorCopy( args->origin, origin ); + VectorCopy( args->angles, angles ); + VectorCopy( args->velocity, velocity ); + + empty = args->bparam1; + AngleVectors( angles, forward, right, up ); + + shell = gEngfuncs.pEventAPI->EV_FindModelIndex ("models/shell.mdl");// brass shell + + if ( EV_IsLocal( idx ) ) + { + EV_MuzzleFlash(); + gEngfuncs.pEventAPI->EV_WeaponAnimation( empty ? GLOCK_FIRE_LOAD : GLOCK_FIRE1, 2 ); + + V_PunchAxis( 0, -2.0 ); + } + + EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 60, -8, 20 ); + + EV_EjectBrass ( ShellOrigin, ShellVelocity, angles[ YAW ], shell, TE_BOUNCE_SHELL ); + + gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/glock_fire.wav", 0.8, 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_9MM, 0, 0, args->fparam1, args->fparam2 ); +} + +void EV_FireGlock2( event_args_t *args ) +{ + int idx; + vec3_t origin; + vec3_t angles; + vec3_t velocity; + int empty; + + vec3_t ShellVelocity; + vec3_t ShellOrigin; + int shell; + vec3_t vecSrc, vecAiming; + vec3_t vecSpread; + vec3_t up, right, forward; + + idx = args->entindex; + VectorCopy( args->origin, origin ); + VectorCopy( args->angles, angles ); + VectorCopy( args->velocity, velocity ); + + empty = args->bparam1; + AngleVectors( angles, forward, right, up ); + + shell = gEngfuncs.pEventAPI->EV_FindModelIndex ("models/shell.mdl");// brass shell + + if ( EV_IsLocal( idx ) ) + { + // Add muzzle flash to current weapon model + EV_MuzzleFlash(); + gEngfuncs.pEventAPI->EV_WeaponAnimation( empty ? GLOCK_FIRE_LOAD : GLOCK_FIRE2, 2 ); + + V_PunchAxis( 0, -2.0 ); + } + + EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 60, -8, 20 ); + + EV_EjectBrass ( ShellOrigin, ShellVelocity, angles[ YAW ], shell, TE_BOUNCE_SHELL ); + + gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/glock_fire.wav", 0.8, 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_9MM, 0, &g_tracerCount[idx-1], args->fparam1, args->fparam2 ); + +} +//====================== +// GLOCK END +//====================== + +//====================== +// BERETTA START +//====================== +enum beretta_e +{ + BERETTA_IDLE1 = 0, + BERETTA_IDLE2, + BERETTA_FIRE1, + BERETTA_FIRE2, + BERETTA_FIRE_LOAD, + BERETTA_RELOAD, + BERETTA_RELOAD_EMPTY, + BERETTA_DRAW +}; + +void EV_FireBeretta( event_args_t *args ) +{ + int idx; + vec3_t origin; + vec3_t angles; + vec3_t velocity; + int empty; + + vec3_t ShellVelocity; + vec3_t ShellOrigin; + int shell; + vec3_t vecSrc, vecAiming; + vec3_t up, right, forward; + + idx = args->entindex; + VectorCopy( args->origin, origin ); + VectorCopy( args->angles, angles ); + VectorCopy( args->velocity, velocity ); + + empty = args->bparam1; + AngleVectors( angles, forward, right, up ); + + shell = gEngfuncs.pEventAPI->EV_FindModelIndex ("models/shell.mdl");// brass shell + + if ( EV_IsLocal( idx ) ) + { + EV_MuzzleFlash(); + gEngfuncs.pEventAPI->EV_WeaponAnimation( empty ? BERETTA_FIRE_LOAD : BERETTA_FIRE1, 2 ); + + V_PunchAxis( 0, -2.0 ); + } + + EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 60, -12, 30 ); + + EV_EjectBrass ( ShellOrigin, ShellVelocity, angles[ YAW ], shell, TE_BOUNCE_SHELL ); + + gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/ber_fire.wav", 0.8, 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_9MM, 0, 0, args->fparam1, args->fparam2 ); +} +//====================== +// BERETTA END +//====================== + +//====================== +// P228 START +//====================== +enum p228_e +{ + P228_IDLE1 = 0, + P228_IDLE2, + P228_FIRE1, + P228_FIRE2, + P228_FIRE_LOAD, + P228_RELOAD, + P228_RELOAD_EMPTY, + P228_DRAW +}; + +void EV_FireP228( event_args_t *args ) +{ + int idx; + vec3_t origin; + vec3_t angles; + vec3_t velocity; + int empty; + + vec3_t ShellVelocity; + vec3_t ShellOrigin; + int shell; + vec3_t vecSrc, vecAiming; + vec3_t up, right, forward; + + idx = args->entindex; + VectorCopy( args->origin, origin ); + VectorCopy( args->angles, angles ); + VectorCopy( args->velocity, velocity ); + + empty = args->bparam1; + AngleVectors( angles, forward, right, up ); + + shell = gEngfuncs.pEventAPI->EV_FindModelIndex ("models/shell.mdl");// brass shell + + if ( EV_IsLocal( idx ) ) + { + EV_MuzzleFlash(); + gEngfuncs.pEventAPI->EV_WeaponAnimation( empty ? P228_FIRE_LOAD : P228_FIRE1, 2 ); + + V_PunchAxis( 0, -2.0 ); + } + + EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 70, -12, 30 ); + + EV_EjectBrass ( ShellOrigin, ShellVelocity, angles[ YAW ], shell, TE_BOUNCE_SHELL ); + + gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/p228_fire.wav", 0.8, 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_9MM, 0, 0, args->fparam1, args->fparam2 ); +} +//====================== +// P228 END +//====================== + +//====================== +// DEAGLE START +//====================== +enum deagle_e +{ + DEAGLE_IDLE1 = 0, + DEAGLE_IDLE2, + DEAGLE_FIRE1, + DEAGLE_FIRE2, + DEAGLE_FIRE_LOAD, + DEAGLE_RELOAD, + DEAGLE_RELOAD_EMPTY, + DEAGLE_DRAW +}; + +void EV_FireDeagle( event_args_t *args ) +{ + int idx; + vec3_t origin; + vec3_t angles; + vec3_t velocity; + int empty; + + vec3_t ShellVelocity; + vec3_t ShellOrigin; + int shell; + vec3_t vecSrc, vecAiming; + vec3_t up, right, forward; + + idx = args->entindex; + VectorCopy( args->origin, origin ); + VectorCopy( args->angles, angles ); + VectorCopy( args->velocity, velocity ); + + empty = args->bparam1; + AngleVectors( angles, forward, right, up ); + + shell = gEngfuncs.pEventAPI->EV_FindModelIndex ("models/shell.mdl");// brass shell + + if ( EV_IsLocal( idx ) ) + { + EV_MuzzleFlash(); + gEngfuncs.pEventAPI->EV_WeaponAnimation( empty ? DEAGLE_FIRE_LOAD : DEAGLE_FIRE1 , 2 ); + + V_PunchAxis( 0, -2.0 ); + } + + EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 60, -12, 30 ); + + EV_EjectBrass ( ShellOrigin, ShellVelocity, angles[ YAW ], shell, TE_BOUNCE_SHELL ); + + gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/deagle_fire.wav", 0.8, 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_9MM, 0, 0, args->fparam1, args->fparam2 ); +} +//====================== +// DEAGLE END +//====================== + +//====================== +// REVOLVER START +//====================== +enum revolver_e +{ + REVOLVER_IDLE = 0, + REVOLVER_SHOOT1, + REVOLVER_SHOOT2, + REVOLVER_SHOOT_EMPTY, + REVOLVER_RELOAD, + REVOLVER_DRAW +}; + +void EV_FireRevolver( 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 ) ) + { + // Add muzzle flash to current weapon model + EV_MuzzleFlash(); + gEngfuncs.pEventAPI->EV_WeaponAnimation( REVOLVER_SHOOT1, 0 ); + + V_PunchAxis( 0, -2.0 ); + } + + gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/revolver_fire.wav", 0.8, 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_357, 0, 0, args->fparam1, args->fparam2 ); +} +//====================== +// REVOLVER END +//====================== + +//====================== +// SHOTGUN START +//====================== +enum shotgun_e +{ + SHOTGUN_IDLE = 0, + SHOTGUN_IDLE2, + SHOTGUN_FIRE, + SHOTGUN_RELOAD_START, + SHOTGUN_RELOAD_INS, + SHOTGUN_RELOAD_END, + SHOTGUN_DRAW +}; + +void EV_FireShotGunSingle( event_args_t *args ) +{ + int idx; + vec3_t origin; + vec3_t angles; + vec3_t velocity; + + vec3_t vecSrc, vecAiming; + vec3_t vecSpread; + 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 ) ) + { + // Add muzzle flash to current weapon model + EV_MuzzleFlash(); + gEngfuncs.pEventAPI->EV_WeaponAnimation( SHOTGUN_FIRE, 2 ); + } + + gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/shotgun_fire.wav", 1.0, ATTN_NORM, 0, PITCH_LOW + gEngfuncs.pfnRandomLong( 0, 9 ) ); + + EV_GetGunPosition( args, vecSrc, origin ); + VectorCopy( forward, vecAiming ); + + EV_HLDM_FireBullets( idx, forward, right, up, 8, vecSrc, vecAiming, 2048, BULLET_PLAYER_BUCKSHOT, 0, &g_tracerCount[idx-1], 0.08716, 0.08716 ); +} +//====================== +// SHOTGUN END +//====================== + +//====================== +// MP5K START +//====================== +enum mp5_e +{ + MP5K_IDLE = 0, + MP5K_FIDGET, + MP5K_FIRE1, + MP5K_FIRE2, + MP5K_RELOAD, + MP5K_DRAW +}; + +void EV_FireMP5K( event_args_t *args ) +{ + int idx; + vec3_t origin; + vec3_t angles; + vec3_t velocity; + + vec3_t ShellVelocity; + vec3_t ShellOrigin; + int shell; + 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 ); + + shell = gEngfuncs.pEventAPI->EV_FindModelIndex ("models/shell.mdl");// brass shell + + if ( EV_IsLocal( idx ) ) + { + // Add muzzle flash to current weapon model + EV_MuzzleFlash(); + gEngfuncs.pEventAPI->EV_WeaponAnimation( MP5K_FIRE1 + gEngfuncs.pfnRandomLong(0,1), 2 ); + } + + EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 30, -12, 30 ); + + EV_EjectBrass ( ShellOrigin, ShellVelocity, angles[ YAW ], shell, TE_BOUNCE_SHELL ); + + gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/mp5k_fire.wav", 1, 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_MP5, 2, &g_tracerCount[idx-1], args->fparam1, args->fparam2 ); +} +//====================== +// MP5K END +//====================== + +//====================== +// UZI START +//====================== +enum uzi_e +{ + UZI_IDLE = 0, + UZI_RELOAD, + UZI_DRAW, + UZI_FIRE1, + UZI_FIRE2, + UZI_FIRE3 +}; + +void EV_FireUzi( event_args_t *args ) +{ + int idx; + vec3_t origin; + vec3_t angles; + vec3_t velocity; + + vec3_t ShellVelocity; + vec3_t ShellOrigin; + int shell; + 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 ); + + shell = gEngfuncs.pEventAPI->EV_FindModelIndex ("models/shell.mdl");// brass shell + + if ( EV_IsLocal( idx ) ) + { + // Add muzzle flash to current weapon model + EV_MuzzleFlash(); + gEngfuncs.pEventAPI->EV_WeaponAnimation( UZI_FIRE1 + gEngfuncs.pfnRandomLong(0,2), 2 ); + } + + EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 30, -12, 30 ); + + EV_EjectBrass ( ShellOrigin, ShellVelocity, angles[ YAW ], shell, TE_BOUNCE_SHELL ); + + gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "weapons/uzi_fire.wav", 1, 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_MP5, 2, &g_tracerCount[idx-1], args->fparam1, args->fparam2 ); +} +//====================== +// UZI END +//====================== + +//====================== +// GMGENERAL START +//====================== +enum gmgeneral_e +{ + GMGENERAL_IDLE, + GMGENERAL_FIRE1, + GMGENERAL_FIRE2, + GMGENERAL_RELOAD, + GMGENERAL_DRAW +}; + +void EV_FireGMGeneral( event_args_t *args ) +{ + int idx; + vec3_t origin; + vec3_t angles; + vec3_t velocity; + + vec3_t ShellVelocity; + vec3_t ShellOrigin; + int shell; + 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 ); + + shell = gEngfuncs.pEventAPI->EV_FindModelIndex ("models/shell.mdl");// brass shell + + if( EV_IsLocal( idx ) ) + { + // Add muzzle flash to current weapon model + EV_MuzzleFlash(); + gEngfuncs.pEventAPI->EV_WeaponAnimation( GMGENERAL_FIRE1 + gEngfuncs.pfnRandomLong(0,1), 2 ); + } + + EV_GetDefaultShellInfo( args, origin, velocity, ShellVelocity, ShellOrigin, forward, right, up, 30, -12, 30 ); + + EV_EjectBrass ( ShellOrigin, ShellVelocity, angles[ YAW ], shell, TE_BOUNCE_SHELL ); + + gEngfuncs.pEventAPI->EV_PlaySound( idx, origin, CHAN_WEAPON, "gmgeneral/gm_expell.wav", 1, 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_MP5, 2, &g_tracerCount[idx-1], args->fparam1, args->fparam2 ); +} +//====================== +// GMGENERAL END +//====================== diff --git a/cl_dll/ev_hldm.h b/cl_dll/ev_hldm.h index 8a836762..90e6e7dd 100644 --- a/cl_dll/ev_hldm.h +++ b/cl_dll/ev_hldm.h @@ -24,74 +24,6 @@ typedef enum BULLET_MONSTER_12MM }Bullet; -enum glock_e -{ - GLOCK_IDLE1 = 0, - GLOCK_IDLE2, - GLOCK_IDLE3, - GLOCK_SHOOT, - GLOCK_SHOOT_EMPTY, - GLOCK_RELOAD, - GLOCK_RELOAD_NOT_EMPTY, - GLOCK_DRAW, - GLOCK_HOLSTER, - GLOCK_ADD_SILENCER -}; - -enum shotgun_e -{ - SHOTGUN_IDLE = 0, - SHOTGUN_FIRE, - SHOTGUN_FIRE2, - SHOTGUN_RELOAD, - SHOTGUN_PUMP, - SHOTGUN_START_RELOAD, - SHOTGUN_DRAW, - SHOTGUN_HOLSTER, - SHOTGUN_IDLE4, - SHOTGUN_IDLE_DEEP -}; - -enum mp5_e -{ - MP5_LONGIDLE = 0, - MP5_IDLE1, - MP5_LAUNCH, - MP5_RELOAD, - MP5_DEPLOY, - MP5_FIRE1, - MP5_FIRE2, - MP5_FIRE3 -}; - -enum python_e -{ - PYTHON_IDLE1 = 0, - PYTHON_FIDGET, - PYTHON_FIRE1, - PYTHON_RELOAD, - PYTHON_HOLSTER, - PYTHON_DRAW, - PYTHON_IDLE2, - PYTHON_IDLE3 -}; - -#define GAUSS_PRIMARY_CHARGE_VOLUME 256// how loud gauss is while charging -#define GAUSS_PRIMARY_FIRE_VOLUME 450// how loud gauss is when discharged - -enum gauss_e -{ - GAUSS_IDLE = 0, - GAUSS_IDLE2, - GAUSS_FIDGET, - GAUSS_SPINUP, - GAUSS_SPIN, - GAUSS_FIRE, - GAUSS_FIRE2, - GAUSS_HOLSTER, - GAUSS_DRAW -}; - void EV_HLDM_GunshotDecalTrace( pmtrace_t *pTrace, char *decalName ); void EV_HLDM_DecalGunshot( pmtrace_t *pTrace, int iBulletType ); int EV_HLDM_CheckTracer( int idx, float *vecSrc, float *end, float *forward, float *right, int iBulletType, int iTracerFreq, int *tracerCount ); diff --git a/cl_dll/flashlight.cpp b/cl_dll/flashlight.cpp index ef4176d8..3c95b118 100644 --- a/cl_dll/flashlight.cpp +++ b/cl_dll/flashlight.cpp @@ -55,16 +55,17 @@ void CHudFlashlight::Reset( void ) int CHudFlashlight::VidInit( void ) { - int HUD_flash_empty = gHUD.GetSpriteIndex( "flash_empty" ); - int HUD_flash_full = gHUD.GetSpriteIndex( "flash_full" ); - int HUD_flash_beam = gHUD.GetSpriteIndex( "flash_beam" ); + // int HUD_flash_empty = gHUD.GetSpriteIndex( "flash_empty" ); + // int HUD_flash_beam = gHUD.GetSpriteIndex( "flash_beam" ); + int HUD_flash_on = gHUD.GetSpriteIndex( "flash_on" ); + int HUD_flash_off = gHUD.GetSpriteIndex( "flash_off" ); - m_hSprite1 = gHUD.GetSprite( HUD_flash_empty ); - m_hSprite2 = gHUD.GetSprite( HUD_flash_full ); - m_hBeam = gHUD.GetSprite( HUD_flash_beam ); - m_prc1 = &gHUD.GetSpriteRect( HUD_flash_empty ); - m_prc2 = &gHUD.GetSpriteRect( HUD_flash_full ); - m_prcBeam = &gHUD.GetSpriteRect(HUD_flash_beam); + m_hSprite1 = gHUD.GetSprite( HUD_flash_on ); + m_hSprite2 = gHUD.GetSprite( HUD_flash_off ); + // m_hBeam = gHUD.GetSprite( HUD_flash_beam ); + m_prc1 = &gHUD.GetSpriteRect( HUD_flash_on ); + m_prc2 = &gHUD.GetSpriteRect( HUD_flash_off ); + // m_prcBeam = &gHUD.GetSpriteRect( HUD_flash_beam ); m_iWidth = m_prc2->right - m_prc2->left; return 1; @@ -93,10 +94,10 @@ int CHudFlashlight::MsgFunc_Flashlight( const char *pszName, int iSize, void *p int CHudFlashlight::Draw( float flTime ) { - static bool show = ( gHUD.m_iHideHUDDisplay & ( HIDEHUD_FLASHLIGHT | HIDEHUD_ALL ) ); - if( show != !( gHUD.m_iHideHUDDisplay & ( HIDEHUD_FLASHLIGHT | HIDEHUD_ALL ) ) ) + static bool show = ( gHUD.m_iHideHUDDisplay & ( HIDEHUD_FLASHLIGHT | HIDEHUD_ALL | HIDEHUD_ALL_EXCLUDEMESSAGE ) ); + if( show != !( gHUD.m_iHideHUDDisplay & ( HIDEHUD_FLASHLIGHT | HIDEHUD_ALL | HIDEHUD_ALL_EXCLUDEMESSAGE ) ) ) { - show = !( gHUD.m_iHideHUDDisplay & ( HIDEHUD_FLASHLIGHT | HIDEHUD_ALL ) ); + show = !( gHUD.m_iHideHUDDisplay & ( HIDEHUD_FLASHLIGHT | HIDEHUD_ALL | HIDEHUD_ALL_EXCLUDEMESSAGE ) ); if( gMobileEngfuncs ) { gMobileEngfuncs->pfnTouchHideButtons( "flashlight", !show ); @@ -108,47 +109,34 @@ int CHudFlashlight::Draw( float flTime ) int r, g, b, x, y, a; wrect_t rc; - if( !( gHUD.m_iWeaponBits & ( 1 << ( WEAPON_SUIT ) ) ) ) + if( !( gHUD.m_iWeaponBits & ( 1 << ( WEAPON_FLASHLIGHT ) ) ) ) return 1; - if( m_fOn ) + //if( m_fOn ) a = 225; - else - a = MIN_ALPHA; + //else + // a = MIN_ALPHA; - if( m_flBat < 0.20 ) - UnpackRGB( r,g,b, RGB_REDISH ); - else - UnpackRGB(r,g,b, gHUD.m_iHUDColor); + /*if( m_flBat < 0.20 ) + UnpackRGB( r, g, b, RGB_REDISH ); + else*/ + UnpackRGB( r, g, b, gHUD.m_iHUDColor ); ScaleColors( r, g, b, a ); y = ( m_prc1->bottom - m_prc2->top ) / 2; - x = ScreenWidth - m_iWidth - m_iWidth / 2 ; + x = ScreenWidth - m_iWidth - m_iWidth / 2; // Draw the flashlight casing - SPR_Set( m_hSprite1, r, g, b ); - SPR_DrawAdditive( 0, x, y, m_prc1 ); - if( m_fOn ) { - // draw the flashlight beam - x = ScreenWidth - m_iWidth / 2; - - SPR_Set( m_hBeam, r, g, b ); - SPR_DrawAdditive( 0, x, y, m_prcBeam ); + SPR_Set( m_hSprite1, r, g, b ); + SPR_DrawAdditive( 0, x, y, m_prc1 ); } - - // draw the flashlight energy level - x = ScreenWidth - m_iWidth - m_iWidth / 2; - int iOffset = m_iWidth * ( 1.0 - m_flBat ); - if( iOffset < m_iWidth ) + else { - rc = *m_prc2; - rc.left += iOffset; - SPR_Set( m_hSprite2, r, g, b ); - SPR_DrawAdditive( 0, x + iOffset, y, &rc ); + SPR_DrawAdditive( 0, x, y, m_prc2 ); } return 1; diff --git a/cl_dll/health.cpp b/cl_dll/health.cpp index 4297abc4..d9e39b8b 100644 --- a/cl_dll/health.cpp +++ b/cl_dll/health.cpp @@ -182,7 +182,7 @@ int CHudHealth::Draw( float flTime ) int a = 0, x, y; int HealthWidth; - if( ( gHUD.m_iHideHUDDisplay & HIDEHUD_HEALTH ) || gEngfuncs.IsSpectateOnly() ) + if( ( gHUD.m_iHideHUDDisplay & ( HIDEHUD_HEALTH | HIDEHUD_ALL_EXCLUDEMESSAGE ) ) || gEngfuncs.IsSpectateOnly() ) return 1; if( !m_hSprite ) @@ -212,7 +212,7 @@ int CHudHealth::Draw( float flTime ) ScaleColors( r, g, b, a ); // Only draw health if we have the suit. - if( gHUD.m_iWeaponBits & ( 1 << ( WEAPON_SUIT ) ) ) + //if( gHUD.m_iWeaponBits & ( 1 << ( WEAPON_SUIT ) ) ) { HealthWidth = gHUD.GetSpriteRect( gHUD.m_HUD_number_0 ).right - gHUD.GetSpriteRect( gHUD.m_HUD_number_0 ).left; int CrossWidth = gHUD.GetSpriteRect( m_HUD_cross ).right - gHUD.GetSpriteRect( m_HUD_cross ).left; @@ -225,16 +225,7 @@ int CHudHealth::Draw( float flTime ) x = CrossWidth + HealthWidth / 2; - x = gHUD.DrawHudNumber( x, y, DHN_3DIGITS | DHN_DRAWZERO, m_iHealth, r, g, b ); - - x += HealthWidth / 2; - - int iHeight = gHUD.m_iFontHeight; - int iWidth = HealthWidth / 10; - - UnpackRGB(r,g,b, gHUD.m_iHUDColor); //LRC - //LRC FillRGBA(x, y, iWidth, iHeight, 255, 160, 0, a); - FillRGBA(x, y, iWidth, iHeight, r, g, b, a); //LRC + gHUD.DrawHudNumber( x, y, DHN_3DIGITS | DHN_DRAWZERO, m_iHealth, r, g, b ); } DrawDamage( flTime ); diff --git a/cl_dll/hl/hl_baseentity.cpp b/cl_dll/hl/hl_baseentity.cpp index 6e132dd8..d30feb4b 100644 --- a/cl_dll/hl/hl_baseentity.cpp +++ b/cl_dll/hl/hl_baseentity.cpp @@ -300,7 +300,7 @@ Vector CBasePlayer::AutoaimDeflection( Vector &vecSrc, float flDist, float flDel void CBasePlayer::ResetAutoaim() { } void CBasePlayer::SetCustomDecalFrames( int nFrames ) { } int CBasePlayer::GetCustomDecalFrames( void ) { return -1; } -void CBasePlayer::DropPlayerItem( char *pszItemName ) { } +void CBasePlayer::DropPlayerItem( const char *pszItemName ) { } BOOL CBasePlayer::HasPlayerItem( CBasePlayerItem *pCheckItem ) { return FALSE; } BOOL CBasePlayer::SwitchWeapon( CBasePlayerItem *pWeapon ) { return FALSE; } Vector CBasePlayer::GetGunPosition( void ) { return g_vecZero; } diff --git a/cl_dll/hl/hl_events.cpp b/cl_dll/hl/hl_events.cpp index c79279dd..102ac3e4 100644 --- a/cl_dll/hl/hl_events.cpp +++ b/cl_dll/hl/hl_events.cpp @@ -20,24 +20,20 @@ extern "C" { // HLDM -void EV_FireGlock1( struct event_args_s *args ); -void EV_FireGlock2( struct event_args_s *args ); -void EV_FireShotGunSingle( struct event_args_s *args ); -void EV_FireShotGunDouble( struct event_args_s *args ); -void EV_FireMP5( struct event_args_s *args ); -void EV_FireMP52( struct event_args_s *args ); -void EV_FirePython( struct event_args_s *args ); -void EV_FireGauss( struct event_args_s *args ); -void EV_SpinGauss( struct event_args_s *args ); -void EV_Crowbar( struct event_args_s *args ); -void EV_FireCrossbow( struct event_args_s *args ); -void EV_FireCrossbow2( struct event_args_s *args ); -void EV_FireRpg( struct event_args_s *args ); -void EV_EgonFire( struct event_args_s *args ); -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_Axe( struct event_args_s *args ); +void EV_Hammer( struct event_args_s *args ); +void EV_Spear( struct event_args_s *args ); +void EV_FireGlock1( struct event_args_s *args ); +void EV_FireGlock2( struct event_args_s *args ); +void EV_FireBeretta( struct event_args_s *args ); +void EV_FireP228( struct event_args_s *args ); +void EV_FireDeagle( struct event_args_s *args ); +void EV_FireRevolver( struct event_args_s *args ); +void EV_FireShotGunSingle( struct event_args_s *args ); +void EV_FireMP5K( struct event_args_s *args ); +void EV_FireUzi( struct event_args_s *args ); +void EV_FireGMGeneral( struct event_args_s *args ); void EV_TrainPitchAdjust( struct event_args_s *args ); } @@ -57,23 +53,19 @@ That was what we were going to do, but we ran out of time...oh well. */ void Game_HookEvents( void ) { - gEngfuncs.pfnHookEvent( "events/glock1.sc", EV_FireGlock1 ); - gEngfuncs.pfnHookEvent( "events/glock2.sc", EV_FireGlock2 ); - gEngfuncs.pfnHookEvent( "events/shotgun1.sc", EV_FireShotGunSingle ); - gEngfuncs.pfnHookEvent( "events/shotgun2.sc", EV_FireShotGunDouble ); - gEngfuncs.pfnHookEvent( "events/mp5.sc", EV_FireMP5 ); - gEngfuncs.pfnHookEvent( "events/mp52.sc", EV_FireMP52 ); - gEngfuncs.pfnHookEvent( "events/python.sc", EV_FirePython ); - gEngfuncs.pfnHookEvent( "events/gauss.sc", EV_FireGauss ); - gEngfuncs.pfnHookEvent( "events/gaussspin.sc", EV_SpinGauss ); - gEngfuncs.pfnHookEvent( "events/train.sc", EV_TrainPitchAdjust ); - gEngfuncs.pfnHookEvent( "events/crowbar.sc", EV_Crowbar ); - gEngfuncs.pfnHookEvent( "events/crossbow1.sc", EV_FireCrossbow ); - gEngfuncs.pfnHookEvent( "events/crossbow2.sc", EV_FireCrossbow2 ); - gEngfuncs.pfnHookEvent( "events/rpg.sc", EV_FireRpg ); - gEngfuncs.pfnHookEvent( "events/egon_fire.sc", EV_EgonFire ); - 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/knife.sc", EV_Knife ); + gEngfuncs.pfnHookEvent( "events/axe.sc", EV_Axe ); + gEngfuncs.pfnHookEvent( "events/hammer.sc", EV_Hammer ); + gEngfuncs.pfnHookEvent( "events/null.sc", EV_Spear ); + gEngfuncs.pfnHookEvent( "events/glock21.sc", EV_FireGlock1 ); + gEngfuncs.pfnHookEvent( "events/glock22.sc", EV_FireGlock2 ); + gEngfuncs.pfnHookEvent( "events/beretta.sc", EV_FireBeretta ); + gEngfuncs.pfnHookEvent( "events/p228.sc", EV_FireP228 ); + gEngfuncs.pfnHookEvent( "events/deagle.sc", EV_FireDeagle ); + gEngfuncs.pfnHookEvent( "events/deagle1.sc", EV_FireRevolver ); + gEngfuncs.pfnHookEvent( "events/shotgun.sc", EV_FireShotGunSingle ); + gEngfuncs.pfnHookEvent( "events/mp5k.sc", EV_FireMP5K ); + gEngfuncs.pfnHookEvent( "events/mp5.sc", EV_FireUzi ); + gEngfuncs.pfnHookEvent( "events/mp5k2.sc", EV_FireGMGeneral ); + gEngfuncs.pfnHookEvent( "events/train.sc", EV_TrainPitchAdjust ); } diff --git a/cl_dll/hl/hl_objects.cpp b/cl_dll/hl/hl_objects.cpp index b51ee693..13e32638 100644 --- a/cl_dll/hl/hl_objects.cpp +++ b/cl_dll/hl/hl_objects.cpp @@ -27,8 +27,6 @@ #include "entity_types.h" #include "r_efx.h" -extern BEAM *pBeam; -extern BEAM *pBeam2; void HUD_GetLastOrg( float *org ); void UpdateBeams( void ) @@ -63,18 +61,6 @@ void UpdateBeams( void ) gEngfuncs.pEventAPI->EV_PlayerTrace( vecSrc, vecEnd, PM_STUDIO_BOX, -1, &tr ); gEngfuncs.pEventAPI->EV_PopPMStates(); - - if( pBeam ) - { - pBeam->target = tr.endpos; - pBeam->die = gEngfuncs.GetClientTime() + 0.1; // We keep it alive just a little bit forward in the future, just in case. - } - - if( pBeam2 ) - { - pBeam2->target = tr.endpos; - pBeam2->die = gEngfuncs.GetClientTime() + 0.1; // We keep it alive just a little bit forward in the future, just in case. - } } /* @@ -86,6 +72,4 @@ Add game specific, client-side objects here */ void Game_AddObjects( void ) { - if( pBeam && pBeam2 ) - UpdateBeams(); } diff --git a/cl_dll/hl/hl_weapons.cpp b/cl_dll/hl/hl_weapons.cpp index 4b3af7ea..63122f56 100644 --- a/cl_dll/hl/hl_weapons.cpp +++ b/cl_dll/hl/hl_weapons.cpp @@ -53,20 +53,19 @@ int g_irunninggausspred = 0; vec3_t previousorigin; // HLDM Weapon placeholder entities. +CKnife g_Knife; +CAxe g_Axe; +CHammer g_Hammer; +CSpear g_Spear; CGlock g_Glock; -CCrowbar g_Crowbar; -CPython g_Python; -CMP5 g_Mp5; -CCrossbow g_Crossbow; +CBeretta g_Beretta; +CP228 g_P228; +CDeagle g_Deagle; +CRevolver g_Revolver; CShotgun g_Shotgun; -CRpg g_Rpg; -CGauss g_Gauss; -CEgon g_Egon; -CHgun g_HGun; -CHandGrenade g_HandGren; -CSatchel g_Satchel; -CTripmine g_Tripmine; -CSqueak g_Snark; +CMP5K g_MP5k; +CUzi g_Uzi; +CGMGeneral g_GMGeneral; /* ====================== @@ -625,20 +624,19 @@ void HUD_InitClientWeapons( void ) HUD_PrepEntity( &player, NULL ); // Allocate slot(s) for each weapon that we are going to be predicting + HUD_PrepEntity( &g_Knife, &player ); + HUD_PrepEntity( &g_Axe, &player ); + HUD_PrepEntity( &g_Hammer, &player ); + HUD_PrepEntity( &g_Spear, &player ); HUD_PrepEntity( &g_Glock, &player ); - HUD_PrepEntity( &g_Crowbar, &player ); - HUD_PrepEntity( &g_Python, &player ); - HUD_PrepEntity( &g_Mp5, &player ); - HUD_PrepEntity( &g_Crossbow, &player ); + HUD_PrepEntity( &g_Beretta, &player ); + HUD_PrepEntity( &g_P228, &player ); + HUD_PrepEntity( &g_Deagle, &player ); + HUD_PrepEntity( &g_Revolver, &player ); HUD_PrepEntity( &g_Shotgun, &player ); - HUD_PrepEntity( &g_Rpg, &player ); - HUD_PrepEntity( &g_Gauss, &player ); - HUD_PrepEntity( &g_Egon, &player ); - 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_MP5k, &player ); + HUD_PrepEntity( &g_Uzi, &player ); + HUD_PrepEntity( &g_GMGeneral, &player ); } /* @@ -702,47 +700,44 @@ void HUD_WeaponsPostThink( local_state_s *from, local_state_s *to, usercmd_t *cm // FIXME, make this a method in each weapon? where you pass in an entity_state_t *? switch( from->client.m_iId ) { - case WEAPON_CROWBAR: - pWeapon = &g_Crowbar; + case WEAPON_KNIFE: + pWeapon = &g_Knife; + break; + case WEAPON_AXE: + pWeapon = &g_Axe; + break; + case WEAPON_HAMMER: + pWeapon = &g_Hammer; + break; + case WEAPON_SPEAR: + pWeapon = &g_Spear; break; case WEAPON_GLOCK: pWeapon = &g_Glock; break; - case WEAPON_PYTHON: - pWeapon = &g_Python; + case WEAPON_BERETTA: + pWeapon = &g_Beretta; break; - case WEAPON_MP5: - pWeapon = &g_Mp5; + case WEAPON_P228: + pWeapon = &g_P228; break; - case WEAPON_CROSSBOW: - pWeapon = &g_Crossbow; + case WEAPON_DEAGLE: + pWeapon = &g_Deagle; + break; + case WEAPON_REVOLVER: + pWeapon = &g_Revolver; break; case WEAPON_SHOTGUN: pWeapon = &g_Shotgun; break; - case WEAPON_RPG: - pWeapon = &g_Rpg; + case WEAPON_MP5K: + pWeapon = &g_MP5k; break; - case WEAPON_GAUSS: - pWeapon = &g_Gauss; + case WEAPON_UZI: + pWeapon = &g_Uzi; break; - case WEAPON_EGON: - pWeapon = &g_Egon; - break; - case WEAPON_HORNETGUN: - pWeapon = &g_HGun; - break; - case WEAPON_HANDGRENADE: - pWeapon = &g_HandGren; - break; - case WEAPON_SATCHEL: - pWeapon = &g_Satchel; - break; - case WEAPON_TRIPMINE: - pWeapon = &g_Tripmine; - break; - case WEAPON_SNARK: - pWeapon = &g_Snark; + case WEAPON_GMGENERAL: + pWeapon = &g_GMGeneral; break; } @@ -835,12 +830,9 @@ void HUD_WeaponsPostThink( local_state_s *from, local_state_s *to, usercmd_t *cm //Stores all our ammo info, so the client side weapons can use them. player.ammo_9mm = (int)from->client.vuser1[0]; player.ammo_357 = (int)from->client.vuser1[1]; - player.ammo_argrens = (int)from->client.vuser1[2]; - player.ammo_bolts = (int)from->client.ammo_nails; //is an int anyways... + player.ammo_9mmar = (int)from->client.vuser1[2]; + player.ammo_50ae = (int)from->client.ammo_nails; //is an int anyways... player.ammo_buckshot = (int)from->client.ammo_shells; - player.ammo_uranium = (int)from->client.ammo_cells; - player.ammo_hornets = (int)from->client.vuser2[0]; - player.ammo_rockets = (int)from->client.ammo_rockets; // Point to current weapon object if( from->client.m_iId ) @@ -848,12 +840,6 @@ void HUD_WeaponsPostThink( local_state_s *from, local_state_s *to, usercmd_t *cm player.m_pActiveItem = g_pWpns[from->client.m_iId]; } - if( player.m_pActiveItem->m_iId == WEAPON_RPG ) - { - ( (CRpg *)player.m_pActiveItem )->m_fSpotActive = (int)from->client.vuser2[1]; - ( (CRpg *)player.m_pActiveItem )->m_cActiveRockets = (int)from->client.vuser2[2]; - } - // Don't go firing anything if we have died. // Or if we don't have a weapon model deployed if( ( player.pev->deadflag != ( DEAD_DISCARDBODY + 1 ) ) && @@ -908,19 +894,10 @@ void HUD_WeaponsPostThink( local_state_s *from, local_state_s *to, usercmd_t *cm //HL Weapons to->client.vuser1[0] = player.ammo_9mm; to->client.vuser1[1] = player.ammo_357; - to->client.vuser1[2] = player.ammo_argrens; + to->client.vuser1[2] = player.ammo_9mmar; - to->client.ammo_nails = player.ammo_bolts; + to->client.ammo_nails = player.ammo_50ae; to->client.ammo_shells = player.ammo_buckshot; - to->client.ammo_cells = player.ammo_uranium; - to->client.vuser2[0] = player.ammo_hornets; - to->client.ammo_rockets = player.ammo_rockets; - - if( player.m_pActiveItem->m_iId == WEAPON_RPG ) - { - from->client.vuser2[1] = ( (CRpg *)player.m_pActiveItem)->m_fSpotActive; - from->client.vuser2[2] = ( (CRpg *)player.m_pActiveItem)->m_cActiveRockets; - } // Make sure that weapon animation matches what the game .dll is telling us // over the wire ( fixes some animation glitches ) @@ -928,14 +905,6 @@ void HUD_WeaponsPostThink( local_state_s *from, local_state_s *to, usercmd_t *cm { int body = 2; - //Pop the model to body 0. - if( pWeapon == &g_Tripmine ) - body = 0; - - //Show laser sight/scope combo - if( pWeapon == &g_Python && bIsMultiplayer() ) - body = 1; - // Force a fixed anim down to viewmodel HUD_SendWeaponAnim( to->client.weaponanim, body, 1 ); } diff --git a/cl_dll/hud.cpp b/cl_dll/hud.cpp index b23e178b..c1a98461 100644 --- a/cl_dll/hud.cpp +++ b/cl_dll/hud.cpp @@ -264,7 +264,7 @@ void CHud::Init( void ) m_iLogo = 0; m_iFOV = 0; - m_iHUDColor = 0x00FFA000; //255,160,0 -- LRC + m_iHUDColor = 0x00FFFFFF; //255,255,255 -- LRC CVAR_CREATE( "zoom_sensitivity_ratio", "1.2", 0 ); default_fov = CVAR_CREATE( "default_fov", "90", 0 ); @@ -309,6 +309,8 @@ void CHud::Init( void ) m_StatusIcons.Init(); m_MOTD.Init(); m_Scoreboard.Init(); + m_NoiseEffect.Init(); + m_BlackBar.Init(); m_Particle.Init(); // (LRC) -- 30/08/02 November235: Particles to Order m_Menu.Init(); @@ -484,7 +486,10 @@ void CHud::VidInit( void ) m_TextMessage.VidInit(); m_StatusIcons.VidInit(); m_Scoreboard.VidInit(); + m_NoiseEffect.VidInit(); + m_BlackBar.VidInit(); m_MOTD.VidInit(); + m_Particle.VidInit(); // (LRC) -- 30/08/02 November235: Particles to Order } diff --git a/cl_dll/hud.h b/cl_dll/hud.h index ba43138c..2ecd9c93 100644 --- a/cl_dll/hud.h +++ b/cl_dll/hud.h @@ -134,6 +134,10 @@ private: WEAPON *m_pWeapon; int m_HUD_bucket0; int m_HUD_selection; + + int m_HUD_infinite_ammo; + HSPRITE ghsprGMinf; + wrect_t *gGMinfrc; }; // @@ -167,6 +171,39 @@ private: #define FADE_TIME 100 +// +//----------------------------------------------------- +// +class CHudBlackBar: public CHudBase +{ +public: + int Init( void ); + int VidInit( void ); + int Draw( float flTime ); + +private: + HSPRITE m_hSprite; + wrect_t *m_prc; + int m_iHeight; + int m_iWidth; +}; + +// +//----------------------------------------------------- +// +class CHudNoiseEffect: public CHudBase +{ +public: + int Init( void ); + int VidInit( void ); + int Draw(float flTime); + +private: + HSPRITE m_hSprite; + wrect_t *m_prc; + int m_iWidth; +}; + // //----------------------------------------------------- // @@ -692,6 +729,8 @@ public: CHudStatusIcons m_StatusIcons; CHudScoreboard m_Scoreboard; CHudMOTD m_MOTD; + CHudBlackBar m_BlackBar; + CHudNoiseEffect m_NoiseEffect; CHudParticle m_Particle; // (LRC) -- 30/08/02 November235: Particles to Order void Init( void ); diff --git a/cl_dll/hud_msg.cpp b/cl_dll/hud_msg.cpp index 685bea82..2d5fd9e9 100644 --- a/cl_dll/hud_msg.cpp +++ b/cl_dll/hud_msg.cpp @@ -31,9 +31,6 @@ float g_fFadeDuration; //negative = fading out #define MAX_CLIENTS 32 -extern BEAM *pBeam; -extern BEAM *pBeam2; - /// USER-DEFINED SERVER MESSAGE HANDLERS int CHud::MsgFunc_ResetHUD( const char *pszName, int iSize, void *pbuf ) @@ -95,9 +92,6 @@ void CHud::MsgFunc_InitHUD( const char *pszName, int iSize, void *pbuf ) pList->p->InitHUDData(); pList = pList->pNext; } - - //Probably not a good place to put this. - pBeam = pBeam2 = NULL; } //LRC diff --git a/cl_dll/input.cpp b/cl_dll/input.cpp index 0abd542b..e10616ee 100644 --- a/cl_dll/input.cpp +++ b/cl_dll/input.cpp @@ -75,6 +75,7 @@ cvar_t *cl_yawspeed; cvar_t *cl_pitchspeed; cvar_t *cl_anglespeedkey; cvar_t *cl_vsmoothing; +cvar_t *cl_noiseeffect; /* =============================================================================== @@ -1102,6 +1103,8 @@ void InitInput( void ) cl_vsmoothing = gEngfuncs.pfnRegisterVariable( "cl_vsmoothing", "0.05", FCVAR_ARCHIVE ); + cl_noiseeffect = gEngfuncs.pfnRegisterVariable ( "cl_noiseeffect", "1", FCVAR_ARCHIVE ); + m_pitch = gEngfuncs.pfnRegisterVariable( "m_pitch","0.022", FCVAR_ARCHIVE ); m_yaw = gEngfuncs.pfnRegisterVariable( "m_yaw","0.022", FCVAR_ARCHIVE ); m_forward = gEngfuncs.pfnRegisterVariable( "m_forward","1", FCVAR_ARCHIVE ); diff --git a/cl_dll/view.cpp b/cl_dll/view.cpp index a8d9c0e8..e1fd39cc 100644 --- a/cl_dll/view.cpp +++ b/cl_dll/view.cpp @@ -1353,21 +1353,9 @@ int V_FindViewModelByWeaponModel( int weaponindex ) { static const char *modelmap[][2] = { - { "models/p_crossbow.mdl", "models/v_crossbow.mdl" }, - { "models/p_crowbar.mdl", "models/v_crowbar.mdl" }, - { "models/p_egon.mdl", "models/v_egon.mdl" }, - { "models/p_gauss.mdl", "models/v_gauss.mdl" }, - { "models/p_9mmhandgun.mdl", "models/v_9mmhandgun.mdl" }, - { "models/p_grenade.mdl", "models/v_grenade.mdl" }, - { "models/p_hgun.mdl", "models/v_hgun.mdl" }, - { "models/p_9mmAR.mdl", "models/v_9mmAR.mdl" }, - { "models/p_357.mdl", "models/v_357.mdl" }, - { "models/p_rpg.mdl", "models/v_rpg.mdl" }, - { "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_crowbar.mdl", "models/v_knife.mdl" }, + { "models/p_9mmhandgun.mdl", "models/v_glock.mdl" }, + { "models/p_shotgun.mdl", "models/v_shotgun.mdl" }, { NULL, NULL } }; @@ -1619,7 +1607,7 @@ Client side punch effect */ void V_PunchAxis( int axis, float punch ) { - g_ev_punchangle[axis] = punch; + g_ev_punchangle[axis] += punch; } /* diff --git a/dlls/Android.mk b/dlls/Android.mk index 9b3e842a..f3e0dc2c 100644 --- a/dlls/Android.mk +++ b/dlls/Android.mk @@ -19,25 +19,30 @@ LOCAL_C_INCLUDES := $(LOCAL_PATH)/. \ $(LOCAL_PATH)/../engine \ $(LOCAL_PATH)/../public \ $(LOCAL_PATH)/../pm_shared \ - $(LOCAL_PATH)/../game_shared + $(LOCAL_PATH)/../game_shared \ + $(LOCAL_PATH)/aomdc -LOCAL_SRC_FILES := aflock.cpp agrunt.cpp AI_BaseNPC_Schedule.cpp airtank.cpp \ +LOCAL_SRC_FILES := aflock.cpp agrunt.cpp schedule.cpp airtank.cpp \ alias.cpp animating.cpp animation.cpp apache.cpp barnacle.cpp barney.cpp \ bigmomma.cpp bloater.cpp bmodels.cpp bullsquid.cpp buttons.cpp cbase.cpp \ - client.cpp combat.cpp controller.cpp crossbow.cpp crowbar.cpp defaultai.cpp \ - doors.cpp effects.cpp egon.cpp explode.cpp flyingmonster.cpp func_break.cpp \ - func_tank.cpp game.cpp gamerules.cpp gargantua.cpp gauss.cpp genericmonster.cpp \ - ggrenade.cpp globals.cpp gman.cpp h_ai.cpp handgrenade.cpp hassassin.cpp \ + client.cpp combat.cpp controller.cpp defaultai.cpp \ + doors.cpp effects.cpp explode.cpp flyingmonster.cpp func_break.cpp \ + func_tank.cpp game.cpp gamerules.cpp gargantua.cpp genericmonster.cpp \ + ggrenade.cpp globals.cpp gman.cpp h_ai.cpp hassassin.cpp \ h_battery.cpp h_cine.cpp h_cycler.cpp headcrab.cpp healthkit.cpp h_export.cpp \ - hgrunt.cpp hornet.cpp hornetgun.cpp houndeye.cpp ichthyosaur.cpp islave_deamon.cpp \ + hgrunt.cpp hornet.cpp houndeye.cpp ichthyosaur.cpp islave_deamon.cpp \ items.cpp leech.cpp lights.cpp locus.cpp maprules.cpp monstermaker.cpp monsters.cpp \ - monsterstate.cpp mortar.cpp movewith.cpp mp5.cpp multiplay_gamerules.cpp nihilanth.cpp \ + monsterstate.cpp mortar.cpp movewith.cpp multiplay_gamerules.cpp nihilanth.cpp \ nodes.cpp osprey.cpp pathcorner.cpp plane.cpp plats.cpp player.cpp playermonster.cpp \ - python.cpp rat.cpp roach.cpp rpg.cpp satchel.cpp scientist.cpp scripted.cpp shotgun.cpp \ + rat.cpp roach.cpp rpg.cpp scientist.cpp scripted.cpp shotgun.cpp \ singleplay_gamerules.cpp skill.cpp sound.cpp soundent.cpp spectator.cpp squadmonster.cpp \ squeakgrenade.cpp stats.cpp subs.cpp talkmonster.cpp teamplay_gamerules.cpp tempmonster.cpp \ - tentacle.cpp triggers.cpp tripmine.cpp turret.cpp util.cpp weapons.cpp world.cpp xen.cpp \ - zombie.cpp wpn_shared/hl_wpn_glock.cpp \ + tentacle.cpp triggers.cpp turret.cpp util.cpp weapons.cpp world.cpp xen.cpp \ + zombie.cpp aomdc/knife.cpp aomdc/axe.cpp \ + aomdc/hammer.cpp aomdc/spear.cpp aomdc/glock.cpp aomdc/beretta.cpp \ + aomdc/p228.cpp aomdc/deagle.cpp aomdc/revolver.cpp aomdc/mp5k.cpp \ + aomdc/uzi.cpp aomdc/gmgeneral.cpp aomdc/zombie2.cpp aomdc/zombie3.cpp aomdc/zombie4.cpp \ + aomdc/ghost.cpp aomdc/wheelchair.cpp aomdc/baddavid.cpp \ ../pm_shared/pm_debug.c ../pm_shared/pm_math.c ../pm_shared/pm_shared.c diff --git a/dlls/CMakeLists.txt b/dlls/CMakeLists.txt index 48b81f78..40dad007 100644 --- a/dlls/CMakeLists.txt +++ b/dlls/CMakeLists.txt @@ -37,6 +37,24 @@ else() endif() set (SVDLL_SOURCES + aomdc/axe.cpp + aomdc/baddavid.cpp + aomdc/beretta.cpp + aomdc/deagle.cpp + aomdc/ghost.cpp + aomdc/glock.cpp + aomdc/gmgeneral.cpp + aomdc/hammer.cpp + aomdc/knife.cpp + aomdc/mp5k.cpp + aomdc/p228.cpp + aomdc/revolver.cpp + aomdc/spear.cpp + aomdc/uzi.cpp + aomdc/wheelchair.cpp + aomdc/zombie2.cpp + aomdc/zombie3.cpp + aomdc/zombie4.cpp agrunt.cpp airtank.cpp aflock.cpp @@ -55,12 +73,12 @@ set (SVDLL_SOURCES client.cpp combat.cpp controller.cpp - crossbow.cpp - crowbar.cpp +# crossbow.cpp +# crowbar.cpp defaultai.cpp doors.cpp effects.cpp - egon.cpp +# egon.cpp explode.cpp flyingmonster.cpp func_break.cpp @@ -68,24 +86,24 @@ set (SVDLL_SOURCES game.cpp gamerules.cpp gargantua.cpp - gauss.cpp +# gauss.cpp genericmonster.cpp ggrenade.cpp globals.cpp - glock.cpp +# glock.cpp gman.cpp h_ai.cpp h_battery.cpp h_cine.cpp h_cycler.cpp h_export.cpp - handgrenade.cpp +# handgrenade.cpp hassassin.cpp headcrab.cpp healthkit.cpp hgrunt.cpp hornet.cpp - hornetgun.cpp +# hornetgun.cpp houndeye.cpp ichthyosaur.cpp islave_deamon.cpp @@ -99,7 +117,7 @@ set (SVDLL_SOURCES monsterstate.cpp mortar.cpp movewith.cpp - mp5.cpp +# mp5.cpp multiplay_gamerules.cpp nihilanth.cpp nodes.cpp @@ -110,11 +128,11 @@ set (SVDLL_SOURCES plats.cpp player.cpp playermonster.cpp - python.cpp +# python.cpp rat.cpp roach.cpp rpg.cpp - satchel.cpp +# satchel.cpp schedule.cpp scientist.cpp scripted.cpp @@ -132,7 +150,7 @@ set (SVDLL_SOURCES tempmonster.cpp tentacle.cpp triggers.cpp - tripmine.cpp +# tripmine.cpp turret.cpp util.cpp weapons.cpp @@ -144,7 +162,7 @@ set (SVDLL_SOURCES ../pm_shared/pm_shared.c ) -include_directories (. wpn_shared ../common ../engine ../pm_shared ../game_shared ../public) +include_directories (. wpn_shared ../common ../engine ../pm_shared ../game_shared ../public aomdc) if(USE_VOICEMGR) set(SVDLL_SOURCES diff --git a/dlls/agrunt.cpp b/dlls/agrunt.cpp index 51c8b4cc..c450eba7 100644 --- a/dlls/agrunt.cpp +++ b/dlls/agrunt.cpp @@ -593,7 +593,7 @@ void CAGrunt::Spawn() pev->solid = SOLID_SLIDEBOX; pev->movetype = MOVETYPE_STEP; - m_bloodColor = BLOOD_COLOR_GREEN; + m_bloodColor = DONT_BLEED; pev->effects = 0; if (pev->health == 0) pev->health = gSkillData.agruntHealth; @@ -918,10 +918,10 @@ BOOL CAGrunt::FCanCheckAttacks( void ) //========================================================= BOOL CAGrunt::CheckMeleeAttack1( float flDot, float flDist ) { - if( HasConditions( bits_COND_SEE_ENEMY ) && flDist <= AGRUNT_MELEE_DIST && flDot >= 0.6 && m_hEnemy != 0 ) + /*if( HasConditions( bits_COND_SEE_ENEMY ) && flDist <= AGRUNT_MELEE_DIST && flDot >= 0.6 && m_hEnemy != 0 ) { return TRUE; - } + }*/ return FALSE; } @@ -1117,10 +1117,10 @@ Schedule_t *CAGrunt::GetSchedule( void ) return GetScheduleOfType( SCHED_RANGE_ATTACK1 ); } - if( OccupySlot ( bits_SLOT_AGRUNT_CHASE ) ) + /*if( OccupySlot ( bits_SLOT_AGRUNT_CHASE ) ) { return GetScheduleOfType( SCHED_CHASE_ENEMY ); - } + }*/ return GetScheduleOfType( SCHED_STANDOFF ); } diff --git a/dlls/aomdc/axe.cpp b/dlls/aomdc/axe.cpp new file mode 100644 index 00000000..b14782dc --- /dev/null +++ b/dlls/aomdc/axe.cpp @@ -0,0 +1,282 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ + +#include "extdll.h" +#include "util.h" +#include "cbase.h" +#include "monsters.h" +#include "weapons.h" +#include "nodes.h" +#include "player.h" +#include "gamerules.h" + + +#define CROWBAR_BODYHIT_VOLUME 128 +#define CROWBAR_WALLHIT_VOLUME 512 + +LINK_ENTITY_TO_CLASS( weapon_axe, CAxe ); + + + +enum axe_e { + AXE_IDLE = 0, + AXE_SLASH, + AXE_DRAW +}; + + +void CAxe::Spawn( ) +{ + Precache( ); + m_iId = WEAPON_AXE; + SET_MODEL(ENT(pev), "models/w_axe.mdl"); + m_iClip = -1; + + FallInit();// get ready to fall down. +} + + +void CAxe::Precache( void ) +{ + PRECACHE_MODEL("models/v_axe.mdl"); + PRECACHE_MODEL("models/w_axe.mdl"); + PRECACHE_MODEL("models/p_crowbar.mdl"); + PRECACHE_SOUND("weapons/Axe_hit.wav"); + PRECACHE_SOUND("weapons/Axe_hitbody.wav"); + PRECACHE_SOUND("weapons/Axe_swing.wav"); + + m_usAxe = PRECACHE_EVENT ( 1, "events/axe.sc" ); +} + +int CAxe::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; +} + +int CAxe::GetItemInfo(ItemInfo *p) +{ + p->pszName = STRING(pev->classname); + p->pszAmmo1 = NULL; + p->iMaxAmmo1 = -1; + p->pszAmmo2 = NULL; + p->iMaxAmmo2 = -1; + p->iMaxClip = WEAPON_NOCLIP; + p->iSlot = 0; + p->iPosition = 2; + p->iId = WEAPON_AXE; + p->iWeight = AXE_WEIGHT; + return 1; +} + +BOOL CAxe::Deploy( ) +{ + return DefaultDeploy( "models/v_axe.mdl", "models/p_crowbar.mdl", AXE_DRAW, "Axe" ); +} + +void FindHullIntersection(const Vector &vecSrc, TraceResult &tr, float *mins, float *maxs, edict_t *pEntity); +/* +void FindHullIntersection( const Vector &vecSrc, TraceResult &tr, float *mins, float *maxs, edict_t *pEntity ) +{ + int i, j, k; + float distance; + float *minmaxs[2] = {mins, maxs}; + TraceResult tmpTrace; + Vector vecHullEnd = tr.vecEndPos; + Vector vecEnd; + + distance = 1e6f; + + vecHullEnd = vecSrc + ((vecHullEnd - vecSrc)*2); + UTIL_TraceLine( vecSrc, vecHullEnd, dont_ignore_monsters, pEntity, &tmpTrace ); + if ( tmpTrace.flFraction < 1.0 ) + { + tr = tmpTrace; + return; + } + + for ( i = 0; i < 2; i++ ) + { + for ( j = 0; j < 2; j++ ) + { + for ( k = 0; k < 2; k++ ) + { + vecEnd.x = vecHullEnd.x + minmaxs[i][0]; + vecEnd.y = vecHullEnd.y + minmaxs[j][1]; + vecEnd.z = vecHullEnd.z + minmaxs[k][2]; + + UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, pEntity, &tmpTrace ); + if ( tmpTrace.flFraction < 1.0 ) + { + float thisDistance = (tmpTrace.vecEndPos - vecSrc).Length(); + if ( thisDistance < distance ) + { + tr = tmpTrace; + distance = thisDistance; + } + } + } + } + } +} +*/ + +void CAxe::PrimaryAttack() +{ + if (! Swing( 1 )) + { +#ifndef CLIENT_DLL + SetThink(&CAxe:: SwingAgain ); + SetNextThink( 0.1 ); +#endif + } +} + + +void CAxe::Smack( ) +{ + DecalGunshot( &m_trHit, BULLET_PLAYER_CROWBAR ); +} + + +void CAxe::SwingAgain( void ) +{ + Swing( 0 ); +} + + +int CAxe::Swing( int fFirst ) +{ + int fDidHit = FALSE; + + TraceResult tr; + + UTIL_MakeVectors (m_pPlayer->pev->v_angle); + Vector vecSrc = m_pPlayer->GetGunPosition( ); + Vector vecEnd = vecSrc + gpGlobals->v_forward * 32; + + UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr ); + +#ifndef CLIENT_DLL + if ( tr.flFraction >= 1.0 ) + { + UTIL_TraceHull( vecSrc, vecEnd, dont_ignore_monsters, head_hull, ENT( m_pPlayer->pev ), &tr ); + if ( tr.flFraction < 1.0 ) + { + // Calculate the point of intersection of the line (or hull) and the object we hit + // This is and approximation of the "best" intersection + CBaseEntity *pHit = CBaseEntity::Instance( tr.pHit ); + if ( !pHit || pHit->IsBSPModel() ) + FindHullIntersection( vecSrc, tr, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX, m_pPlayer->edict() ); + vecEnd = tr.vecEndPos; // This is the point on the actual surface (the hull could have hit space) + } + } +#endif + + PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usAxe, + 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, + 0.0, 0, 0.0 ); + + + if ( tr.flFraction >= 1.0 ) + { + if (fFirst) + { + // miss + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.9; + + // player "shoot" animation + m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); + } + } + else + { + SendWeaponAnim( AXE_SLASH ); + + // player "shoot" animation + m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); + +#ifndef CLIENT_DLL + + // hit + fDidHit = TRUE; + CBaseEntity *pEntity = CBaseEntity::Instance(tr.pHit); + + // play thwack, smack, or dong sound + float flVol = 1.0; + int fHitWorld = TRUE; + + if (pEntity) + { + ClearMultiDamage( ); + + pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgAxe, gpGlobals->v_forward, &tr, DMG_CLUB ); + + ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev ); + + if ( pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE ) + { + // play thwack or smack sound + EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/axe_hitbody.wav", 1, ATTN_NORM); + + m_pPlayer->m_iWeaponVolume = CROWBAR_BODYHIT_VOLUME; + + flVol = 0.1; + + fHitWorld = FALSE; + } + } + + // play texture hit sound + // UNDONE: Calculate the correct point of intersection when we hit with the hull instead of the line + + if (fHitWorld) + { + float fvolbar = TEXTURETYPE_PlaySound(&tr, vecSrc, vecSrc + (vecEnd-vecSrc)*2, BULLET_PLAYER_CROWBAR); + + if ( g_pGameRules->IsMultiplayer() ) + { + // override the volume here, cause we don't play texture sounds in multiplayer, + // and fvolbar is going to be 0 from the above call. + + fvolbar = 1; + } + + // also play axe strike + EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/axe_hit.wav", fvolbar, ATTN_NORM); + + // delay the decal a bit + m_trHit = tr; + } + + m_pPlayer->m_iWeaponVolume = flVol * CROWBAR_WALLHIT_VOLUME; + + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.9; + + SetThink(&CAxe:: Smack ); + SetNextThink( 0.2 ); +#endif + } + return fDidHit; +} + + + diff --git a/dlls/aomdc/baddavid.cpp b/dlls/aomdc/baddavid.cpp new file mode 100644 index 00000000..d0f7399b --- /dev/null +++ b/dlls/aomdc/baddavid.cpp @@ -0,0 +1,446 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* This source code contains proprietary and confidential information of +* Valve LLC and its suppliers. Access to this code is restricted to +* persons who have executed a written SDK license with Valve. Any access, +* use or distribution of this code by or to any unlicensed person is illegal. +* +****/ +//========================================================= +// Bad David Monster +//========================================================= + +#include "zombie.h" +#include "shake.h" +#include "effects.h" +#include "player.h" + +#define BADDAVID_AE_ATTACK 1 +#define BADDAVID_AE_FLINCH 1013 + +#define BADDAVID_FLINCH_DELAY 15.0 +#define BADDAVID_HEALTH 1800 + +#define SF_NOELECTROCUTE ( 1 << 5 ) + +class CDavidMonster : public CZombie +{ +public: + void Spawn( void ); + void Precache( void ); + void HandleAnimEvent( MonsterEvent_t *pEvent ); + void MonsterThink(); + int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType ); + int IgnoreConditions( void ); + + int Save( CSave &save ); + int Restore( CRestore &restore ); + static TYPEDESCRIPTION m_SaveData[]; + + BOOL StartFlame; + BOOL HasTurnedOffFlameSound; + float m_flNextFlinchForget; + float NextFlame; + float NextFlameBurn; + float TurnOffFlames; + + void PainSound( void ); + void AlertSound( void ); + void AttackSound( void ); + void ThunderAttackSound(); + void DavidHurtSound(); + + BOOL CheckMeleeAttack1 ( float flDot, float flDist ); + BOOL CheckMeleeAttack2 ( float flDot, float flDist ); + + static const char *pAttackSounds[]; + static const char *pFireSounds[]; + static const char *pAxeHitSounds[]; + static const char *pAxeGrabSounds[]; + static const char *pThunderAttackSounds[]; + static const char *pAlertSounds[]; + static const char *pPainSounds[]; + static const char *pHurtSounds[]; +}; + +LINK_ENTITY_TO_CLASS( monster_david, CDavidMonster ); + +TYPEDESCRIPTION CDavidMonster::m_SaveData[] = +{ + DEFINE_FIELD( CDavidMonster, StartFlame, FIELD_BOOLEAN ), + DEFINE_FIELD( CDavidMonster, HasTurnedOffFlameSound, FIELD_BOOLEAN ), + DEFINE_FIELD( CDavidMonster, m_flNextFlinchForget, FIELD_TIME ), + DEFINE_FIELD( CDavidMonster, NextFlame, FIELD_TIME ), + DEFINE_FIELD( CDavidMonster, NextFlameBurn, FIELD_TIME ), + DEFINE_FIELD( CDavidMonster, TurnOffFlames, FIELD_TIME ), +}; + +IMPLEMENT_SAVERESTORE( CDavidMonster, CZombie ) + +const char *CDavidMonster::pAttackSounds[] = +{ + "davidbad/david_attack.wav" +}; + +const char *CDavidMonster::pFireSounds[] = +{ + "davidbad/fire_ignite.wav", + "davidbad/fire_loop.wav", + "davidbad/fire_off.wav" +}; + +const char *CDavidMonster::pAxeHitSounds[] = +{ + "davidbad/axe_hit.wav", + "davidbad/axe_hitbody.wav", + "davidbad/axe_swing.wav" +}; + +const char *CDavidMonster::pAxeGrabSounds[] = +{ + "davidbad/david_axegrab.wav" +}; + +const char *CDavidMonster::pThunderAttackSounds[] = +{ + "davidbad/thunder_attack1.wav", + "davidbad/thunder_attack2.wav", + "davidbad/thunder_attack3.wav" +}; + +const char *CDavidMonster::pAlertSounds[] = +{ + "davidbad/db_alert10.wav", + "davidbad/db_alert20.wav", + "davidbad/db_alert30.wav" +}; + +const char *CDavidMonster::pPainSounds[] = +{ + "davidbad/db_pain1.wav", + "davidbad/db_pain2.wav" +}; + +const char *CDavidMonster::pHurtSounds[] = +{ + "davidbad/david_hurt.wav", + "davidbad/david_hurt2.wav", + "davidbad/david_hurt3.wav" +}; + +int CDavidMonster :: TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType ) +{ + if( bitsDamageType == DMG_SPEAR ) + { + if( m_flNextFlinchForget < gpGlobals->time) + { + if( RANDOM_LONG( 0, 1 ) ) + ClearBits( m_afMemory, bits_MEMORY_FLINCHED ); + m_flNextFlinchForget = gpGlobals->time + BADDAVID_FLINCH_DELAY; + } + + // HACK HACK -- until we fix this. + if( IsAlive() ) + PainSound(); + return CBaseMonster::TakeDamage( pevInflictor, pevAttacker, flDamage, bitsDamageType ); + } + + if( pevAttacker->flags & FL_CLIENT ) + { + for( int i = 1; i <= gpGlobals->maxClients; i++ ) + { + CBaseEntity *pPlayer = UTIL_PlayerByIndex( i ); + if( pPlayer ) + { + UTIL_ScreenFade( pPlayer, Vector( 255, 0, 0 ), 0.5, 0.0, 100, FFADE_IN ); + pPlayer->TakeDamage( pev, pev, flDamage / 4, bitsDamageType ); + } + } + } + return 0; +} + +void CDavidMonster :: PainSound( void ) +{ + int pitch = PITCH_LOW + RANDOM_LONG(0,9); + + if (RANDOM_LONG(0,5) < 2) + EMIT_SOUND_DYN ( ENT(pev), CHAN_VOICE, pPainSounds[ RANDOM_LONG(0,ARRAYSIZE(pPainSounds)-1) ], 1.0, ATTN_NORM, 0, pitch ); +} + +void CDavidMonster :: AlertSound( void ) +{ + int pitch = PITCH_LOW + RANDOM_LONG(0,9); + + EMIT_SOUND_DYN ( ENT(pev), CHAN_VOICE, pAlertSounds[ RANDOM_LONG(0,ARRAYSIZE(pAlertSounds)-1) ], 1.0, ATTN_NORM, 0, pitch ); +} + +void CDavidMonster :: AttackSound( void ) +{ + // Play a random attack sound + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackSounds[0], 1.0, ATTN_NORM, 0, PITCH_NORM + RANDOM_LONG(-5,5) ); +} + +void CDavidMonster :: ThunderAttackSound( void ) +{ + for( int i = 1; i <= gpGlobals->maxClients; i++ ) + { + CBaseEntity *pPlayer = UTIL_PlayerByIndex( i ); + if( pPlayer ) + // Play a random thunder attack sound + EMIT_SOUND_DYN ( ENT(pPlayer->pev), CHAN_AUTO, pThunderAttackSounds[ RANDOM_LONG(0,ARRAYSIZE(pThunderAttackSounds)-1) ], 1.0, ATTN_NORM, 0, PITCH_NORM + RANDOM_LONG(-5,5) ); + } + CBaseEntity::Create( "lightning_effect_boss", g_vecZero, g_vecZero, NULL ); +} + +void CDavidMonster :: DavidHurtSound( void ) +{ + // Play a random hurt sound + EMIT_SOUND_DYN ( ENT(pev), CHAN_VOICE, pHurtSounds[ RANDOM_LONG(0,ARRAYSIZE(pHurtSounds)-1) ], 1.0, ATTN_NORM, 0, PITCH_NORM + RANDOM_LONG(-5,5) ); +} + +//========================================================= +// HandleAnimEvent - catches the monster-specific messages +// that occur when tagged animation frames are played. +//========================================================= +void CDavidMonster :: HandleAnimEvent( MonsterEvent_t *pEvent ) +{ + switch( pEvent->event ) + { + case BADDAVID_AE_ATTACK: + { + // do stuff for this event. + CBaseEntity *pHurt = CheckTraceHullAttack( 70, gSkillData.zombieDmgOneSlash, DMG_SLASH ); + if ( pHurt ) + { + if ( pHurt->pev->flags & (FL_MONSTER|FL_CLIENT) ) + { + pHurt->pev->punchangle.z = 18; + pHurt->pev->punchangle.x = 5; + pHurt->pev->velocity = pHurt->pev->velocity - gpGlobals->v_right * 100; + if(pev->body) + { + EMIT_SOUND_DYN( ENT(pev), CHAN_WEAPON, "davidbad/axe_hitbody.wav", 1.0, ATTN_NORM, 0, PITCH_NORM + RANDOM_LONG(-5,5) ); + } + else + { + DavidHurtSound(); + UTIL_ScreenFade( pHurt, Vector( 255, 0, 0 ), 0.5, 0.0, 100, FFADE_IN ); + } + } + else if( pev->body ) // Play attack hit sound + EMIT_SOUND_DYN( ENT(pev), CHAN_WEAPON, "davidbad/axe_hit.wav", 1.0, ATTN_NORM, 0, PITCH_NORM + RANDOM_LONG(-5,5) ); + } + else if( pev->body ) // Play attack miss sound + EMIT_SOUND_DYN( ENT(pev), CHAN_WEAPON, "davidbad/axe_swing.wav", 1.0, ATTN_NORM, 0, PITCH_NORM + RANDOM_LONG(-5,5) ); + + if( RANDOM_LONG( 0, 1 ) ) + AttackSound(); + } + break; + case BADDAVID_AE_FLINCH: + pev->body = pev->body ? 0 : 1; + // EMIT_SOUND_DYN( ENT(pev), CHAN_WEAPON, "davidbad/david_axegrab.wav", 1.0, ATTN_NORM, 0, PITCH_NORM + RANDOM_LONG(-5,5) ); + break; + default: + CBaseMonster::HandleAnimEvent( pEvent ); + break; + } +} + +//========================================================= +// CheckRangeAttack1 +//========================================================= +BOOL CDavidMonster :: CheckMeleeAttack1 ( float flDot, float flDist ) +{ + if(!pev->body) + return CBaseMonster::CheckMeleeAttack1( flDot, flDist ); + + return FALSE; +} + +//========================================================= +// CheckMeleeAttack2 +//========================================================= +BOOL CDavidMonster :: CheckMeleeAttack2 ( float flDot, float flDist ) +{ + return CBaseMonster::CheckMeleeAttack2( flDot, flDist ); +} + +//========================================================= +// Spawn +//========================================================= +void CDavidMonster :: Spawn() +{ + Precache( ); + + if (pev->model) + SET_MODEL(ENT(pev), STRING(pev->model)); //LRC + else + SET_MODEL(ENT(pev), "models/david_monster.mdl"); + UTIL_SetSize( pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX ); + + pev->solid = SOLID_SLIDEBOX; + pev->movetype = MOVETYPE_STEP; + m_bloodColor = BLOOD_COLOR_RED; + if (pev->health == 0) + pev->health = BADDAVID_HEALTH; + pev->view_ofs = VEC_VIEW;// position of the eyes relative to monster's origin. + m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result ) + m_MonsterState = MONSTERSTATE_NONE; + m_afCapability = bits_CAP_DOORS_GROUP; + + MonsterInit(); +} + +//========================================================= +// Precache - precaches all resources this monster needs +//========================================================= +void CDavidMonster :: Precache() +{ + int i; + + if (pev->model) + PRECACHE_MODEL(STRING(pev->model)); //LRC + else + PRECACHE_MODEL("models/david_monster.mdl"); + + PRECACHE_MODEL("sprites/xffloor.spr"); + + for( i = 0; i < ARRAYSIZE( pAxeHitSounds ); i++ ) + PRECACHE_SOUND(pAxeHitSounds[i]); + + for( i = 0; i < ARRAYSIZE( pFireSounds ); i++ ) + PRECACHE_SOUND(pFireSounds[i]); + + for( i = 0; i < ARRAYSIZE( pAlertSounds ); i++ ) + PRECACHE_SOUND(pAlertSounds[i]); + + for( i = 0; i < ARRAYSIZE( pPainSounds ); i++ ) + PRECACHE_SOUND(pPainSounds[i]); + + for( i = 0; i < ARRAYSIZE( pAttackSounds ); i++ ) + PRECACHE_SOUND(pAttackSounds[i]); + + for( i = 0; i < ARRAYSIZE( pAxeGrabSounds ); i++ ) + PRECACHE_SOUND(pAxeGrabSounds[i]); + + for( i = 0; i < ARRAYSIZE( pThunderAttackSounds ); i++ ) + PRECACHE_SOUND(pThunderAttackSounds[i]); + + for( i = 0; i < ARRAYSIZE( pHurtSounds ); i++ ) + PRECACHE_SOUND(pHurtSounds[i]); +} + +void CDavidMonster::MonsterThink() +{ + if( !( pev->spawnflags & SF_NOELECTROCUTE ) && m_hEnemy != 0 + && m_flNextAttack < gpGlobals->time && pev->health ) + { + // thunder attack + float flDist = ( pev->origin - m_hEnemy->pev->origin ).Length2D(); + if( flDist > 128.0f ) + { + ThunderAttackSound(); + m_flNextAttack = gpGlobals->time + 9.0f; + } + } + if( pev->health <= 300 && !StartFlame) + { + EMIT_SOUND_DYN( ENT(pev), CHAN_ITEM, "davidbad/fire_ignite.wav", 1.0, ATTN_NORM, 0, PITCH_NORM ); + EMIT_SOUND_DYN( ENT(pev), CHAN_AUTO, "davidbad/fire_loop.wav", 1.0, ATTN_NORM, 0, PITCH_NORM ); + NextFlame = gpGlobals->time + 0.5f; + StartFlame = TRUE; + } + if( TurnOffFlames >= 15.0f && !HasTurnedOffFlameSound ) + { + STOP_SOUND(ENT(pev), CHAN_AUTO, "davidbad/fire_loop.wav"); + EMIT_SOUND_DYN( ENT(pev), CHAN_ITEM, "davidbad/fire_off.wav", 1.0, ATTN_NORM, 0, PITCH_NORM ); + HasTurnedOffFlameSound = TRUE; + } + if( pev->health <= 300 && NextFlame < gpGlobals->time && TurnOffFlames < 15.0f ) + { + CSprite *m_Fire = CSprite::SpriteCreate( "sprites/xffloor.spr", pev->origin + Vector( 0, 0, 72 ), TRUE ); + m_Fire->AnimateAndDie( 20.0f ); + m_Fire->SetTransparency( kRenderTransAdd, 255, 255, 255, 255, kRenderFxReflection ); + + if( NextFlameBurn < gpGlobals->time ) + { + for( int i = 1; i <= gpGlobals->maxClients; i++ ) + { + CBaseEntity *pPlayer = UTIL_PlayerByIndex( i ); + if( pPlayer && !FBitSet( pPlayer->pev->flags, FL_INWATER ) ) + { + pPlayer->TakeDamage(pev, pev, DAMAGE_YES, DMG_BURN ); + } + } + NextFlameBurn = gpGlobals->time + 1.0f; + } + NextFlame = gpGlobals->time + 0.5f; + TurnOffFlames = TurnOffFlames + 0.5f; + } + + CBaseMonster::MonsterThink(); +} + +//========================================================= +// AI Schedules Specific to this monster +//========================================================= +int CDavidMonster::IgnoreConditions ( void ) +{ + int iIgnore = CBaseMonster::IgnoreConditions(); + + if ((m_Activity == ACT_MELEE_ATTACK1) || (m_Activity == ACT_MELEE_ATTACK1)) + { +#if 0 + if (pev->health < 20) + iIgnore |= (bits_COND_LIGHT_DAMAGE|bits_COND_HEAVY_DAMAGE); + else +#endif + if (m_flNextFlinch >= gpGlobals->time) + iIgnore |= (bits_COND_LIGHT_DAMAGE|bits_COND_HEAVY_DAMAGE); + } + + if ((m_Activity == ACT_SMALL_FLINCH) || (m_Activity == ACT_BIG_FLINCH)) + { + if (m_flNextFlinch < gpGlobals->time) + m_flNextFlinch = gpGlobals->time + BADDAVID_FLINCH_DELAY; + } + + return iIgnore; +} + +class CLightningEffect : public CBaseEntity +{ +public: + void Spawn(); + void EXPORT ElectricityAttack2(); +}; + +LINK_ENTITY_TO_CLASS( lightning_effect_boss, CLightningEffect ) + +void CLightningEffect::Spawn() +{ + SetThink( &CLightningEffect::ElectricityAttack2 ); + pev->nextthink = gpGlobals->time + 1.0; +} + +void CLightningEffect::ElectricityAttack2() +{ + CBasePlayer *pPlayer = (CBasePlayer *)UTIL_FindEntityByClassname( 0, "player" ); + if( pPlayer ) + { + pPlayer->ThunderAttack(); + if( pPlayer->pev->flags & FL_ONGROUND ) + { + pPlayer->TakeDamage( pev, pev, 10, DMG_SHOCK ); + } + } + REMOVE_ENTITY(ENT(pev)); +} diff --git a/dlls/aomdc/beretta.cpp b/dlls/aomdc/beretta.cpp new file mode 100644 index 00000000..98e5dcb0 --- /dev/null +++ b/dlls/aomdc/beretta.cpp @@ -0,0 +1,211 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ + +#include "extdll.h" +#include "util.h" +#include "cbase.h" +#include "monsters.h" +#include "weapons.h" +#include "nodes.h" +#include "player.h" + +enum beretta_e { + BERETTA_IDLE1 = 0, + BERETTA_IDLE2, + BERETTA_FIRE1, + BERETTA_FIRE2, + BERETTA_FIRE_LOAD, + BERETTA_RELOAD, + BERETTA_RELOAD_EMPTY, + BERETTA_DRAW +}; + +LINK_ENTITY_TO_CLASS( weapon_beretta, CBeretta ); + +void CBeretta::Spawn( ) +{ + Precache( ); + m_iId = WEAPON_BERETTA; + SET_MODEL(ENT(pev), "models/w_beretta.mdl"); + + m_iDefaultAmmo = BERETTA_DEFAULT_GIVE; + + FallInit();// get ready to fall down. +} + + +void CBeretta::Precache( void ) +{ + PRECACHE_MODEL("models/v_beretta.mdl"); + PRECACHE_MODEL("models/w_beretta.mdl"); + PRECACHE_MODEL("models/p_9mmhandgun.mdl"); + + m_iShell = PRECACHE_MODEL ("models/shell.mdl");// brass shell + + PRECACHE_SOUND("items/9mmclip1.wav"); + PRECACHE_SOUND("items/9mmclip2.wav"); + + PRECACHE_SOUND ("weapons/ber_cockback.wav"); + PRECACHE_SOUND ("weapons/ber_cockforward.wav"); + PRECACHE_SOUND ("weapons/ber_fire.wav"); + PRECACHE_SOUND ("weapons/ber_magin.wav"); + PRECACHE_SOUND ("weapons/ber_magout.wav"); + PRECACHE_SOUND ("weapons/ber_magplace.wav"); + PRECACHE_SOUND ("weapons/ber_slideforward.wav"); + + m_usFireBeretta = PRECACHE_EVENT( 1, "events/beretta.sc" ); +} + +int CBeretta::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; +} + +int CBeretta::GetItemInfo(ItemInfo *p) +{ + p->pszName = STRING(pev->classname); + p->pszAmmo1 = "9mm"; + p->iMaxAmmo1 = BERETTA_MAX_CARRY; + p->pszAmmo2 = NULL; + p->iMaxAmmo2 = -1; + p->iMaxClip = BERETTA_MAX_CLIP; + p->iSlot = 1; + p->iPosition = 1; + p->iFlags = 0; + p->iId = m_iId = WEAPON_BERETTA; + p->iWeight = BERETTA_WEIGHT; + + return 1; +} + +BOOL CBeretta::Deploy( ) +{ + // pev->body = 1; + return DefaultDeploy( "models/v_beretta.mdl", "models/p_9mmhandgun.mdl", BERETTA_DRAW, "Beretta", /*UseDecrement() ? 1 : 0*/ 0 ); +} + +void CBeretta::PrimaryAttack( void ) +{ + float flSpread = 0.01; + + if( FBitSet( m_pPlayer->m_afButtonLast, IN_ATTACK ) ) + return; + + if( m_iClip <= 0 || (m_pPlayer->pev->waterlevel == 3 && m_pPlayer->pev->watertype > CONTENT_FLYFIELD) ) + { + PlayEmptySound(); + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15; + return; + } + + m_iClip--; + + m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH; + + int flags; + +#if defined( CLIENT_WEAPONS ) + flags = FEV_NOTHOST; +#else + flags = 0; +#endif + + // player "shoot" animation + m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); + + // non-silenced + m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME; + m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH; + + Vector vecSrc = m_pPlayer->GetGunPosition( ); + Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES ); + + Vector vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, Vector( flSpread, flSpread, flSpread ), 8192, BULLET_PLAYER_9MM, 0, gSkillData.plrDmgBeretta, m_pPlayer->pev, m_pPlayer->random_seed ); + + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usFireBeretta, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, ( m_iClip == 0 ) ? 1 : 0, 0 ); + + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.2f; + + m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); +} + + +void CBeretta::Reload( void ) +{ + int iAnim; + float fTime; + if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == BERETTA_MAX_CLIP ) + return; + + if( m_iClip ) + { + iAnim = BERETTA_RELOAD; + fTime = 2.43; + } + else + { + iAnim = BERETTA_RELOAD_EMPTY; + fTime = 2.7; + } + + DefaultReload( BERETTA_MAX_CLIP, iAnim, fTime ); +} + +void CBeretta::WeaponIdle( void ) +{ + ResetEmptySound( ); + + m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES ); + + if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) + return; + + SendWeaponAnim( BERETTA_IDLE1, 1 ); + + m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); // how long till we do this again. +} + +class CBerettaAmmo : public CBasePlayerAmmo +{ + void Spawn( void ) + { + Precache( ); + SET_MODEL(ENT(pev), "models/w_weaponclips/w_berettaclip.mdl"); + CBasePlayerAmmo::Spawn( ); + } + void Precache( void ) + { + PRECACHE_MODEL ("models/w_weaponclips/w_berettaclip.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); + } + BOOL AddAmmo( CBaseEntity *pOther ) + { + if (pOther->GiveAmmo( AMMO_BERETTACLIP_GIVE, "9mm", BERETTA_MAX_CARRY ) != -1) + { + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM); + return TRUE; + } + return FALSE; + } +}; +LINK_ENTITY_TO_CLASS( ammo_beretta, CBerettaAmmo ); + diff --git a/dlls/aomdc/deagle.cpp b/dlls/aomdc/deagle.cpp new file mode 100644 index 00000000..99774ea3 --- /dev/null +++ b/dlls/aomdc/deagle.cpp @@ -0,0 +1,206 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ + +#include "extdll.h" +#include "util.h" +#include "cbase.h" +#include "monsters.h" +#include "weapons.h" +#include "nodes.h" +#include "player.h" + +enum deagle_e { + DEAGLE_IDLE1 = 0, + DEAGLE_IDLE2, + DEAGLE_FIRE1, + DEAGLE_FIRE2, + DEAGLE_FIRE_LOAD, + DEAGLE_RELOAD, + DEAGLE_RELOAD_EMPTY, + DEAGLE_DRAW +}; + +LINK_ENTITY_TO_CLASS( weapon_deagle, CDeagle ); + +void CDeagle::Spawn( ) +{ + Precache( ); + m_iId = WEAPON_DEAGLE; + SET_MODEL(ENT(pev), "models/w_deagle.mdl"); + + m_iDefaultAmmo = DEAGLE_DEFAULT_GIVE; + + FallInit();// get ready to fall down. +} + + +void CDeagle::Precache( void ) +{ + PRECACHE_MODEL("models/v_deagle.mdl"); + PRECACHE_MODEL("models/w_deagle.mdl"); + PRECACHE_MODEL("models/p_9mmhandgun.mdl"); + + m_iShell = PRECACHE_MODEL ("models/shell.mdl");// brass shell + + PRECACHE_SOUND("items/9mmclip1.wav"); + PRECACHE_SOUND("items/9mmclip2.wav"); + + PRECACHE_SOUND ("weapons/deagle_cin2.wav"); + PRECACHE_SOUND ("weapons/deagle_cout.wav"); + PRECACHE_SOUND ("weapons/deagle_fire.wav"); + PRECACHE_SOUND ("weapons/deagle_slide.wav"); + + m_usFireDeagle = PRECACHE_EVENT( 1, "events/deagle.sc" ); +} + +int CDeagle::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; +} + +int CDeagle::GetItemInfo(ItemInfo *p) +{ + p->pszName = STRING(pev->classname); + p->pszAmmo1 = "50AE"; + p->iMaxAmmo1 = DEAGLE_MAX_CARRY; + p->pszAmmo2 = NULL; + p->iMaxAmmo2 = -1; + p->iMaxClip = DEAGLE_MAX_CLIP; + p->iSlot = 3; + p->iPosition = 1; + p->iFlags = 0; + p->iId = m_iId = WEAPON_DEAGLE; + p->iWeight = DEAGLE_WEIGHT; + + return 1; +} + +BOOL CDeagle::Deploy( ) +{ + // pev->body = 1; + return DefaultDeploy( "models/v_deagle.mdl", "models/p_9mmhandgun.mdl", DEAGLE_DRAW, "Deagle", /*UseDecrement() ? 1 : 0*/ 0 ); +} + +void CDeagle::PrimaryAttack( void ) +{ + float flSpread = 0.01; + + + if ( m_iClip <= 0 || (m_pPlayer->pev->waterlevel == 3 && m_pPlayer->pev->watertype > CONTENT_FLYFIELD) ) + { + PlayEmptySound(); + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15; + return; + } + + m_iClip--; + + m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH; + + int flags; + +#if defined( CLIENT_WEAPONS ) + flags = FEV_NOTHOST; +#else + flags = 0; +#endif + + // player "shoot" animation + m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); + + // non-silenced + m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME; + m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH; + + Vector vecSrc = m_pPlayer->GetGunPosition( ); + Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES ); + + Vector vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, Vector( flSpread, flSpread, flSpread ), 8192, BULLET_PLAYER_9MM, 0, gSkillData.plrDmgDeagle, m_pPlayer->pev, m_pPlayer->random_seed ); + + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usFireDeagle, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, ( m_iClip == 0 ) ? 1 : 0, 0 ); + + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.7f; + + m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); +} + + +void CDeagle::Reload( void ) +{ + int iAnim; + float fTime; + if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == DEAGLE_MAX_CLIP ) + return; + + if( m_iClip ) + { + iAnim = DEAGLE_RELOAD; + fTime = 2.43; + } + else + { + iAnim = DEAGLE_RELOAD_EMPTY; + fTime = 2.7; + } + DefaultReload( DEAGLE_MAX_CLIP, iAnim, fTime ); +} + + + +void CDeagle::WeaponIdle( void ) +{ + ResetEmptySound( ); + + m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES ); + + if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) + return; + + SendWeaponAnim( DEAGLE_IDLE1, 1 ); + + m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); // how long till we do this again. +} + +class CDeagleAmmo : public CBasePlayerAmmo +{ + void Spawn( void ) + { + Precache( ); + SET_MODEL(ENT(pev), "models/w_weaponclips/w_deagleclip.mdl"); + CBasePlayerAmmo::Spawn( ); + } + void Precache( void ) + { + PRECACHE_MODEL ("models/w_weaponclips/w_deagleclip.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); + } + BOOL AddAmmo( CBaseEntity *pOther ) + { + if (pOther->GiveAmmo( AMMO_DEAGLECLIP_GIVE, "50AE", DEAGLE_MAX_CARRY ) != -1) + { + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM); + return TRUE; + } + return FALSE; + } +}; +LINK_ENTITY_TO_CLASS( ammo_deagle, CDeagleAmmo ); diff --git a/dlls/aomdc/ghost.cpp b/dlls/aomdc/ghost.cpp new file mode 100644 index 00000000..d9df09b5 --- /dev/null +++ b/dlls/aomdc/ghost.cpp @@ -0,0 +1,171 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* This source code contains proprietary and confidential information of +* Valve LLC and its suppliers. Access to this code is restricted to +* persons who have executed a written SDK license with Valve. Any access, +* use or distribution of this code by or to any unlicensed person is illegal. +* +****/ +//========================================================= +// Spider ghost monster +//========================================================= + +#include "zombie.h" +#include "shake.h" + +//========================================================= +// Monster's Anim Events Go Here +//========================================================= +#define GHOST_AE_CLAW1 ( 1 ) +#define GHOST_AE_CLAW2 ( 2 ) +#define GHOST_AE_CLAW3 ( 3 ) + +class CGhost : public CZombie +{ +public: + void Spawn( void ); + void Precache( void ); + void HandleAnimEvent( MonsterEvent_t *pEvent ); + + void PainSound( void ); + void AlertSound( void ); + void IdleSound( void ); + void AttackSound( void ); + void DeathSound( void ); + + static const char *pAlertSounds[]; + static const char *pDeathSounds[]; +}; + +LINK_ENTITY_TO_CLASS( monster_ghost, CGhost ); + +const char *CGhost::pAlertSounds[] = +{ + "aslave/slv_alert1.wav", + "aslave/slv_alert2.wav", + "aslave/slv_alert3.wav", + "aslave/slv_alert4.wav" +}; + +const char *CGhost::pDeathSounds[] = +{ + "aslave/slv_die1.wav", + "aslave/slv_die2.wav", +}; + +void CGhost :: PainSound( void ) +{ +} + +void CGhost :: AlertSound( void ) +{ + int pitch = PITCH_LOW + RANDOM_LONG(0,9); + + EMIT_SOUND_DYN ( ENT(pev), CHAN_VOICE, pAlertSounds[ RANDOM_LONG(0,ARRAYSIZE(pAlertSounds)-1) ], 1.0, ATTN_NORM, 0, pitch ); +} + +void CGhost :: IdleSound( void ) +{ +} + +void CGhost :: AttackSound( void ) +{ +} + +//========================================================= +// DieSound +//========================================================= +void CGhost :: DeathSound( void ) +{ + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pDeathSounds[ RANDOM_LONG(0,ARRAYSIZE(pDeathSounds)-1) ], 1.0, ATTN_NORM, 0, PITCH_LOW + RANDOM_LONG(0,9) ); +} + +//========================================================= +// HandleAnimEvent - catches the monster-specific messages +// that occur when tagged animation frames are played. +//========================================================= +void CGhost :: HandleAnimEvent( MonsterEvent_t *pEvent ) +{ + switch( pEvent->event ) + { + case GHOST_AE_CLAW1: + case GHOST_AE_CLAW2: + case GHOST_AE_CLAW3: + { + if (m_flNextAttack < gpGlobals->time) + { + CBaseEntity *pHurt = CheckTraceHullAttack( 70, gSkillData.slaveDmgClaw, DMG_POISON ); + if ( pHurt ) + { + if ( pHurt->pev->flags & (FL_MONSTER|FL_CLIENT) ) + { + UTIL_ScreenFade( pHurt, Vector( 255, 0, 0 ), 1.0, 11.0, 100, FFADE_IN ); + EMIT_SOUND( ENT( pHurt->pev), CHAN_ITEM, "ghost/ear_ringing.wav", 1.0, ATTN_NORM ); + m_flNextAttack = gpGlobals->time + 12.0f; + } + } + } + } + break; + default: + CBaseMonster::HandleAnimEvent( pEvent ); + break; + } +} + +//========================================================= +// Spawn +//========================================================= +void CGhost :: Spawn() +{ + Precache( ); + + if (pev->model) + SET_MODEL(ENT(pev), STRING(pev->model)); //LRC + else + SET_MODEL(ENT(pev), "models/ghost.mdl"); + UTIL_SetSize( pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX ); + + pev->solid = SOLID_SLIDEBOX; + pev->movetype = MOVETYPE_STEP; + m_bloodColor = BLOOD_COLOR_RED; + if (pev->health == 0) + pev->health = gSkillData.slaveHealth; + pev->view_ofs = VEC_VIEW;// position of the eyes relative to monster's origin. + m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result ) + m_MonsterState = MONSTERSTATE_NONE; + m_afCapability = bits_CAP_DOORS_GROUP; + + MonsterInit(); +} + +//========================================================= +// Precache - precaches all resources this monster needs +//========================================================= +void CGhost :: Precache() +{ + int i; + + if (pev->model) + PRECACHE_MODEL((char*)STRING(pev->model)); //LRC + else + PRECACHE_MODEL("models/ghost.mdl"); + + PRECACHE_SOUND("ghost/ear_ringing.wav"); + + for ( i = 0; i < ARRAYSIZE( pAlertSounds ); i++ ) + PRECACHE_SOUND((char *)pAlertSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pDeathSounds ); i++ ) + PRECACHE_SOUND((char *)pDeathSounds[i]); +} + +//========================================================= +// AI Schedules Specific to this monster +//========================================================= diff --git a/dlls/aomdc/glock.cpp b/dlls/aomdc/glock.cpp new file mode 100644 index 00000000..3a5cd6ad --- /dev/null +++ b/dlls/aomdc/glock.cpp @@ -0,0 +1,224 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ + +#include "extdll.h" +#include "util.h" +#include "cbase.h" +#include "monsters.h" +#include "weapons.h" +#include "nodes.h" +#include "player.h" + +enum glock_e { + GLOCK_IDLE1 = 0, + GLOCK_IDLE2, + GLOCK_FIRE1, + GLOCK_FIRE2, + GLOCK_FIRE_LOAD, + GLOCK_RELOAD, + GLOCK_RELOAD_EMPTY, + GLOCK_DRAW +}; + +LINK_ENTITY_TO_CLASS( weapon_glock, CGlock ); +LINK_ENTITY_TO_CLASS( weapon_9mmhandgun, CGlock ); + +void CGlock::Spawn( ) +{ + Precache( ); + m_iId = WEAPON_GLOCK; + SET_MODEL(ENT(pev), "models/w_glock.mdl"); + + m_iDefaultAmmo = GLOCK_DEFAULT_GIVE; + + FallInit();// get ready to fall down. +} + + +void CGlock::Precache( void ) +{ + PRECACHE_MODEL("models/v_glock.mdl"); + PRECACHE_MODEL("models/w_glock.mdl"); + PRECACHE_MODEL("models/p_9mmhandgun.mdl"); + + m_iShell = PRECACHE_MODEL ("models/shell.mdl");// brass shell + + PRECACHE_SOUND("items/9mmclip1.wav"); + PRECACHE_SOUND("items/9mmclip2.wav"); + + PRECACHE_SOUND ("weapons/glock_clipin.wav"); + PRECACHE_SOUND ("weapons/glock_clipout.wav"); + PRECACHE_SOUND ("weapons/glock_fire.wav"); + PRECACHE_SOUND ("weapons/glock_magin.wav"); + PRECACHE_SOUND ("weapons/glock_magout.wav"); + PRECACHE_SOUND ("weapons/glock_slide.wav"); + PRECACHE_SOUND ("weapons/glock_slideforward.wav"); + + m_usFireGlock1 = PRECACHE_EVENT( 1, "events/glock21.sc" ); + m_usFireGlock2 = PRECACHE_EVENT( 1, "events/glock22.sc" ); +} + +int CGlock::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; +} + +int CGlock::GetItemInfo(ItemInfo *p) +{ + p->pszName = STRING(pev->classname); + p->pszAmmo1 = "9mm"; + p->iMaxAmmo1 = GLOCK_MAX_CARRY; + p->pszAmmo2 = NULL; + p->iMaxAmmo2 = -1; + p->iMaxClip = GLOCK_MAX_CLIP; + p->iSlot = 1; + p->iPosition = 2; + p->iFlags = 0; + p->iId = m_iId = WEAPON_GLOCK; + p->iWeight = GLOCK_WEIGHT; + + return 1; +} + +BOOL CGlock::Deploy( ) +{ + // pev->body = 1; + return DefaultDeploy( "models/v_glock.mdl", "models/p_9mmhandgun.mdl", GLOCK_DRAW, "Glock", /*UseDecrement() ? 1 : 0*/ 0 ); +} + +void CGlock::SecondaryAttack( void ) +{ + GlockFire( 0.01, 0.06, TRUE ); +} + +void CGlock::PrimaryAttack( void ) +{ + GlockFire( 0.01, 0.2, FALSE ); +} + +void CGlock::GlockFire( float flSpread, float flCycleTime, BOOL fUseBurst ) +{ + if( !fUseBurst ) + { + if( FBitSet( m_pPlayer->m_afButtonLast, IN_ATTACK ) ) + return; + } + + if( m_iClip <= 0 || (m_pPlayer->pev->waterlevel == 3 && m_pPlayer->pev->watertype > CONTENT_FLYFIELD) ) + { + PlayEmptySound(); + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15; + return; + } + + m_iClip--; + + m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH; + + int flags; + +#if defined( CLIENT_WEAPONS ) + flags = FEV_NOTHOST; +#else + flags = 0; +#endif + + // player "shoot" animation + m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); + + // non-silenced + m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME; + m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH; + + Vector vecSrc = m_pPlayer->GetGunPosition( ); + Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES ); + + Vector vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, Vector( flSpread, flSpread, flSpread ), 8192, BULLET_PLAYER_9MM, 0, !fUseBurst ? gSkillData.plrDmgGlock : 0, m_pPlayer->pev, m_pPlayer->random_seed ); + + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), !fUseBurst ? m_usFireGlock1 : m_usFireGlock2, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, ( m_iClip == 0 ) ? 1 : 0, 0 ); + + m_flNextPrimaryAttack = m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + flCycleTime; + + m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); +} + + +void CGlock::Reload( void ) +{ + int iAnim; + float fTime; + + if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == GLOCK_MAX_CLIP ) + return; + + if( m_iClip ) + { + iAnim = GLOCK_RELOAD; + fTime = 1.93; + } + else + { + iAnim = GLOCK_RELOAD_EMPTY; + fTime = 2.1; + } + DefaultReload( GLOCK_MAX_CLIP, iAnim, fTime ); +} + +void CGlock::WeaponIdle( void ) +{ + ResetEmptySound( ); + + m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES ); + + if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) + return; + + SendWeaponAnim( GLOCK_IDLE1, 1 ); + + m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); // how long till we do this again. +} + +class CGlockAmmo : public CBasePlayerAmmo +{ + void Spawn( void ) + { + Precache( ); + SET_MODEL(ENT(pev), "models/w_weaponclips/w_glockclip.mdl"); + CBasePlayerAmmo::Spawn( ); + } + void Precache( void ) + { + PRECACHE_MODEL ("models/w_weaponclips/w_glockclip.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); + } + BOOL AddAmmo( CBaseEntity *pOther ) + { + if (pOther->GiveAmmo( AMMO_GLOCKCLIP_GIVE, "9mm", GLOCK_MAX_CARRY ) != -1) + { + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM); + return TRUE; + } + return FALSE; + } +}; +LINK_ENTITY_TO_CLASS( ammo_glock, CGlockAmmo ); +LINK_ENTITY_TO_CLASS( ammo_9mmclip, CGlockAmmo ); diff --git a/dlls/aomdc/gmgeneral.cpp b/dlls/aomdc/gmgeneral.cpp new file mode 100644 index 00000000..c4abfbab --- /dev/null +++ b/dlls/aomdc/gmgeneral.cpp @@ -0,0 +1,212 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ + +#include "extdll.h" +#include "util.h" +#include "cbase.h" +#include "monsters.h" +#include "weapons.h" +#include "nodes.h" +#include "player.h" +#include "soundent.h" +#include "gamerules.h" + +enum gmgeneral_e +{ + GMGENERAL_IDLE, + GMGENERAL_FIRE1, + GMGENERAL_FIRE2, + GMGENERAL_RELOAD, + GMGENERAL_DRAW +}; + + +LINK_ENTITY_TO_CLASS( weapon_gmgeneral, CGMGeneral ); + + +//========================================================= +//========================================================= +void CGMGeneral::Spawn( ) +{ + Precache( ); + SET_MODEL(ENT(pev), "models/gmgeneral_around.aomdc"); + m_iId = WEAPON_GMGENERAL; + + m_iDefaultAmmo = GMGENERAL_DEFAULT_GIVE; + + FallInit();// get ready to fall down. +} + + +void CGMGeneral::Precache( void ) +{ + PRECACHE_MODEL("models/gmgeneral_display.aomdc"); + PRECACHE_MODEL("models/gmgeneral_around.aomdc"); + PRECACHE_MODEL("models/p_9mmAR.mdl"); + + m_iShell = PRECACHE_MODEL ("models/shell.mdl");// brass shellTE_MODEL + + PRECACHE_SOUND("gmgeneral/gm_expell.wav"); + PRECACHE_SOUND("gmgeneral/gm_fov.wav"); + + PRECACHE_SOUND("items/9mmclip1.wav"); + + PRECACHE_SOUND("items/clipinsert1.wav"); + PRECACHE_SOUND("items/cliprelease1.wav"); + + PRECACHE_SOUND ("weapons/357_cock1.wav"); + + m_usGMGeneral = PRECACHE_EVENT( 1, "events/mp5k2.sc" ); +} + +int CGMGeneral::GetItemInfo(ItemInfo *p) +{ + p->pszName = STRING(pev->classname); + p->pszAmmo1 = NULL; + p->iMaxAmmo1 = GMGENERAL_MAX_CARRY; + p->pszAmmo2 = NULL; + p->iMaxAmmo2 = -1; + p->iMaxClip = GMGENERAL_MAX_CLIP; + p->iSlot = 2; + p->iPosition = 3; + p->iFlags = 0; + p->iId = m_iId = WEAPON_GMGENERAL; + p->iWeight = GMGENERAL_WEIGHT; + + return 1; +} + +int CGMGeneral::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; +} + +BOOL CGMGeneral::Deploy( ) +{ + return DefaultDeploy( "models/gmgeneral_display.aomdc", "models/p_9mmAR.mdl", GMGENERAL_DRAW, "L85 Spec Wep" ); +} + +void CGMGeneral::Holster( int skiplocal /* = 0 */ ) +{ + if( m_fInZoom ) + SecondaryAttack(); +} + +void CGMGeneral::PrimaryAttack() +{ + // don't fire underwater + if (m_pPlayer->pev->waterlevel == 3 && m_pPlayer->pev->watertype > CONTENT_FLYFIELD) + { + PlayEmptySound( ); + m_flNextPrimaryAttack = 0.15; + return; + } + + m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME; + m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH; + + m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH; + + // player "shoot" animation + m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); + + Vector vecSrc = m_pPlayer->GetGunPosition( ); + Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); + Vector vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, VECTOR_CONE_3DEGREES, 8192, BULLET_PLAYER_MP5, 2, gSkillData.plrDmgMP5K, m_pPlayer->pev, m_pPlayer->random_seed ); + + int flags; +#if defined( CLIENT_WEAPONS ) + flags = FEV_NOTHOST; +#else + flags = 0; +#endif + + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usGMGeneral, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 ); + + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.07; + + if ( m_flNextPrimaryAttack < UTIL_WeaponTimeBase() ) + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.07; + + m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); +} + +void CGMGeneral::SecondaryAttack() +{ + if ( m_pPlayer->pev->fov != 0 ) + { + m_fInZoom = FALSE; + m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 0; // 0 means reset to default fov + } + else if ( m_pPlayer->pev->fov != 20 ) + { + m_fInZoom = TRUE; + m_pPlayer->pev->fov = m_pPlayer->m_iFOV = 20; + } + + EMIT_SOUND(ENT(pev), CHAN_ITEM, "gmgeneral/gm_fov.wav", 1, ATTN_NORM); + m_flNextPrimaryAttack = m_flNextSecondaryAttack = 0.4; +} + +void CGMGeneral::Reload( void ) +{ + DefaultReload( GMGENERAL_MAX_CLIP, GMGENERAL_RELOAD, 2.63 ); +} + +void CGMGeneral::WeaponIdle( void ) +{ + ResetEmptySound( ); + + m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); + + if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) + return; + + SendWeaponAnim( GMGENERAL_IDLE ); + + m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); +} + +class CGMGeneralAmmoClip : public CBasePlayerAmmo +{ + void Spawn( void ) + { + Precache( ); + SET_MODEL(ENT(pev), "models/gmgeneral_around.aomdc"); + CBasePlayerAmmo::Spawn( ); + } + void Precache( void ) + { + PRECACHE_MODEL ("models/gmgeneral_around.aomdc"); + PRECACHE_SOUND("items/9mmclip1.wav"); + } + BOOL AddAmmo( CBaseEntity *pOther ) + { + int bResult = (pOther->GiveAmmo( AMMO_GMGENERALCLIP_GIVE, "", GMGENERAL_MAX_CARRY) != -1); + if (bResult) + { + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM); + } + return bResult; + } +}; +LINK_ENTITY_TO_CLASS( ammo_gmgeneral, CGMGeneralAmmoClip ); diff --git a/dlls/aomdc/hammer.cpp b/dlls/aomdc/hammer.cpp new file mode 100644 index 00000000..d15b348f --- /dev/null +++ b/dlls/aomdc/hammer.cpp @@ -0,0 +1,239 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ + +#include "extdll.h" +#include "util.h" +#include "cbase.h" +#include "monsters.h" +#include "weapons.h" +#include "nodes.h" +#include "player.h" +#include "gamerules.h" + + +#define CROWBAR_BODYHIT_VOLUME 128 +#define CROWBAR_WALLHIT_VOLUME 512 + +LINK_ENTITY_TO_CLASS( weapon_hammer, CHammer ); + + + +enum hammer_e { + HAMMER_IDLE = 0, + HAMMER_WHACK, + HAMMER_DRAW +}; + + +void CHammer::Spawn( ) +{ + Precache( ); + m_iId = WEAPON_HAMMER; + SET_MODEL(ENT(pev), "models/w_hammer.mdl"); + m_iClip = -1; + + FallInit();// get ready to fall down. +} + + +void CHammer::Precache( void ) +{ + PRECACHE_MODEL("models/v_hammer.mdl"); + PRECACHE_MODEL("models/w_hammer.mdl"); + PRECACHE_MODEL("models/p_crowbar.mdl"); + PRECACHE_SOUND("weapons/hammer_hit.wav"); + PRECACHE_SOUND("weapons/hammer_hitbody.wav"); + PRECACHE_SOUND("weapons/hammer_swing.wav"); + + m_usHammer = PRECACHE_EVENT ( 1, "events/hammer.sc" ); +} + +int CHammer::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; +} + +int CHammer::GetItemInfo(ItemInfo *p) +{ + p->pszName = STRING(pev->classname); + p->pszAmmo1 = NULL; + p->iMaxAmmo1 = -1; + p->pszAmmo2 = NULL; + p->iMaxAmmo2 = -1; + p->iMaxClip = WEAPON_NOCLIP; + p->iSlot = 0; + p->iPosition = 3; + p->iId = WEAPON_HAMMER; + p->iWeight = HAMMER_WEIGHT; + return 1; +} + +BOOL CHammer::Deploy( ) +{ + return DefaultDeploy( "models/v_hammer.mdl", "models/p_crowbar.mdl", HAMMER_DRAW, "Hammer" ); +} + +void FindHullIntersection(const Vector &vecSrc, TraceResult &tr, float *mins, float *maxs, edict_t *pEntity); +/* +void FindHullIntersection( const Vector &vecSrc, TraceResult &tr, float *mins, float *maxs, edict_t *pEntity ) +{ + int i, j, k; + float distance; + float *minmaxs[2] = {mins, maxs}; + TraceResult tmpTrace; + Vector vecHullEnd = tr.vecEndPos; + Vector vecEnd; + + distance = 1e6f; + + vecHullEnd = vecSrc + ((vecHullEnd - vecSrc)*2); + UTIL_TraceLine( vecSrc, vecHullEnd, dont_ignore_monsters, pEntity, &tmpTrace ); + if ( tmpTrace.flFraction < 1.0 ) + { + tr = tmpTrace; + return; + } + + for ( i = 0; i < 2; i++ ) + { + for ( j = 0; j < 2; j++ ) + { + for ( k = 0; k < 2; k++ ) + { + vecEnd.x = vecHullEnd.x + minmaxs[i][0]; + vecEnd.y = vecHullEnd.y + minmaxs[j][1]; + vecEnd.z = vecHullEnd.z + minmaxs[k][2]; + + UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, pEntity, &tmpTrace ); + if ( tmpTrace.flFraction < 1.0 ) + { + float thisDistance = (tmpTrace.vecEndPos - vecSrc).Length(); + if ( thisDistance < distance ) + { + tr = tmpTrace; + distance = thisDistance; + } + } + } + } + } +} +*/ + +void CHammer::PrimaryAttack() +{ + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.7f; + SendWeaponAnim( HAMMER_WHACK ); +#ifndef CLIENT_DLL + SetThink( &CHammer::BigWhackThink ); + pev->nextthink = gpGlobals->time + 0.45; +#endif +} + +void CHammer::BigWhackThink() +{ + TraceResult tr; + + UTIL_MakeVectors (m_pPlayer->pev->v_angle); + Vector vecSrc = m_pPlayer->GetGunPosition( ); + Vector vecEnd = vecSrc + gpGlobals->v_forward * 32; + + UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr ); + +#ifndef CLIENT_DLL + if ( tr.flFraction >= 1.0 ) + { + UTIL_TraceHull( vecSrc, vecEnd, dont_ignore_monsters, head_hull, ENT( m_pPlayer->pev ), &tr ); + if ( tr.flFraction < 1.0 ) + { + // Calculate the point of intersection of the line (or hull) and the object we hit + // This is and approximation of the "best" intersection + CBaseEntity *pHit = CBaseEntity::Instance( tr.pHit ); + if ( !pHit || pHit->IsBSPModel() ) + FindHullIntersection( vecSrc, tr, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX, m_pPlayer->edict() ); + vecEnd = tr.vecEndPos; // This is the point on the actual surface (the hull could have hit space) + } + } +#endif + PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usHammer, + 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, + 0.0, 0, 0.0 ); + + if ( tr.flFraction < 1.0 ) + { + // player "shoot" animation + m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); + +#ifndef CLIENT_DLL + // hit + CBaseEntity *pEntity = CBaseEntity::Instance(tr.pHit); + + // play thwack, smack, or dong sound + float flVol = 1.0; + int fHitWorld = TRUE; + + UTIL_ScreenShake( m_pPlayer->pev->origin, 5.0, 1.0, 0.7, 0.25 ); + + if (pEntity) + { + ClearMultiDamage(); + pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgHammer, gpGlobals->v_forward, &tr, DMG_CRUSH ); + ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev ); + + if ( pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE ) + { + // play thwack or smack sound + EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/hammer_hitbody.wav", 1, ATTN_NORM); + m_pPlayer->m_iWeaponVolume = CROWBAR_BODYHIT_VOLUME; + flVol = 0.1; + + fHitWorld = FALSE; + } + } + + // play texture hit sound + // UNDONE: Calculate the correct point of intersection when we hit with the hull instead of the line + + if (fHitWorld) + { + float fvolbar = TEXTURETYPE_PlaySound(&tr, vecSrc, vecSrc + (vecEnd-vecSrc)*2, BULLET_PLAYER_CROWBAR); + + if ( g_pGameRules->IsMultiplayer() ) + { + // override the volume here, cause we don't play texture sounds in multiplayer, + // and fvolbar is going to be 0 from the above call. + + fvolbar = 1; + } + + // also play hammer strike + EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/hammer_hit.wav", fvolbar, ATTN_NORM); + + // delay the decal a bit + m_trHit = tr; + } + + m_pPlayer->m_iWeaponVolume = flVol * CROWBAR_WALLHIT_VOLUME; +#endif + DecalGunshot( &m_trHit, BULLET_PLAYER_CROWBAR ); + } +} diff --git a/dlls/aomdc/knife.cpp b/dlls/aomdc/knife.cpp new file mode 100644 index 00000000..313ef1fe --- /dev/null +++ b/dlls/aomdc/knife.cpp @@ -0,0 +1,315 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ + +#include "extdll.h" +#include "util.h" +#include "cbase.h" +#include "monsters.h" +#include "weapons.h" +#include "nodes.h" +#include "player.h" +#include "gamerules.h" + + +#define CROWBAR_BODYHIT_VOLUME 128 +#define CROWBAR_WALLHIT_VOLUME 512 + +LINK_ENTITY_TO_CLASS( weapon_knife, CKnife ); + + + +enum knife_e { + KNIFE_IDLE = 0, + KNIFE_DRAW, + KNIFE_HOLSTER, + KNIFE_SLASH1, + KNIFE_SLASH2 +}; + + +void CKnife::Spawn( ) +{ + Precache( ); + m_iId = WEAPON_KNIFE; + SET_MODEL(ENT(pev), "models/w_kitchenknife.mdl"); + m_iClip = -1; + + FallInit();// get ready to fall down. +} + + +void CKnife::Precache( void ) +{ + PRECACHE_MODEL("models/v_kitchenknife.mdl"); + PRECACHE_MODEL("models/w_kitchenknife.mdl"); + PRECACHE_MODEL("models/p_crowbar.mdl"); + PRECACHE_SOUND("weapons/knife_hit1.wav"); + PRECACHE_SOUND("weapons/knife_hit2.wav"); + PRECACHE_SOUND("weapons/knife_wall1.wav"); + PRECACHE_SOUND("weapons/knife_wall2.wav"); + PRECACHE_SOUND("weapons/knife_swing1.wav"); + + m_usKnife = PRECACHE_EVENT ( 1, "events/knife.sc" ); +} + +int CKnife::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; +} + +int CKnife::GetItemInfo(ItemInfo *p) +{ + p->pszName = STRING(pev->classname); + p->pszAmmo1 = NULL; + p->iMaxAmmo1 = -1; + p->pszAmmo2 = NULL; + p->iMaxAmmo2 = -1; + p->iMaxClip = WEAPON_NOCLIP; + p->iSlot = 0; + p->iPosition = 1; + p->iId = WEAPON_KNIFE; + p->iWeight = KNIFE_WEIGHT; + return 1; +} + + + +BOOL CKnife::Deploy( ) +{ + return DefaultDeploy( "models/v_kitchenknife.mdl", "models/p_crowbar.mdl", KNIFE_DRAW, "Knife" ); +} + +void CKnife::Holster( int skiplocal /* = 0 */ ) +{ + m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5; + SendWeaponAnim( KNIFE_HOLSTER ); +} + + +void FindHullIntersection( const Vector &vecSrc, TraceResult &tr, float *mins, float *maxs, edict_t *pEntity ) +{ + int i, j, k; + float distance; + float *minmaxs[2] = {mins, maxs}; + TraceResult tmpTrace; + Vector vecHullEnd = tr.vecEndPos; + Vector vecEnd; + + distance = 1e6f; + + vecHullEnd = vecSrc + ((vecHullEnd - vecSrc)*2); + UTIL_TraceLine( vecSrc, vecHullEnd, dont_ignore_monsters, pEntity, &tmpTrace ); + if ( tmpTrace.flFraction < 1.0 ) + { + tr = tmpTrace; + return; + } + + for ( i = 0; i < 2; i++ ) + { + for ( j = 0; j < 2; j++ ) + { + for ( k = 0; k < 2; k++ ) + { + vecEnd.x = vecHullEnd.x + minmaxs[i][0]; + vecEnd.y = vecHullEnd.y + minmaxs[j][1]; + vecEnd.z = vecHullEnd.z + minmaxs[k][2]; + + UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, pEntity, &tmpTrace ); + if ( tmpTrace.flFraction < 1.0 ) + { + float thisDistance = (tmpTrace.vecEndPos - vecSrc).Length(); + if ( thisDistance < distance ) + { + tr = tmpTrace; + distance = thisDistance; + } + } + } + } + } +} + + +void CKnife::PrimaryAttack() +{ + if (! Swing( 1 )) + { +#ifndef CLIENT_DLL + SetThink(&CKnife:: SwingAgain ); + SetNextThink( 0.1 ); +#endif + } +} + + +void CKnife::Smack( ) +{ + DecalGunshot( &m_trHit, BULLET_PLAYER_CROWBAR ); +} + + +void CKnife::SwingAgain( void ) +{ + Swing( 0 ); +} + + +int CKnife::Swing( int fFirst ) +{ + int fDidHit = FALSE; + + TraceResult tr; + + UTIL_MakeVectors (m_pPlayer->pev->v_angle); + Vector vecSrc = m_pPlayer->GetGunPosition( ); + Vector vecEnd = vecSrc + gpGlobals->v_forward * 32; + + UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr ); + +#ifndef CLIENT_DLL + if ( tr.flFraction >= 1.0 ) + { + UTIL_TraceHull( vecSrc, vecEnd, dont_ignore_monsters, head_hull, ENT( m_pPlayer->pev ), &tr ); + if ( tr.flFraction < 1.0 ) + { + // Calculate the point of intersection of the line (or hull) and the object we hit + // This is and approximation of the "best" intersection + CBaseEntity *pHit = CBaseEntity::Instance( tr.pHit ); + if ( !pHit || pHit->IsBSPModel() ) + FindHullIntersection( vecSrc, tr, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX, m_pPlayer->edict() ); + vecEnd = tr.vecEndPos; // This is the point on the actual surface (the hull could have hit space) + } + } +#endif + + PLAYBACK_EVENT_FULL( FEV_NOTHOST, m_pPlayer->edict(), m_usKnife, + 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, + 0.0, 0, 0.0 ); + + + if ( tr.flFraction >= 1.0 ) + { + if (fFirst) + { + // miss + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5; + + // player "shoot" animation + m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); + } + } + else + { + switch( (m_iSwing++) % 2 ) + { + case 0: + SendWeaponAnim( KNIFE_SLASH1 ); break; + case 1: + SendWeaponAnim( KNIFE_SLASH2 ); break; + } + + // player "shoot" animation + m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); + +#ifndef CLIENT_DLL + + // hit + fDidHit = TRUE; + CBaseEntity *pEntity = CBaseEntity::Instance(tr.pHit); + + // play thwack, smack, or dong sound + float flVol = 1.0; + int fHitWorld = TRUE; + + if (pEntity) + { + ClearMultiDamage( ); + + pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgKnife, gpGlobals->v_forward, &tr, DMG_CLUB ); + + ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev ); + + if ( pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE ) + { + // play thwack or smack sound + switch( RANDOM_LONG(0,1) ) + { + case 0: + EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/knife_hitwall1.wav", 1, ATTN_NORM); break; + case 1: + EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/knife_hitwall2.wav", 1, ATTN_NORM); break; + } + m_pPlayer->m_iWeaponVolume = CROWBAR_BODYHIT_VOLUME; + if ( !pEntity->IsAlive() ) + { + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.25; //LRC: corrected half-life bug + return TRUE; + } + else + flVol = 0.1; + + fHitWorld = FALSE; + } + } + + // play texture hit sound + // UNDONE: Calculate the correct point of intersection when we hit with the hull instead of the line + + if (fHitWorld) + { + float fvolbar = TEXTURETYPE_PlaySound(&tr, vecSrc, vecSrc + (vecEnd-vecSrc)*2, BULLET_PLAYER_CROWBAR); + + if ( g_pGameRules->IsMultiplayer() ) + { + // override the volume here, cause we don't play texture sounds in multiplayer, + // and fvolbar is going to be 0 from the above call. + + fvolbar = 1; + } + + // also play knife strike + switch( RANDOM_LONG(0,1) ) + { + case 0: + EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/knife_hit1.wav", fvolbar, ATTN_NORM); + break; + case 1: + EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/knife_hit2.wav", fvolbar, ATTN_NORM); + break; + } + + // delay the decal a bit + m_trHit = tr; + } + + m_pPlayer->m_iWeaponVolume = flVol * CROWBAR_WALLHIT_VOLUME; + + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5; + + SetThink(&CKnife:: Smack ); + SetNextThink( 0.2 ); +#endif + + } + return fDidHit; +} diff --git a/dlls/aomdc/mp5k.cpp b/dlls/aomdc/mp5k.cpp new file mode 100644 index 00000000..44574456 --- /dev/null +++ b/dlls/aomdc/mp5k.cpp @@ -0,0 +1,213 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ + +#include "extdll.h" +#include "util.h" +#include "cbase.h" +#include "monsters.h" +#include "weapons.h" +#include "nodes.h" +#include "player.h" +#include "soundent.h" +#include "gamerules.h" + +enum mp5_e +{ + MP5K_IDLE = 0, + MP5K_FIDGET, + MP5K_FIRE1, + MP5K_FIRE2, + MP5K_RELOAD, + MP5K_DRAW +}; + + + +LINK_ENTITY_TO_CLASS( weapon_mp5k, CMP5K ); + +//========================================================= +//========================================================= +void CMP5K::Spawn( ) +{ + Precache( ); + SET_MODEL(ENT(pev), "models/w_mp5k.mdl"); + m_iId = WEAPON_MP5K; + + m_iDefaultAmmo = MP5K_DEFAULT_GIVE; + + FallInit();// get ready to fall down. +} + + +void CMP5K::Precache( void ) +{ + PRECACHE_MODEL("models/v_mp5k.mdl"); + PRECACHE_MODEL("models/w_mp5k.mdl"); + PRECACHE_MODEL("models/p_9mmAR.mdl"); + + m_iShell = PRECACHE_MODEL ("models/shell.mdl");// brass shellTE_MODEL + + PRECACHE_MODEL("models/w_9mmARclip.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); + + PRECACHE_SOUND("items/clipinsert1.wav"); + PRECACHE_SOUND("items/cliprelease1.wav"); + + PRECACHE_SOUND ("weapons/mp5k_boltback.wav"); + PRECACHE_SOUND ("weapons/mp5k_boltforward.wav"); + PRECACHE_SOUND ("weapons/mp5k_fire.wav"); + PRECACHE_SOUND ("weapons/mp5k_magin.wav"); + PRECACHE_SOUND ("weapons/mp5k_magout.wav"); + + PRECACHE_SOUND ("weapons/357_cock1.wav"); + + m_usMP5k = PRECACHE_EVENT( 1, "events/mp5k.sc" ); +} + +int CMP5K::GetItemInfo(ItemInfo *p) +{ + p->pszName = STRING(pev->classname); + p->pszAmmo1 = "9mmar"; + p->iMaxAmmo1 = MP5K_MAX_CARRY; + p->pszAmmo2 = NULL; + p->iMaxAmmo2 = -1; + p->iMaxClip = MP5K_MAX_CLIP; + p->iSlot = 2; + p->iPosition = 0; + p->iFlags = 0; + p->iId = m_iId = WEAPON_MP5K; + p->iWeight = MP5K_WEIGHT; + + return 1; +} + +int CMP5K::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; +} + +BOOL CMP5K::Deploy( ) +{ + return DefaultDeploy( "models/v_mp5k.mdl", "models/p_9mmAR.mdl", MP5K_DRAW, "MP5k" ); +} + + +void CMP5K::PrimaryAttack() +{ + // don't fire underwater + if (m_pPlayer->pev->waterlevel == 3 && m_pPlayer->pev->watertype > CONTENT_FLYFIELD) + { + PlayEmptySound( ); + m_flNextPrimaryAttack = 0.15; + return; + } + + if (m_iClip <= 0) + { + PlayEmptySound(); + m_flNextPrimaryAttack = 0.15; + return; + } + + m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME; + m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH; + + m_iClip--; + + + m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH; + + // player "shoot" animation + m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); + + Vector vecSrc = m_pPlayer->GetGunPosition( ); + Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); + Vector vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, VECTOR_CONE_3DEGREES, 8192, BULLET_PLAYER_MP5, 2, gSkillData.plrDmgMP5K, m_pPlayer->pev, m_pPlayer->random_seed ); + + int flags; +#if defined( CLIENT_WEAPONS ) + flags = FEV_NOTHOST; +#else + flags = 0; +#endif + + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usMP5k, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 ); + + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.06; + + if ( m_flNextPrimaryAttack < UTIL_WeaponTimeBase() ) + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.06; + + m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); +} + +void CMP5K::Reload( void ) +{ + if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == MP5K_MAX_CLIP ) + return; + + DefaultReload( MP5K_MAX_CLIP, MP5K_RELOAD, 3.6 ); +} + + +void CMP5K::WeaponIdle( void ) +{ + ResetEmptySound( ); + + m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); + + if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) + return; + + SendWeaponAnim( RANDOM_LONG( MP5K_IDLE, MP5K_FIDGET ) ); + + m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); // how long till we do this again. +} + + + +class CMP5KAmmoClip : public CBasePlayerAmmo +{ + void Spawn( void ) + { + Precache( ); + SET_MODEL(ENT(pev), "models/w_weaponclips/w_mp5kclip.mdl"); + CBasePlayerAmmo::Spawn( ); + } + void Precache( void ) + { + PRECACHE_MODEL ("models/w_weaponclips/w_mp5kclip.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); + } + BOOL AddAmmo( CBaseEntity *pOther ) + { + int bResult = (pOther->GiveAmmo( AMMO_MP5KCLIP_GIVE, "9mmar", MP5K_MAX_CARRY) != -1); + if (bResult) + { + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM); + } + return bResult; + } +}; +LINK_ENTITY_TO_CLASS( ammo_mp5k, CMP5KAmmoClip ); +LINK_ENTITY_TO_CLASS( ammo_9mmAR, CMP5KAmmoClip ); + diff --git a/dlls/aomdc/p228.cpp b/dlls/aomdc/p228.cpp new file mode 100644 index 00000000..bd37e00d --- /dev/null +++ b/dlls/aomdc/p228.cpp @@ -0,0 +1,207 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ + +#include "extdll.h" +#include "util.h" +#include "cbase.h" +#include "monsters.h" +#include "weapons.h" +#include "nodes.h" +#include "player.h" + +enum p228_e { + P228_IDLE1 = 0, + P228_IDLE2, + P228_FIRE1, + P228_FIRE2, + P228_FIRE_LOAD, + P228_RELOAD, + P228_RELOAD_EMPTY, + P228_DRAW +}; + +LINK_ENTITY_TO_CLASS( weapon_P228, CP228 ); + + +void CP228::Spawn( ) +{ + Precache( ); + m_iId = WEAPON_P228; + SET_MODEL(ENT(pev), "models/w_p228.mdl"); + + m_iDefaultAmmo = P228_DEFAULT_GIVE; + + FallInit();// get ready to fall down. +} + + +void CP228::Precache( void ) +{ + PRECACHE_MODEL("models/v_p228.mdl"); + PRECACHE_MODEL("models/w_p228.mdl"); + PRECACHE_MODEL("models/p_9mmhandgun.mdl"); + + m_iShell = PRECACHE_MODEL ("models/shell.mdl");// brass shell + + PRECACHE_SOUND("items/9mmclip1.wav"); + PRECACHE_SOUND("items/9mmclip2.wav"); + + PRECACHE_SOUND ("weapons/p228_fire.wav"); + PRECACHE_SOUND ("weapons/p228_magin.wav"); + PRECACHE_SOUND ("weapons/p228_magout.wav"); + PRECACHE_SOUND ("weapons/p228_slideforward.wav"); + + m_usFireP228 = PRECACHE_EVENT( 1, "events/p228.sc" ); +} + +int CP228::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; +} + +int CP228::GetItemInfo(ItemInfo *p) +{ + p->pszName = STRING(pev->classname); + p->pszAmmo1 = "9mm"; + p->iMaxAmmo1 = P228_MAX_CARRY; + p->pszAmmo2 = NULL; + p->iMaxAmmo2 = -1; + p->iMaxClip = P228_MAX_CLIP; + p->iSlot = 1; + p->iPosition = 0; + p->iFlags = 0; + p->iId = m_iId = WEAPON_P228; + p->iWeight = P228_WEIGHT; + + return 1; +} + +BOOL CP228::Deploy( ) +{ + // pev->body = 1; + return DefaultDeploy( "models/v_p228.mdl", "models/p_9mmhandgun.mdl", P228_DRAW, "P228", /*UseDecrement() ? 1 : 0*/ 0 ); +} + +void CP228::PrimaryAttack( void ) +{ + float flSpread = 0.01; + + if( FBitSet( m_pPlayer->m_afButtonLast, IN_ATTACK ) ) + return; + + if( m_iClip <= 0 || (m_pPlayer->pev->waterlevel == 3 && m_pPlayer->pev->watertype > CONTENT_FLYFIELD) ) + { + PlayEmptySound(); + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15; + return; + } + + m_iClip--; + + m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH; + + int flags; + +#if defined( CLIENT_WEAPONS ) + flags = FEV_NOTHOST; +#else + flags = 0; +#endif + + // player "shoot" animation + m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); + + // non-silenced + m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME; + m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH; + + Vector vecSrc = m_pPlayer->GetGunPosition( ); + Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES ); + + Vector vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, Vector( flSpread, flSpread, flSpread ), 8192, BULLET_PLAYER_9MM, 0, gSkillData.plrDmgP228, m_pPlayer->pev, m_pPlayer->random_seed ); + + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usFireP228, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, ( m_iClip == 0 ) ? 1 : 0, 0 ); + + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.2f; + + m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); +} + +void CP228::Reload( void ) +{ + int iAnim; + float fTime; + if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == P228_MAX_CLIP ) + return; + + if( m_iClip ) + { + iAnim = P228_RELOAD; + fTime = 1.93; + } + else + { + iAnim = P228_RELOAD_EMPTY; + fTime = 2.1; + } + DefaultReload( P228_MAX_CLIP, iAnim, fTime ); +} + +void CP228::WeaponIdle( void ) +{ + ResetEmptySound( ); + + m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES ); + + if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) + return; + + SendWeaponAnim( P228_IDLE1, 1 ); + + m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); // how long till we do this again. +} + +class CP228Ammo : public CBasePlayerAmmo +{ + void Spawn( void ) + { + Precache( ); + SET_MODEL(ENT(pev), "models/w_weaponclips/w_p228clip.mdl"); + CBasePlayerAmmo::Spawn( ); + } + void Precache( void ) + { + PRECACHE_MODEL ("models/w_weaponclips/w_p228clip.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); + } + BOOL AddAmmo( CBaseEntity *pOther ) + { + if (pOther->GiveAmmo( AMMO_P228CLIP_GIVE, "9mm", P228_MAX_CARRY ) != -1) + { + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM); + return TRUE; + } + return FALSE; + } +}; +LINK_ENTITY_TO_CLASS( ammo_P228, CP228Ammo ); + diff --git a/dlls/aomdc/revolver.cpp b/dlls/aomdc/revolver.cpp new file mode 100644 index 00000000..073cf1e5 --- /dev/null +++ b/dlls/aomdc/revolver.cpp @@ -0,0 +1,208 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ +#if !defined( OEM_BUILD ) && !defined( HLDEMO_BUILD ) + +#include "extdll.h" +#include "util.h" +#include "cbase.h" +#include "weapons.h" +#include "monsters.h" +#include "player.h" +#include "gamerules.h" + + +enum revolver_e { + REVOLVER_IDLE = 0, + REVOLVER_SHOOT1, + REVOLVER_SHOOT2, + REVOLVER_SHOOT_EMPTY, + REVOLVER_RELOAD, + REVOLVER_DRAW +}; + +LINK_ENTITY_TO_CLASS( weapon_revolver, CRevolver ); +LINK_ENTITY_TO_CLASS( weapon_357, CRevolver ); + +int CRevolver::GetItemInfo(ItemInfo *p) +{ + p->pszName = STRING(pev->classname); + p->pszAmmo1 = "357"; + p->iMaxAmmo1 = REVOLVER_MAX_CARRY; + p->pszAmmo2 = NULL; + p->iMaxAmmo2 = -1; + p->iMaxClip = REVOLVER_MAX_CLIP; + p->iFlags = 0; + p->iSlot = 3; + p->iPosition = 0; + p->iId = m_iId = WEAPON_REVOLVER; + p->iWeight = REVOLVER_WEIGHT; + + return 1; +} + +int CRevolver::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; +} + +void CRevolver::Spawn( ) +{ + Precache( ); + m_iId = WEAPON_REVOLVER; + SET_MODEL(ENT(pev), "models/w_revolver.mdl"); + + m_iDefaultAmmo = REVOLVER_DEFAULT_GIVE; + + FallInit();// get ready to fall down. +} + + +void CRevolver::Precache( void ) +{ + PRECACHE_MODEL("models/v_revolver.mdl"); + PRECACHE_MODEL("models/w_revolver.mdl"); + PRECACHE_MODEL("models/p_357.mdl"); + + PRECACHE_SOUND("items/9mmclip1.wav"); + + PRECACHE_SOUND ("weapons/357_reload1.wav"); + PRECACHE_SOUND ("weapons/357_cock1.wav"); + PRECACHE_SOUND ("weapons/357_shot1.wav"); + PRECACHE_SOUND ("weapons/357_shot2.wav"); + PRECACHE_SOUND ("weapons/revolver_draw.wav"); + PRECACHE_SOUND ("weapons/revolver_fire.wav"); + PRECACHE_SOUND ("weapons/revolver_reload.wav"); + + + m_usFireRevolver = PRECACHE_EVENT( 1, "events/deagle1.sc" ); +} + +BOOL CRevolver::Deploy( ) +{ + pev->body = 0; + EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/revolver_draw.wav", RANDOM_FLOAT(0.8, 0.9), ATTN_NORM); + return DefaultDeploy( "models/v_revolver.mdl", "models/p_357.mdl", REVOLVER_DRAW, "Revolver", UseDecrement(), pev->body ); +} + +void CRevolver::PrimaryAttack() +{ + if( m_iClip <= 0 || + ( m_pPlayer->pev->waterlevel == 3 && m_pPlayer->pev->watertype > CONTENT_FLYFIELD ) ) // don't fire underwater + { + PlayEmptySound( ); + m_flNextPrimaryAttack = 0.15; + return; + } + + m_pPlayer->m_iWeaponVolume = LOUD_GUN_VOLUME; + m_pPlayer->m_iWeaponFlash = BRIGHT_GUN_FLASH; + + m_iClip--; + + m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH; + + // player "shoot" animation + m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); + + UTIL_MakeVectors( m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle ); + + Vector vecSrc = m_pPlayer->GetGunPosition( ); + Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES ); + + Vector vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, VECTOR_CONE_1DEGREES, 8192, BULLET_PLAYER_357, 0, gSkillData.plrDmgRevolver, m_pPlayer->pev, m_pPlayer->random_seed ); + + int flags; +#if defined( CLIENT_WEAPONS ) + flags = FEV_NOTHOST; +#else + flags = 0; +#endif + + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usFireRevolver, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 ); + + m_flNextPrimaryAttack = 0.9; + m_flTimeWeaponIdle = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); +} + + +void CRevolver::Reload( void ) +{ + if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == REVOLVER_MAX_CLIP ) + return; + + if (DefaultReload( REVOLVER_MAX_CLIP, REVOLVER_RELOAD, 2.76)) + { + m_flSoundDelay = 1.5; + } +} + + +void CRevolver::WeaponIdle( void ) +{ + ResetEmptySound( ); + + m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES ); + + // ALERT( at_console, "%.2f\n", gpGlobals->time - m_flSoundDelay ); + if (m_flSoundDelay != 0 && m_flSoundDelay <= UTIL_WeaponTimeBase() ) + { + EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/revolver_reload.wav", RANDOM_FLOAT(0.8, 0.9), ATTN_NORM); + m_flSoundDelay = 0; + } + + if (m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) + return; + + SendWeaponAnim( REVOLVER_IDLE, 1 ); + + m_flTimeWeaponIdle = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); // how long till we do this again. +} + + + +class CRevolverAmmo : public CBasePlayerAmmo +{ + void Spawn( void ) + { + Precache( ); + SET_MODEL(ENT(pev), "models/w_weaponclips/w_revolverrounds.mdl"); + CBasePlayerAmmo::Spawn( ); + } + void Precache( void ) + { + PRECACHE_MODEL ("models/w_weaponclips/w_revolverrounds.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); + } + BOOL AddAmmo( CBaseEntity *pOther ) + { + if (pOther->GiveAmmo( AMMO_REVOLVERBOX_GIVE, "357", REVOLVER_MAX_CARRY ) != -1) + { + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM); + return TRUE; + } + return FALSE; + } +}; +LINK_ENTITY_TO_CLASS( ammo_revolver, CRevolverAmmo ); + + +#endif diff --git a/dlls/aomdc/spear.cpp b/dlls/aomdc/spear.cpp new file mode 100644 index 00000000..949842aa --- /dev/null +++ b/dlls/aomdc/spear.cpp @@ -0,0 +1,268 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ + +#include "extdll.h" +#include "util.h" +#include "cbase.h" +#include "monsters.h" +#include "weapons.h" +#include "nodes.h" +#include "player.h" +#include "gamerules.h" +#include "shake.h" + +#define CROWBAR_BODYHIT_VOLUME 128 +#define CROWBAR_WALLHIT_VOLUME 512 + +LINK_ENTITY_TO_CLASS( weapon_Spear, CSpear ); + + + +enum spear_e { + SPEAR_IDLE = 0, + SPEAR_STAB_START, + SPEAR_STAB_MISS, + SPEAR_STAB, + SPEAR_DRAW, + SPEAR_ELECTROCUTE +}; + + +void CSpear::Spawn( ) +{ + Precache( ); + m_iId = WEAPON_SPEAR; + SET_MODEL(ENT(pev), "models/w_spear.mdl"); + m_iClip = -1; + + FallInit();// get ready to fall down. +} + + +void CSpear::Precache( void ) +{ + PRECACHE_MODEL("models/v_spear.mdl"); + PRECACHE_MODEL("models/w_spear.mdl"); + PRECACHE_MODEL("models/p_crowbar.mdl"); + PRECACHE_SOUND("weapons/spear_stab.wav"); + PRECACHE_SOUND("weapons/spear_hitwall.wav"); + PRECACHE_SOUND("weapons/spear_swing.wav"); + PRECACHE_SOUND("weapons/spear_electrocute.wav"); + + m_usSpear = PRECACHE_EVENT ( 1, "events/null.sc" ); +} + +int CSpear::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; +} + +int CSpear::GetItemInfo(ItemInfo *p) +{ + p->pszName = STRING(pev->classname); + p->pszAmmo1 = NULL; + p->iMaxAmmo1 = -1; + p->pszAmmo2 = NULL; + p->iMaxAmmo2 = -1; + p->iMaxClip = WEAPON_NOCLIP; + p->iSlot = 0; + p->iPosition = 4; + p->iId = WEAPON_SPEAR; + p->iWeight = SPEAR_WEIGHT; + return 1; +} + + + +BOOL CSpear::Deploy( ) +{ + return DefaultDeploy( "models/v_spear.mdl", "models/p_crowbar.mdl", SPEAR_DRAW, "Spear" ); +} + +void FindHullIntersection(const Vector &vecSrc, TraceResult &tr, float *mins, float *maxs, edict_t *pEntity); +/* +void FindHullIntersection( const Vector &vecSrc, TraceResult &tr, float *mins, float *maxs, edict_t *pEntity ) +{ + int i, j, k; + float distance; + float *minmaxs[2] = {mins, maxs}; + TraceResult tmpTrace; + Vector vecHullEnd = tr.vecEndPos; + Vector vecEnd; + + distance = 1e6f; + + vecHullEnd = vecSrc + ((vecHullEnd - vecSrc)*2); + UTIL_TraceLine( vecSrc, vecHullEnd, dont_ignore_monsters, pEntity, &tmpTrace ); + if ( tmpTrace.flFraction < 1.0 ) + { + tr = tmpTrace; + return; + } + + for ( i = 0; i < 2; i++ ) + { + for ( j = 0; j < 2; j++ ) + { + for ( k = 0; k < 2; k++ ) + { + vecEnd.x = vecHullEnd.x + minmaxs[i][0]; + vecEnd.y = vecHullEnd.y + minmaxs[j][1]; + vecEnd.z = vecHullEnd.z + minmaxs[k][2]; + + UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, pEntity, &tmpTrace ); + if ( tmpTrace.flFraction < 1.0 ) + { + float thisDistance = (tmpTrace.vecEndPos - vecSrc).Length(); + if ( thisDistance < distance ) + { + tr = tmpTrace; + distance = thisDistance; + } + } + } + } + } +} +*/ + +void CSpear::PrimaryAttack() +{ + if( FBitSet( m_pPlayer->pev->flags, FL_INWATER ) ) + { + SendWeaponAnim( SPEAR_ELECTROCUTE ); + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 2.34; +#ifndef CLIENT_DLL + UTIL_ScreenFade( m_pPlayer, Vector( 255, 255, 255 ), 0.5, 0.0, 100, FFADE_IN ); + m_pPlayer->TakeDamage(m_pPlayer->pev, m_pPlayer->pev, DAMAGE_AIM, DMG_GENERIC ); + EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/spear_electrocute.wav", 1, ATTN_NORM); +#endif + } + else + { + SendWeaponAnim( SPEAR_STAB_START ); + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.0; + + SetThink( &CSpear::BigSpearStab ); + pev->nextthink = gpGlobals->time + 0.3; + } +} + +void CSpear::UnStab() +{ + m_pPlayer->EnableControl(TRUE); +} + +void CSpear::BigSpearStab() +{ + TraceResult tr; + + UTIL_MakeVectors (m_pPlayer->pev->v_angle); + Vector vecSrc = m_pPlayer->GetGunPosition( ); + Vector vecEnd = vecSrc + gpGlobals->v_forward * 72; + UTIL_TraceLine( vecSrc, vecEnd, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr ); + +#ifndef CLIENT_DLL + if ( tr.flFraction >= 1.0 ) + { + UTIL_TraceHull( vecSrc, vecEnd, dont_ignore_monsters, head_hull, ENT( m_pPlayer->pev ), &tr ); + if ( tr.flFraction < 1.0 ) + { + // Calculate the point of intersection of the line (or hull) and the object we hit + // This is and approximation of the "best" intersection + CBaseEntity *pHit = CBaseEntity::Instance( tr.pHit ); + if ( !pHit || pHit->IsBSPModel() ) + FindHullIntersection( vecSrc, tr, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX, m_pPlayer->edict() ); + vecEnd = tr.vecEndPos; // This is the point on the actual surface (the hull could have hit space) + } + } +#endif + + PLAYBACK_EVENT_FULL( 0, m_pPlayer->edict(), m_usSpear, + 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0, 0, 0, + 0.0, 0, 0.0 ); + + if ( tr.flFraction < 1.0 ) + { + SendWeaponAnim( SPEAR_STAB ); + + // player "shoot" animation + m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); +#ifndef CLIENT_DLL + + // hit + CBaseEntity *pEntity = CBaseEntity::Instance(tr.pHit); + + // play thwack, smack, or dong sound + float flVol = 1.0; + int fHitWorld = TRUE; + + UTIL_ScreenShake( m_pPlayer->pev->origin, 5.0, 1.0, 0.7, 0.25 ); + + m_pPlayer->EnableControl(FALSE); + SetThink( &CSpear::UnStab ); + pev->nextthink = gpGlobals->time + 0.4; + + if (pEntity) + { + ClearMultiDamage( ); + pEntity->TraceAttack(m_pPlayer->pev, gSkillData.plrDmgKnife * 2.2, gpGlobals->v_forward, &tr, DMG_SPEAR ); + ApplyMultiDamage( m_pPlayer->pev, m_pPlayer->pev ); + + if ( pEntity->Classify() != CLASS_NONE && pEntity->Classify() != CLASS_MACHINE ) + { + // play thwack or smack sound + EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/spear_stab.wav", 1, ATTN_NORM); + m_pPlayer->m_iWeaponVolume = CROWBAR_BODYHIT_VOLUME; + flVol = 0.1; + + fHitWorld = FALSE; + } + } + + // play texture hit sound + // UNDONE: Calculate the correct point of intersection when we hit with the hull instead of the line + + if (fHitWorld) + { + float fvolbar = TEXTURETYPE_PlaySound(&tr, vecSrc, vecSrc + (vecEnd-vecSrc)*2, BULLET_PLAYER_CROWBAR); + + if ( g_pGameRules->IsMultiplayer() ) + { + // override the volume here, cause we don't play texture sounds in multiplayer, + // and fvolbar is going to be 0 from the above call. + + fvolbar = 1; + } + + // also play spear strike + EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/spear_hitwall.wav", fvolbar, ATTN_NORM); + + // delay the decal a bit + m_trHit = tr; + } + + m_pPlayer->m_iWeaponVolume = flVol * CROWBAR_WALLHIT_VOLUME; +#endif + DecalGunshot( &m_trHit, BULLET_PLAYER_CROWBAR ); + } +} diff --git a/dlls/aomdc/uzi.cpp b/dlls/aomdc/uzi.cpp new file mode 100644 index 00000000..adab8bd3 --- /dev/null +++ b/dlls/aomdc/uzi.cpp @@ -0,0 +1,209 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* Use, distribution, and modification of this source code and/or resulting +* object code is restricted to non-commercial enhancements to products from +* Valve LLC. All other use, distribution, or modification is prohibited +* without written permission from Valve LLC. +* +****/ + +#include "extdll.h" +#include "util.h" +#include "cbase.h" +#include "monsters.h" +#include "weapons.h" +#include "nodes.h" +#include "player.h" +#include "soundent.h" +#include "gamerules.h" + +enum uzi_e +{ + UZI_IDLE = 0, + UZI_RELOAD, + UZI_DRAW, + UZI_FIRE1, + UZI_FIRE2, + UZI_FIRE3 +}; + +LINK_ENTITY_TO_CLASS( weapon_uzi, CUzi ); + + +//========================================================= +//========================================================= +void CUzi::Spawn( ) +{ + Precache( ); + SET_MODEL(ENT(pev), "models/w_uzi.mdl"); + m_iId = WEAPON_UZI; + + m_iDefaultAmmo = UZI_DEFAULT_GIVE; + + FallInit();// get ready to fall down. +} + + +void CUzi::Precache( void ) +{ + PRECACHE_MODEL("models/v_uzi.mdl"); + PRECACHE_MODEL("models/w_uzi.mdl"); + PRECACHE_MODEL("models/p_9mmAR.mdl"); + + m_iShell = PRECACHE_MODEL ("models/shell.mdl");// brass shellTE_MODEL + + PRECACHE_SOUND("items/9mmclip1.wav"); + + PRECACHE_SOUND("items/clipinsert1.wav"); + PRECACHE_SOUND("items/cliprelease1.wav"); + + PRECACHE_SOUND ("weapons/uzi_boltpull.wav"); + PRECACHE_SOUND ("weapons/uzi_fire.wav"); + PRECACHE_SOUND ("weapons/uzi_magin.wav"); + PRECACHE_SOUND ("weapons/uzi_magout.wav"); + + PRECACHE_SOUND ("weapons/357_cock1.wav"); + + m_usUzi = PRECACHE_EVENT( 1, "events/mp5.sc" ); +} + +int CUzi::GetItemInfo(ItemInfo *p) +{ + p->pszName = STRING(pev->classname); + p->pszAmmo1 = "9mmar"; + p->iMaxAmmo1 = UZI_MAX_CARRY; + p->pszAmmo2 = NULL; + p->iMaxAmmo2 = -1; + p->iMaxClip = UZI_MAX_CLIP; + p->iSlot = 2; + p->iPosition = 1; + p->iFlags = 0; + p->iId = m_iId = WEAPON_UZI; + p->iWeight = UZI_WEIGHT; + + return 1; +} + +int CUzi::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; +} + +BOOL CUzi::Deploy( ) +{ + return DefaultDeploy( "models/v_uzi.mdl", "models/p_9mmAR.mdl", UZI_DRAW, "Uzi" ); +} + + +void CUzi::PrimaryAttack() +{ + // don't fire underwater + if (m_pPlayer->pev->waterlevel == 3 && m_pPlayer->pev->watertype > CONTENT_FLYFIELD) + { + PlayEmptySound( ); + m_flNextPrimaryAttack = 0.15; + return; + } + + if (m_iClip <= 0) + { + PlayEmptySound(); + m_flNextPrimaryAttack = 0.15; + return; + } + + m_pPlayer->m_iWeaponVolume = NORMAL_GUN_VOLUME; + m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH; + + m_iClip--; + + + m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH; + + // player "shoot" animation + m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); + + Vector vecSrc = m_pPlayer->GetGunPosition( ); + Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); + Vector vecDir = m_pPlayer->FireBulletsPlayer( 1, vecSrc, vecAiming, VECTOR_CONE_3DEGREES, 8192, BULLET_PLAYER_MP5, 2, gSkillData.plrDmgUzi, m_pPlayer->pev, m_pPlayer->random_seed ); + + int flags; +#if defined( CLIENT_WEAPONS ) + flags = FEV_NOTHOST; +#else + flags = 0; +#endif + + PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usUzi, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 ); + + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.08; + + if ( m_flNextPrimaryAttack < UTIL_WeaponTimeBase() ) + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.08; + + m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); +} + +void CUzi::Reload( void ) +{ + if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == UZI_MAX_CLIP ) + return; + + DefaultReload( UZI_MAX_CLIP, UZI_RELOAD, 2.6 ); +} + + +void CUzi::WeaponIdle( void ) +{ + ResetEmptySound( ); + + m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); + + if ( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) + return; + + SendWeaponAnim( UZI_IDLE ); + + m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); // how long till we do this again. +} + + + +class CUziAmmoClip : public CBasePlayerAmmo +{ + void Spawn( void ) + { + Precache( ); + SET_MODEL(ENT(pev), "models/w_weaponclips/w_uziclip.mdl"); + CBasePlayerAmmo::Spawn( ); + } + void Precache( void ) + { + PRECACHE_MODEL ("models/w_weaponclips/w_uziclip.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); + } + BOOL AddAmmo( CBaseEntity *pOther ) + { + int bResult = (pOther->GiveAmmo( AMMO_UZICLIP_GIVE, "9mmar", UZI_MAX_CARRY) != -1); + if (bResult) + { + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM); + } + return bResult; + } +}; +LINK_ENTITY_TO_CLASS( ammo_uzi, CUziAmmoClip ); + diff --git a/dlls/aomdc/wheelchair.cpp b/dlls/aomdc/wheelchair.cpp new file mode 100644 index 00000000..da93eb5e --- /dev/null +++ b/dlls/aomdc/wheelchair.cpp @@ -0,0 +1,237 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* This source code contains proprietary and confidential information of +* Valve LLC and its suppliers. Access to this code is restricted to +* persons who have executed a written SDK license with Valve. Any access, +* use or distribution of this code by or to any unlicensed person is illegal. +* +****/ +//========================================================= +// Wheelchair monster +//========================================================= + +#include "zombie.h" + +#define WHEELCHAIR_AE_BLOODSQUIRT 1 +#define WHEELCHAIR_AE_WALK 1011 + +#define WHEELCHAIR_FLINCH_DELAY 5.0 + +class CWheelchair : public CZombie +{ +public: + void Spawn( void ); + void Precache( void ); + void HandleAnimEvent( MonsterEvent_t *pEvent ); + int IgnoreConditions(); + + void AlertSound( void ); + void IdleSound( void ); + + static const char *pAttackSounds[]; + static const char *pIdleSounds[]; + static const char *pAlertSounds[]; + static const char *pPainSounds[]; + static const char *pAttackHitSounds[]; + static const char *pAttackMissSounds[]; + + int m_vomitSprite; +}; + +LINK_ENTITY_TO_CLASS( monster_wheelchair, CWheelchair ); + +const char *CWheelchair::pAttackHitSounds[] = +{ + "zombie/claw_strike1.wav", + "zombie/claw_strike2.wav", + "zombie/claw_strike3.wav", +}; + +const char *CWheelchair::pAttackMissSounds[] = +{ + "zombie/claw_miss1.wav", + "zombie/claw_miss2.wav", +}; + +const char *CWheelchair::pAttackSounds[] = +{ + "zombie/zo_attack1.wav", + "zombie/zo_attack2.wav", +}; + +const char *CWheelchair::pIdleSounds[] = +{ + "wheelchair/wheel01.wav", + "wheelchair/wheel02.wav", + "wheelchair/wheel03.wav", + "wheelchair/wheel04.wav" +}; + +const char *CWheelchair::pAlertSounds[] = +{ + "zombie/zo_alert10.wav", + "zombie/zo_alert20.wav", + "zombie/zo_alert30.wav", +}; + +const char *CWheelchair::pPainSounds[] = +{ + "zombie/zo_pain1.wav", + "zombie/zo_pain2.wav", +}; + +void CWheelchair:: AlertSound( void ) +{ + /*int pitch = 95 + RANDOM_LONG(0,9); + + EMIT_SOUND_DYN ( ENT(pev), CHAN_VOICE, pAlertSounds[ RANDOM_LONG(0,ARRAYSIZE(pAlertSounds)-1) ], 1.0, ATTN_NORM, 0, pitch );*/ +} + +void CWheelchair :: IdleSound( void ) +{ + // Play a random idle sound + EMIT_SOUND( ENT(pev), CHAN_BODY, pIdleSounds[ RANDOM_LONG(0,ARRAYSIZE(pIdleSounds)-1) ], 1.0, ATTN_NORM); +} + +//========================================================= +// HandleAnimEvent - catches the monster-specific messages +// that occur when tagged animation frames are played. +//========================================================= +void CWheelchair :: HandleAnimEvent( MonsterEvent_t *pEvent ) +{ + switch( pEvent->event ) + { + case WHEELCHAIR_AE_WALK: + IdleSound(); + break; + case WHEELCHAIR_AE_BLOODSQUIRT: + { + EMIT_SOUND_DYN ( ENT(pev), CHAN_BODY, "wheelchair/wcm_squirt.wav", 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, pev->origin ); + WRITE_BYTE( TE_BLOODSPRITE ); + WRITE_COORD( pev->origin.x ); // pos + WRITE_COORD( pev->origin.y ); + WRITE_COORD( pev->origin.z + 40 ); + WRITE_SHORT( m_vomitSprite ); // sprite1 + WRITE_SHORT( m_vomitSprite ); // sprite2 + WRITE_BYTE ( BLOOD_COLOR_RED ); // color + WRITE_BYTE ( 6 ); // count + MESSAGE_END(); + + // do stuff for this event. + CBaseEntity *pHurt = CheckTraceHullAttack( 70, gSkillData.wheelchairDmgAttack, DMG_SLASH ); + if ( pHurt ) + { + if ( pHurt->pev->flags & (FL_MONSTER|FL_CLIENT) ) + { + pHurt->pev->punchangle.z = -18; + pHurt->pev->punchangle.x = 5; + pHurt->pev->velocity = pHurt->pev->velocity - gpGlobals->v_right * 100; + } + // Play a random attack hit sound + // EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackHitSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackHitSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + } + //else // Play a random attack miss sound + //EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackMissSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackMissSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + + /*if (RANDOM_LONG(0,1)) + AttackSound();*/ + } + break; + default: + CBaseMonster::HandleAnimEvent( pEvent ); + break; + } +} + +//========================================================= +// Spawn +//========================================================= +void CWheelchair :: Spawn() +{ + Precache( ); + + if (pev->model) + SET_MODEL(ENT(pev), STRING(pev->model)); //LRC + else + SET_MODEL(ENT(pev), "models/wheelchair_monster.mdl"); + UTIL_SetSize( pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX ); + + pev->solid = SOLID_SLIDEBOX; + pev->movetype = MOVETYPE_STEP; + m_bloodColor = BLOOD_COLOR_RED; + if (pev->health == 0) + pev->health = gSkillData.wheelchairHealth; + pev->view_ofs = VEC_VIEW;// position of the eyes relative to monster's origin. + m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result ) + m_MonsterState = MONSTERSTATE_NONE; + m_afCapability = bits_CAP_DOORS_GROUP; + + MonsterInit(); +} + +//========================================================= +// Precache - precaches all resources this monster needs +//========================================================= +void CWheelchair :: Precache() +{ + int i; + m_vomitSprite = PRECACHE_MODEL("sprites/wheelchair_vomit.spr"); + if (pev->model) + PRECACHE_MODEL((char*)STRING(pev->model)); //LRC + else + PRECACHE_MODEL("models/wheelchair_monster.mdl"); + + PRECACHE_SOUND( "wheelchair/wcm_squirt.wav" ); + + for ( i = 0; i < ARRAYSIZE( pAttackHitSounds ); i++ ) + PRECACHE_SOUND((char *)pAttackHitSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pAttackMissSounds ); i++ ) + PRECACHE_SOUND((char *)pAttackMissSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pAttackSounds ); i++ ) + PRECACHE_SOUND((char *)pAttackSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pIdleSounds ); i++ ) + PRECACHE_SOUND((char *)pIdleSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pAlertSounds ); i++ ) + PRECACHE_SOUND((char *)pAlertSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pPainSounds ); i++ ) + PRECACHE_SOUND((char *)pPainSounds[i]); +} + +//========================================================= +// AI Schedules Specific to this monster +//========================================================= +int CWheelchair::IgnoreConditions() +{ + int iIgnore = CBaseMonster::IgnoreConditions(); + + if ((m_Activity == ACT_MELEE_ATTACK1) || (m_Activity == ACT_MELEE_ATTACK1)) + { +#if 0 + if (pev->health < 20) + iIgnore |= (bits_COND_LIGHT_DAMAGE|bits_COND_HEAVY_DAMAGE); + else +#endif + if (m_flNextFlinch >= gpGlobals->time) + iIgnore |= (bits_COND_LIGHT_DAMAGE|bits_COND_HEAVY_DAMAGE); + } + + if ((m_Activity == ACT_SMALL_FLINCH) || (m_Activity == ACT_BIG_FLINCH)) + { + if (m_flNextFlinch < gpGlobals->time) + m_flNextFlinch = gpGlobals->time + WHEELCHAIR_FLINCH_DELAY; + } + + return iIgnore; +} diff --git a/dlls/aomdc/zombie.h b/dlls/aomdc/zombie.h new file mode 100644 index 00000000..910a8d1d --- /dev/null +++ b/dlls/aomdc/zombie.h @@ -0,0 +1,51 @@ +//========================================================= +// Zombie +//========================================================= + +// UNDONE: Don't flinch every time you get hit + +#include "extdll.h" +#include "util.h" +#include "cbase.h" +#include "monsters.h" +#include "schedule.h" + + +//========================================================= +// Monster's Anim Events Go Here +//========================================================= +#define ZOMBIE_AE_ATTACK_RIGHT 0x01 +#define ZOMBIE_AE_ATTACK_LEFT 0x02 +#define ZOMBIE_AE_ATTACK_BOTH 0x03 + +#define ZOMBIE_FLINCH_DELAY 2 // at most one flinch every n secs + +class CZombie : public CBaseMonster +{ +public: + virtual void Spawn( void ); + virtual void Precache( void ); + void SetYawSpeed( void ); + int Classify ( void ); + virtual void HandleAnimEvent( MonsterEvent_t *pEvent ); + virtual int IgnoreConditions ( void ); + + float m_flNextFlinch; + + virtual void PainSound( void ); + virtual void AlertSound( void ); + virtual void IdleSound( void ); + virtual void AttackSound( void ); + + static const char *pAttackSounds[]; + static const char *pIdleSounds[]; + static const char *pAlertSounds[]; + static const char *pPainSounds[]; + static const char *pAttackHitSounds[]; + static const char *pAttackMissSounds[]; + + // No range attacks + BOOL CheckRangeAttack1 ( float flDot, float flDist ) { return FALSE; } + BOOL CheckRangeAttack2 ( float flDot, float flDist ) { return FALSE; } + virtual int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType ); +}; diff --git a/dlls/aomdc/zombie2.cpp b/dlls/aomdc/zombie2.cpp new file mode 100644 index 00000000..f72544f2 --- /dev/null +++ b/dlls/aomdc/zombie2.cpp @@ -0,0 +1,256 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* This source code contains proprietary and confidential information of +* Valve LLC and its suppliers. Access to this code is restricted to +* persons who have executed a written SDK license with Valve. Any access, +* use or distribution of this code by or to any unlicensed person is illegal. +* +****/ +//========================================================= +// Zombie +//========================================================= + +#include "zombie.h" + + +class CZombie2 : public CZombie +{ +public: + void Spawn( void ); + void Precache( void ); + void HandleAnimEvent( MonsterEvent_t *pEvent ); + + void PainSound( void ); + void AlertSound( void ); + void IdleSound( void ); + void AttackSound( void ); + + static const char *pAttackSounds[]; + static const char *pIdleSounds[]; + static const char *pAlertSounds[]; + static const char *pPainSounds[]; + static const char *pAttackHitSounds[]; + static const char *pAttackMissSounds[]; +}; + +LINK_ENTITY_TO_CLASS( monster_zombie2, CZombie2 ); + +const char *CZombie2::pAttackHitSounds[] = +{ + "zombie2/claw_strike1.wav", + "zombie2/claw_strike2.wav", + "zombie2/claw_strike3.wav", +}; + +const char *CZombie2::pAttackMissSounds[] = +{ + "zombie2/claw_miss1.wav", + "zombie2/claw_miss2.wav", +}; + +const char *CZombie2::pAttackSounds[] = +{ + "zombie2/zo_attack1.wav", + "zombie2/zo_attack2.wav", +}; + +const char *CZombie2::pIdleSounds[] = +{ + "zombie2/zo_idle1.wav", + "zombie2/zo_idle2.wav", + "zombie2/zo_idle3.wav", + "zombie2/zo_idle4.wav", +}; + +const char *CZombie2::pAlertSounds[] = +{ + "zombie2/zo_alert10.wav", + "zombie2/zo_alert20.wav", + "zombie2/zo_alert30.wav", +}; + +const char *CZombie2::pPainSounds[] = +{ + "zombie2/zo_pain1.wav", + "zombie2/zo_pain2.wav", +}; + +void CZombie2 :: PainSound( void ) +{ + int pitch = 95 + RANDOM_LONG(0,9); + + if (RANDOM_LONG(0,5) < 2) + EMIT_SOUND_DYN ( ENT(pev), CHAN_VOICE, pPainSounds[ RANDOM_LONG(0,ARRAYSIZE(pPainSounds)-1) ], 1.0, ATTN_NORM, 0, pitch ); +} + +void CZombie2 :: AlertSound( void ) +{ + int pitch = 95 + RANDOM_LONG(0,9); + + EMIT_SOUND_DYN ( ENT(pev), CHAN_VOICE, pAlertSounds[ RANDOM_LONG(0,ARRAYSIZE(pAlertSounds)-1) ], 1.0, ATTN_NORM, 0, pitch ); +} + +void CZombie2 :: IdleSound( void ) +{ + int pitch = 95 + RANDOM_LONG(0,9); + + // Play a random idle sound + EMIT_SOUND_DYN ( ENT(pev), CHAN_VOICE, pIdleSounds[ RANDOM_LONG(0,ARRAYSIZE(pIdleSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); +} + +void CZombie2 :: AttackSound( void ) +{ + // Play a random attack sound + EMIT_SOUND_DYN ( ENT(pev), CHAN_VOICE, pAttackSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); +} + + +//========================================================= +// HandleAnimEvent - catches the monster-specific messages +// that occur when tagged animation frames are played. +//========================================================= +void CZombie2 :: HandleAnimEvent( MonsterEvent_t *pEvent ) +{ + switch( pEvent->event ) + { + case ZOMBIE_AE_ATTACK_RIGHT: + { + // do stuff for this event. + // ALERT( at_console, "Slash right!\n" ); + CBaseEntity *pHurt = CheckTraceHullAttack( 70, gSkillData.zombie2DmgOneSlash, DMG_SLASH ); + if ( pHurt ) + { + if ( pHurt->pev->flags & (FL_MONSTER|FL_CLIENT) ) + { + pHurt->pev->punchangle.z = -18; + pHurt->pev->punchangle.x = 5; + pHurt->pev->velocity = pHurt->pev->velocity - gpGlobals->v_right * 100; + } + // Play a random attack hit sound + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackHitSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackHitSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + } + else // Play a random attack miss sound + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackMissSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackMissSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + + if (RANDOM_LONG(0,1)) + AttackSound(); + } + break; + + case ZOMBIE_AE_ATTACK_LEFT: + { + // do stuff for this event. + // ALERT( at_console, "Slash left!\n" ); + CBaseEntity *pHurt = CheckTraceHullAttack( 70, gSkillData.zombie2DmgOneSlash, DMG_SLASH ); + if ( pHurt ) + { + if ( pHurt->pev->flags & (FL_MONSTER|FL_CLIENT) ) + { + pHurt->pev->punchangle.z = 18; + pHurt->pev->punchangle.x = 5; + pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_right * 100; + } + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackHitSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackHitSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + } + else + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackMissSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackMissSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + + if (RANDOM_LONG(0,1)) + AttackSound(); + } + break; + + case ZOMBIE_AE_ATTACK_BOTH: + { + // do stuff for this event. + CBaseEntity *pHurt = CheckTraceHullAttack( 70, gSkillData.zombie2DmgBothSlash, DMG_SLASH ); + if ( pHurt ) + { + if ( pHurt->pev->flags & (FL_MONSTER|FL_CLIENT) ) + { + pHurt->pev->punchangle.x = 5; + pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_forward * -100; + } + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackHitSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackHitSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + } + else + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackMissSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackMissSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + + if (RANDOM_LONG(0,1)) + AttackSound(); + } + break; + + default: + CBaseMonster::HandleAnimEvent( pEvent ); + break; + } +} + +//========================================================= +// Spawn +//========================================================= +void CZombie2 :: Spawn() +{ + Precache( ); + + if (pev->model) + SET_MODEL(ENT(pev), STRING(pev->model)); //LRC + else + SET_MODEL(ENT(pev), "models/zombie2.mdl"); + UTIL_SetSize( pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX ); + + pev->solid = SOLID_SLIDEBOX; + pev->movetype = MOVETYPE_STEP; + m_bloodColor = BLOOD_COLOR_RED; + if (pev->health == 0) + pev->health = gSkillData.zombie2Health; + pev->view_ofs = VEC_VIEW;// position of the eyes relative to monster's origin. + m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result ) + m_MonsterState = MONSTERSTATE_NONE; + m_afCapability = bits_CAP_DOORS_GROUP; + + MonsterInit(); +} + +//========================================================= +// Precache - precaches all resources this monster needs +//========================================================= +void CZombie2 :: Precache() +{ + int i; + + if (pev->model) + PRECACHE_MODEL((char*)STRING(pev->model)); //LRC + else + PRECACHE_MODEL("models/zombie2.mdl"); + + for ( i = 0; i < ARRAYSIZE( pAttackHitSounds ); i++ ) + PRECACHE_SOUND((char *)pAttackHitSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pAttackMissSounds ); i++ ) + PRECACHE_SOUND((char *)pAttackMissSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pAttackSounds ); i++ ) + PRECACHE_SOUND((char *)pAttackSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pIdleSounds ); i++ ) + PRECACHE_SOUND((char *)pIdleSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pAlertSounds ); i++ ) + PRECACHE_SOUND((char *)pAlertSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pPainSounds ); i++ ) + PRECACHE_SOUND((char *)pPainSounds[i]); +} + +//========================================================= +// AI Schedules Specific to this monster +//========================================================= + diff --git a/dlls/aomdc/zombie3.cpp b/dlls/aomdc/zombie3.cpp new file mode 100644 index 00000000..6af4fd07 --- /dev/null +++ b/dlls/aomdc/zombie3.cpp @@ -0,0 +1,256 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* This source code contains proprietary and confidential information of +* Valve LLC and its suppliers. Access to this code is restricted to +* persons who have executed a written SDK license with Valve. Any access, +* use or distribution of this code by or to any unlicensed person is illegal. +* +****/ +//========================================================= +// Zombie +//========================================================= + +#include "zombie.h" + + +class CZombie3 : public CZombie +{ +public: + void Spawn( void ); + void Precache( void ); + void HandleAnimEvent( MonsterEvent_t *pEvent ); + + void PainSound( void ); + void AlertSound( void ); + void IdleSound( void ); + void AttackSound( void ); + + static const char *pAttackSounds[]; + static const char *pIdleSounds[]; + static const char *pAlertSounds[]; + static const char *pPainSounds[]; + static const char *pAttackHitSounds[]; + static const char *pAttackMissSounds[]; +}; + +LINK_ENTITY_TO_CLASS( monster_zombie3, CZombie3 ); + +const char *CZombie3::pAttackHitSounds[] = +{ + "zombie3/claw_strike1.wav", + "zombie3/claw_strike2.wav", + "zombie3/claw_strike3.wav", +}; + +const char *CZombie3::pAttackMissSounds[] = +{ + "zombie3/claw_miss1.wav", + "zombie3/claw_miss2.wav", +}; + +const char *CZombie3::pAttackSounds[] = +{ + "zombie3/zo_attack1.wav", + "zombie3/zo_attack2.wav", +}; + +const char *CZombie3::pIdleSounds[] = +{ + "zombie3/zo_idle1.wav", + "zombie3/zo_idle2.wav", + "zombie3/zo_idle3.wav", + "zombie3/zo_idle4.wav", +}; + +const char *CZombie3::pAlertSounds[] = +{ + "zombie3/zo_alert10.wav", + "zombie3/zo_alert20.wav", + "zombie3/zo_alert30.wav", +}; + +const char *CZombie3::pPainSounds[] = +{ + "zombie3/zo_pain1.wav", + "zombie3/zo_pain2.wav", +}; + +void CZombie3 :: PainSound( void ) +{ + int pitch = 95 + RANDOM_LONG(0,9); + + if (RANDOM_LONG(0,5) < 2) + EMIT_SOUND_DYN ( ENT(pev), CHAN_VOICE, pPainSounds[ RANDOM_LONG(0,ARRAYSIZE(pPainSounds)-1) ], 1.0, ATTN_NORM, 0, pitch ); +} + +void CZombie3 :: AlertSound( void ) +{ + int pitch = 95 + RANDOM_LONG(0,9); + + EMIT_SOUND_DYN ( ENT(pev), CHAN_VOICE, pAlertSounds[ RANDOM_LONG(0,ARRAYSIZE(pAlertSounds)-1) ], 1.0, ATTN_NORM, 0, pitch ); +} + +void CZombie3 :: IdleSound( void ) +{ + int pitch = 95 + RANDOM_LONG(0,9); + + // Play a random idle sound + EMIT_SOUND_DYN ( ENT(pev), CHAN_VOICE, pIdleSounds[ RANDOM_LONG(0,ARRAYSIZE(pIdleSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); +} + +void CZombie3 :: AttackSound( void ) +{ + // Play a random attack sound + EMIT_SOUND_DYN ( ENT(pev), CHAN_VOICE, pAttackSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); +} + + +//========================================================= +// HandleAnimEvent - catches the monster-specific messages +// that occur when tagged animation frames are played. +//========================================================= +void CZombie3 :: HandleAnimEvent( MonsterEvent_t *pEvent ) +{ + switch( pEvent->event ) + { + case ZOMBIE_AE_ATTACK_RIGHT: + { + // do stuff for this event. + // ALERT( at_console, "Slash right!\n" ); + CBaseEntity *pHurt = CheckTraceHullAttack( 70, gSkillData.zombie3DmgOneSlash, DMG_SLASH ); + if ( pHurt ) + { + if ( pHurt->pev->flags & (FL_MONSTER|FL_CLIENT) ) + { + pHurt->pev->punchangle.z = -18; + pHurt->pev->punchangle.x = 5; + pHurt->pev->velocity = pHurt->pev->velocity - gpGlobals->v_right * 100; + } + // Play a random attack hit sound + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackHitSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackHitSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + } + else // Play a random attack miss sound + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackMissSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackMissSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + + if (RANDOM_LONG(0,1)) + AttackSound(); + } + break; + + case ZOMBIE_AE_ATTACK_LEFT: + { + // do stuff for this event. + // ALERT( at_console, "Slash left!\n" ); + CBaseEntity *pHurt = CheckTraceHullAttack( 70, gSkillData.zombie3DmgOneSlash, DMG_SLASH ); + if ( pHurt ) + { + if ( pHurt->pev->flags & (FL_MONSTER|FL_CLIENT) ) + { + pHurt->pev->punchangle.z = 18; + pHurt->pev->punchangle.x = 5; + pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_right * 100; + } + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackHitSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackHitSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + } + else + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackMissSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackMissSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + + if (RANDOM_LONG(0,1)) + AttackSound(); + } + break; + + case ZOMBIE_AE_ATTACK_BOTH: + { + // do stuff for this event. + CBaseEntity *pHurt = CheckTraceHullAttack( 70, gSkillData.zombie3DmgBothSlash, DMG_SLASH ); + if ( pHurt ) + { + if ( pHurt->pev->flags & (FL_MONSTER|FL_CLIENT) ) + { + pHurt->pev->punchangle.x = 5; + pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_forward * -100; + } + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackHitSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackHitSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + } + else + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackMissSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackMissSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + + if (RANDOM_LONG(0,1)) + AttackSound(); + } + break; + + default: + CBaseMonster::HandleAnimEvent( pEvent ); + break; + } +} + +//========================================================= +// Spawn +//========================================================= +void CZombie3 :: Spawn() +{ + Precache( ); + + if (pev->model) + SET_MODEL(ENT(pev), STRING(pev->model)); //LRC + else + SET_MODEL(ENT(pev), "models/zombie3.mdl"); + UTIL_SetSize( pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX ); + + pev->solid = SOLID_SLIDEBOX; + pev->movetype = MOVETYPE_STEP; + m_bloodColor = BLOOD_COLOR_RED; + if (pev->health == 0) + pev->health = gSkillData.zombie3Health; + pev->view_ofs = VEC_VIEW;// position of the eyes relative to monster's origin. + m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result ) + m_MonsterState = MONSTERSTATE_NONE; + m_afCapability = bits_CAP_DOORS_GROUP; + + MonsterInit(); +} + +//========================================================= +// Precache - precaches all resources this monster needs +//========================================================= +void CZombie3 :: Precache() +{ + int i; + + if (pev->model) + PRECACHE_MODEL((char*)STRING(pev->model)); //LRC + else + PRECACHE_MODEL("models/zombie3.mdl"); + + for ( i = 0; i < ARRAYSIZE( pAttackHitSounds ); i++ ) + PRECACHE_SOUND((char *)pAttackHitSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pAttackMissSounds ); i++ ) + PRECACHE_SOUND((char *)pAttackMissSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pAttackSounds ); i++ ) + PRECACHE_SOUND((char *)pAttackSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pIdleSounds ); i++ ) + PRECACHE_SOUND((char *)pIdleSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pAlertSounds ); i++ ) + PRECACHE_SOUND((char *)pAlertSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pPainSounds ); i++ ) + PRECACHE_SOUND((char *)pPainSounds[i]); +} + +//========================================================= +// AI Schedules Specific to this monster +//========================================================= + diff --git a/dlls/aomdc/zombie4.cpp b/dlls/aomdc/zombie4.cpp new file mode 100644 index 00000000..2016945a --- /dev/null +++ b/dlls/aomdc/zombie4.cpp @@ -0,0 +1,256 @@ +/*** +* +* Copyright (c) 1996-2002, Valve LLC. All rights reserved. +* +* This product contains software technology licensed from Id +* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc. +* All Rights Reserved. +* +* This source code contains proprietary and confidential information of +* Valve LLC and its suppliers. Access to this code is restricted to +* persons who have executed a written SDK license with Valve. Any access, +* use or distribution of this code by or to any unlicensed person is illegal. +* +****/ +//========================================================= +// Zombie +//========================================================= + +#include "zombie.h" + + +class CZombie4 : public CZombie +{ +public: + void Spawn( void ); + void Precache( void ); + void HandleAnimEvent( MonsterEvent_t *pEvent ); + + void PainSound( void ); + void AlertSound( void ); + void IdleSound( void ); + void AttackSound( void ); + + static const char *pAttackSounds[]; + static const char *pIdleSounds[]; + static const char *pAlertSounds[]; + static const char *pPainSounds[]; + static const char *pAttackHitSounds[]; + static const char *pAttackMissSounds[]; +}; + +LINK_ENTITY_TO_CLASS( monster_zombie4, CZombie4 ); + +const char *CZombie4::pAttackHitSounds[] = +{ + "zombie4/claw_strike1.wav", + "zombie4/claw_strike2.wav", + "zombie4/claw_strike3.wav", +}; + +const char *CZombie4::pAttackMissSounds[] = +{ + "zombie4/claw_miss1.wav", + "zombie4/claw_miss2.wav", +}; + +const char *CZombie4::pAttackSounds[] = +{ + "zombie4/zo_attack1.wav", + "zombie4/zo_attack2.wav", +}; + +const char *CZombie4::pIdleSounds[] = +{ + "zombie4/zo_idle1.wav", + "zombie4/zo_idle2.wav", + "zombie4/zo_idle3.wav", + "zombie4/zo_idle4.wav", +}; + +const char *CZombie4::pAlertSounds[] = +{ + "zombie4/zo_alert10.wav", + "zombie4/zo_alert20.wav", + "zombie4/zo_alert30.wav", +}; + +const char *CZombie4::pPainSounds[] = +{ + "zombie4/zo_pain1.wav", + "zombie4/zo_pain2.wav", +}; + +void CZombie4 :: PainSound( void ) +{ + int pitch = 95 + RANDOM_LONG(0,9); + + if (RANDOM_LONG(0,5) < 2) + EMIT_SOUND_DYN ( ENT(pev), CHAN_VOICE, pPainSounds[ RANDOM_LONG(0,ARRAYSIZE(pPainSounds)-1) ], 1.0, ATTN_NORM, 0, pitch ); +} + +void CZombie4 :: AlertSound( void ) +{ + int pitch = 95 + RANDOM_LONG(0,9); + + EMIT_SOUND_DYN ( ENT(pev), CHAN_VOICE, pAlertSounds[ RANDOM_LONG(0,ARRAYSIZE(pAlertSounds)-1) ], 1.0, ATTN_NORM, 0, pitch ); +} + +void CZombie4 :: IdleSound( void ) +{ + int pitch = 95 + RANDOM_LONG(0,9); + + // Play a random idle sound + EMIT_SOUND_DYN ( ENT(pev), CHAN_VOICE, pIdleSounds[ RANDOM_LONG(0,ARRAYSIZE(pIdleSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); +} + +void CZombie4 :: AttackSound( void ) +{ + // Play a random attack sound + EMIT_SOUND_DYN ( ENT(pev), CHAN_VOICE, pAttackSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); +} + + +//========================================================= +// HandleAnimEvent - catches the monster-specific messages +// that occur when tagged animation frames are played. +//========================================================= +void CZombie4 :: HandleAnimEvent( MonsterEvent_t *pEvent ) +{ + switch( pEvent->event ) + { + case ZOMBIE_AE_ATTACK_RIGHT: + { + // do stuff for this event. + // ALERT( at_console, "Slash right!\n" ); + CBaseEntity *pHurt = CheckTraceHullAttack( 70, gSkillData.zombieDmgOneSlash, DMG_SLASH ); + if ( pHurt ) + { + if ( pHurt->pev->flags & (FL_MONSTER|FL_CLIENT) ) + { + pHurt->pev->punchangle.z = -18; + pHurt->pev->punchangle.x = 5; + pHurt->pev->velocity = pHurt->pev->velocity - gpGlobals->v_right * 100; + } + // Play a random attack hit sound + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackHitSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackHitSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + } + else // Play a random attack miss sound + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackMissSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackMissSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + + if (RANDOM_LONG(0,1)) + AttackSound(); + } + break; + + case ZOMBIE_AE_ATTACK_LEFT: + { + // do stuff for this event. + // ALERT( at_console, "Slash left!\n" ); + CBaseEntity *pHurt = CheckTraceHullAttack( 70, gSkillData.zombieDmgOneSlash, DMG_SLASH ); + if ( pHurt ) + { + if ( pHurt->pev->flags & (FL_MONSTER|FL_CLIENT) ) + { + pHurt->pev->punchangle.z = 18; + pHurt->pev->punchangle.x = 5; + pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_right * 100; + } + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackHitSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackHitSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + } + else + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackMissSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackMissSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + + if (RANDOM_LONG(0,1)) + AttackSound(); + } + break; + + case ZOMBIE_AE_ATTACK_BOTH: + { + // do stuff for this event. + CBaseEntity *pHurt = CheckTraceHullAttack( 70, gSkillData.zombieDmgBothSlash, DMG_SLASH ); + if ( pHurt ) + { + if ( pHurt->pev->flags & (FL_MONSTER|FL_CLIENT) ) + { + pHurt->pev->punchangle.x = 5; + pHurt->pev->velocity = pHurt->pev->velocity + gpGlobals->v_forward * -100; + } + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackHitSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackHitSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + } + else + EMIT_SOUND_DYN ( ENT(pev), CHAN_WEAPON, pAttackMissSounds[ RANDOM_LONG(0,ARRAYSIZE(pAttackMissSounds)-1) ], 1.0, ATTN_NORM, 0, 100 + RANDOM_LONG(-5,5) ); + + if (RANDOM_LONG(0,1)) + AttackSound(); + } + break; + + default: + CBaseMonster::HandleAnimEvent( pEvent ); + break; + } +} + +//========================================================= +// Spawn +//========================================================= +void CZombie4 :: Spawn() +{ + Precache( ); + + if (pev->model) + SET_MODEL(ENT(pev), STRING(pev->model)); //LRC + else + SET_MODEL(ENT(pev), "models/zombie4.mdl"); + UTIL_SetSize( pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX ); + + pev->solid = SOLID_SLIDEBOX; + pev->movetype = MOVETYPE_STEP; + m_bloodColor = BLOOD_COLOR_RED; + if (pev->health == 0) + pev->health = gSkillData.zombieHealth; + pev->view_ofs = VEC_VIEW;// position of the eyes relative to monster's origin. + m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result ) + m_MonsterState = MONSTERSTATE_NONE; + m_afCapability = bits_CAP_DOORS_GROUP; + + MonsterInit(); +} + +//========================================================= +// Precache - precaches all resources this monster needs +//========================================================= +void CZombie4 :: Precache() +{ + int i; + + if (pev->model) + PRECACHE_MODEL((char*)STRING(pev->model)); //LRC + else + PRECACHE_MODEL("models/zombie4.mdl"); + + for ( i = 0; i < ARRAYSIZE( pAttackHitSounds ); i++ ) + PRECACHE_SOUND((char *)pAttackHitSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pAttackMissSounds ); i++ ) + PRECACHE_SOUND((char *)pAttackMissSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pAttackSounds ); i++ ) + PRECACHE_SOUND((char *)pAttackSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pIdleSounds ); i++ ) + PRECACHE_SOUND((char *)pIdleSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pAlertSounds ); i++ ) + PRECACHE_SOUND((char *)pAlertSounds[i]); + + for ( i = 0; i < ARRAYSIZE( pPainSounds ); i++ ) + PRECACHE_SOUND((char *)pPainSounds[i]); +} + +//========================================================= +// AI Schedules Specific to this monster +//========================================================= + diff --git a/dlls/barnacle.cpp b/dlls/barnacle.cpp index 51acf4a2..22bad941 100644 --- a/dlls/barnacle.cpp +++ b/dlls/barnacle.cpp @@ -119,13 +119,13 @@ void CBarnacle::Spawn() if (pev->model) SET_MODEL(ENT(pev), STRING(pev->model)); //LRC else - SET_MODEL( ENT( pev ), "models/barnacle.mdl" ); + SET_MODEL( ENT( pev ), "models/mouth_monster.mdl" ); UTIL_SetSize( pev, Vector( -16, -16, -32 ), Vector( 16, 16, 0 ) ); pev->solid = SOLID_SLIDEBOX; pev->movetype = MOVETYPE_NONE; pev->takedamage = DAMAGE_AIM; - m_bloodColor = BLOOD_COLOR_RED; + m_bloodColor = DONT_BLEED; pev->effects = EF_INVLIGHT; // take light from the ceiling pev->health = 25; m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result ) @@ -411,7 +411,7 @@ void CBarnacle::Precache() if (pev->model) PRECACHE_MODEL(STRING(pev->model)); //LRC else - PRECACHE_MODEL( "models/barnacle.mdl" ); + PRECACHE_MODEL( "models/mouth_monster.mdl" ); PRECACHE_SOUND( "barnacle/bcl_alert2.wav" );//happy, lifting food up PRECACHE_SOUND( "barnacle/bcl_bite3.wav" );//just got food to mouth diff --git a/dlls/bmodels.cpp b/dlls/bmodels.cpp index c37ae757..25d2bfa4 100644 --- a/dlls/bmodels.cpp +++ b/dlls/bmodels.cpp @@ -163,6 +163,45 @@ void CFuncWallToggle::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TY } } +class CFuncLol : public CFuncWall +{ +public: + void Spawn( void ); + void EXPORT Lol(); +}; + +LINK_ENTITY_TO_CLASS( func_lol, CFuncLol ) + +void CFuncLol::Spawn() +{ + CFuncWall::Spawn(); + SetThink( &CFuncLol::Lol ); + pev->nextthink = gpGlobals->time + 1.0; +} + +void CFuncLol::Lol() +{ + for( int i = 1; i <= gpGlobals->maxClients; i++ ) + { + CBaseEntity *pPlayer = UTIL_PlayerByIndex( i ); + if( pPlayer ) + { + if( !UTIL_FileExists( "gmgeneral1.aomdc" ) || !UTIL_FileExists( "gmgeneral2.aomdc" ) + || !UTIL_FileExists( "gmgeneral3.aomdc" ) || !UTIL_FileExists( "gmgeneral4.aomdc" ) ) + { + SetBits( pev->effects, EF_NODRAW ); + } + else + { + ClearBits( pev->effects, EF_NODRAW ); + } + + pev->nextthink = gpGlobals->time + 1.0; + return; + } + } +} + #define SF_CONVEYOR_VISUAL 0x0001 #define SF_CONVEYOR_NOTSOLID 0x0002 diff --git a/dlls/bullsquid.cpp b/dlls/bullsquid.cpp index 86c6168e..82be6fda 100644 --- a/dlls/bullsquid.cpp +++ b/dlls/bullsquid.cpp @@ -687,7 +687,7 @@ void CBullsquid::Spawn() pev->solid = SOLID_SLIDEBOX; pev->movetype = MOVETYPE_STEP; - m_bloodColor = BLOOD_COLOR_GREEN; + m_bloodColor = BLOOD_COLOR_RED; pev->effects = 0; if (pev->health == 0) pev->health = gSkillData.bullsquidHealth; diff --git a/dlls/cbase.h b/dlls/cbase.h index 4985ce03..2ec63162 100644 --- a/dlls/cbase.h +++ b/dlls/cbase.h @@ -450,13 +450,11 @@ public: //We use this variables to store each ammo count. int ammo_9mm; int ammo_357; - int ammo_bolts; + int ammo_50ae; int ammo_buckshot; - int ammo_rockets; - int ammo_uranium; - int ammo_hornets; - int ammo_argrens; - //Special stuff for grenades and satchels. + int ammo_9mmar; + + // Special stuff for grenades and satchels. float m_flStartThrow; float m_flReleaseThrow; int m_chargeReady; @@ -737,6 +735,7 @@ public: #define DMG_SLOWBURN (1 << 21) // in an oven #define DMG_SLOWFREEZE (1 << 22) // in a subzero freezer #define DMG_MORTAR (1 << 23) // Hit by air raid (done to distinguish grenade from mortar) +#define DMG_SPEAR (1 << 24) // these are the damage types that are allowed to gib corpses #define DMG_GIB_CORPSE ( DMG_CRUSH | DMG_FALL | DMG_BLAST | DMG_SONIC | DMG_CLUB ) diff --git a/dlls/cdll_dll.h b/dlls/cdll_dll.h index 228ed94d..39af82e6 100644 --- a/dlls/cdll_dll.h +++ b/dlls/cdll_dll.h @@ -31,7 +31,10 @@ #define HIDEHUD_FLASHLIGHT ( 1<<1 ) #define HIDEHUD_ALL ( 1<<2 ) #define HIDEHUD_HEALTH ( 1<<3 ) -#define HIDEHUD_CUSTOMCROSSHAIR ( 1<<4 ) //LRC - probably not the right way to do this, but it's just an experiment. +#define HIDEHUD_BLACKBARS ( 1<<4 ) +#define HIDEHUD_ALL_EXCLUDEMESSAGE ( 1<<5 ) +#define HIDEHUD_NOISEEFFECT ( 1<<6 ) +#define HIDEHUD_CUSTOMCROSSHAIR ( 1<<7 ) //LRC - probably not the right way to do this, but it's just an experiment. #define MAX_AMMO_TYPES 32 // ??? #define MAX_AMMO_SLOTS 32 // not really slots @@ -41,6 +44,6 @@ #define HUD_PRINTTALK 3 #define HUD_PRINTCENTER 4 - +#define WEAPON_FLASHLIGHT 30 #define WEAPON_SUIT 31 #endif diff --git a/dlls/client.cpp b/dlls/client.cpp index 015b09c0..fb05e5d3 100644 --- a/dlls/client.cpp +++ b/dlls/client.cpp @@ -857,6 +857,7 @@ void ClientPrecache( void ) // setup precaches always needed PRECACHE_SOUND( "player/sprayer.wav" ); // spray paint sound for PreAlpha + PRECACHE_SOUND( "davidbad/thunder_hit.wav" ); // PRECACHE_SOUND( "player/pl_jumpland2.wav" ); // UNDONE: play 2x step sound PRECACHE_SOUND( "player/pl_fallpain2.wav" ); @@ -1797,12 +1798,9 @@ void UpdateClientData( const struct edict_s *ent, int sendweapons, struct client cd->fuser3 = pl->m_flAmmoStartCharge; cd->vuser1.x = pl->ammo_9mm; cd->vuser1.y = pl->ammo_357; - cd->vuser1.z = pl->ammo_argrens; - cd->ammo_nails = pl->ammo_bolts; + cd->vuser1.z = pl->ammo_9mmar; + cd->ammo_nails = pl->ammo_50ae; cd->ammo_shells = pl->ammo_buckshot; - cd->ammo_rockets = pl->ammo_rockets; - cd->ammo_cells = pl->ammo_uranium; - cd->vuser2.x = pl->ammo_hornets; if( pl->m_pActiveItem ) { @@ -1819,12 +1817,6 @@ void UpdateClientData( const struct edict_s *ent, int sendweapons, struct client cd->vuser4.x = gun->m_iPrimaryAmmoType; cd->vuser4.y = pl->m_rgAmmo[gun->m_iPrimaryAmmoType]; cd->vuser4.z = pl->m_rgAmmo[gun->m_iSecondaryAmmoType]; - - if( pl->m_pActiveItem->m_iId == WEAPON_RPG ) - { - cd->vuser2.y = ( (CRpg *)pl->m_pActiveItem )->m_fSpotActive; - cd->vuser2.z = ( (CRpg *)pl->m_pActiveItem )->m_cActiveRockets; - } } } } diff --git a/dlls/combat.cpp b/dlls/combat.cpp index 887811df..61162758 100644 --- a/dlls/combat.cpp +++ b/dlls/combat.cpp @@ -1432,6 +1432,8 @@ void CBaseEntity::FireBullets( ULONG cShots, Vector vecSrc, Vector vecDirShootin if( pevAttacker == NULL ) pevAttacker = pev; // the default attacker is ourselves + UTIL_MuzzleLight( vecSrc, 200.0f, 220, 220, 220, 0.1f, 100.0f ); + ClearMultiDamage(); gMultiDamage.type = DMG_BULLET | DMG_NEVERGIB; @@ -1525,7 +1527,7 @@ void CBaseEntity::FireBullets( ULONG cShots, Vector vecSrc, Vector vecDirShootin break; case BULLET_PLAYER_357: - pEntity->TraceAttack(pevAttacker, gSkillData.plrDmg357, vecDir, &tr, DMG_BULLET); + pEntity->TraceAttack(pevAttacker, gSkillData.plrDmgRevolver, vecDir, &tr, DMG_BULLET); if ( !tracer ) { TEXTURETYPE_PlaySound(&tr, vecSrc, vecEnd, iBulletType); @@ -1572,6 +1574,8 @@ Vector CBaseEntity::FireBulletsPlayer( ULONG cShots, Vector vecSrc, Vector vecDi if( pevAttacker == NULL ) pevAttacker = pev; // the default attacker is ourselves + UTIL_MuzzleLight( vecSrc, 200.0f, 220, 220, 220, 0.1f, 100.0f ); + ClearMultiDamage(); gMultiDamage.type = DMG_BULLET | DMG_NEVERGIB; @@ -1598,7 +1602,7 @@ Vector CBaseEntity::FireBulletsPlayer( ULONG cShots, Vector vecSrc, Vector vecDi if( iDamage ) { - pEntity->TraceAttack( pevAttacker, iDamage, vecDir, &tr, DMG_BULLET | ( ( iDamage > 16 ) ? DMG_ALWAYSGIB : DMG_NEVERGIB ) ); + pEntity->TraceAttack( pevAttacker, iDamage, vecDir, &tr, DMG_BULLET | DMG_NEVERGIB ); TEXTURETYPE_PlaySound( &tr, vecSrc, vecEnd, iBulletType ); DecalGunshot( &tr, iBulletType ); @@ -1607,17 +1611,17 @@ Vector CBaseEntity::FireBulletsPlayer( ULONG cShots, Vector vecSrc, Vector vecDi { default: case BULLET_PLAYER_9MM: - pEntity->TraceAttack( pevAttacker, gSkillData.plrDmg9MM, vecDir, &tr, DMG_BULLET ); + pEntity->TraceAttack( pevAttacker, gSkillData.plrDmgGlock, vecDir, &tr, DMG_BULLET ); break; case BULLET_PLAYER_MP5: - pEntity->TraceAttack( pevAttacker, gSkillData.plrDmgMP5, vecDir, &tr, DMG_BULLET ); + pEntity->TraceAttack( pevAttacker, gSkillData.plrDmgMP5K, vecDir, &tr, DMG_BULLET ); break; 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 ); + pEntity->TraceAttack( pevAttacker, gSkillData.plrDmgRevolver, vecDir, &tr, DMG_BULLET ); break; case BULLET_NONE: // FIX pEntity->TraceAttack( pevAttacker, 50, vecDir, &tr, DMG_CLUB ); diff --git a/dlls/controller.cpp b/dlls/controller.cpp index 4fed2a3d..57df013b 100644 --- a/dlls/controller.cpp +++ b/dlls/controller.cpp @@ -362,13 +362,13 @@ void CController::Spawn() if (pev->model) SET_MODEL(ENT(pev), STRING(pev->model)); //LRC else - SET_MODEL( ENT( pev ), "models/controller.mdl" ); - UTIL_SetSize( pev, Vector( -32, -32, 0 ), Vector( 32, 32, 64 ) ); + SET_MODEL( ENT( pev ), "models/controller.mdl" ); + UTIL_SetSize( pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX ); pev->solid = SOLID_SLIDEBOX; pev->movetype = MOVETYPE_FLY; pev->flags |= FL_FLY; - m_bloodColor = BLOOD_COLOR_GREEN; + m_bloodColor = DONT_BLEED; if (pev->health == 0) pev->health = gSkillData.controllerHealth; pev->view_ofs = Vector( 0, 0, -2 );// position of the eyes relative to monster's origin. @@ -386,7 +386,7 @@ void CController::Precache() if (pev->model) PRECACHE_MODEL(STRING(pev->model)); //LRC else - PRECACHE_MODEL( "models/controller.mdl" ); + PRECACHE_MODEL( "models/controller.mdl" ); PRECACHE_SOUND_ARRAY( pAttackSounds ); PRECACHE_SOUND_ARRAY( pIdleSounds ); diff --git a/dlls/doors.cpp b/dlls/doors.cpp index a3c11ef9..039ee47e 100644 --- a/dlls/doors.cpp +++ b/dlls/doors.cpp @@ -24,7 +24,6 @@ #include "doors.h" #include "movewith.h" #include "game.h" -#include "weapons.h" extern void SetMovedir( entvars_t *ev ); @@ -966,13 +965,6 @@ void CBaseDoor::Blocked( CBaseEntity *pOther ) if( pev->dmg ) pOther->TakeDamage( pev, pev, pev->dmg, DMG_CRUSH ); - if( satchelfix.value ) - { - // Detonate satchels - if( !strcmp( "monster_satchel", STRING( pOther->pev->classname ) ) ) - ( (CSatchel*)pOther )->Use( this, this, USE_ON, 0 ); - } - // if a door has a negative wait, it would never come back if blocked, // so let it just squash the object to death real fast if( m_flWait >= 0 ) diff --git a/dlls/effects.cpp b/dlls/effects.cpp index 321d8de1..814905a6 100644 --- a/dlls/effects.cpp +++ b/dlls/effects.cpp @@ -1647,6 +1647,7 @@ void CSprite::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useTy #define SF_ENVMODEL_OFF 1 #define SF_ENVMODEL_DROPTOFLOOR 2 #define SF_ENVMODEL_SOLID 4 +#define SF_ENVMODEL_REPEATABLE 16 class CEnvModel : public CBaseAnimating { @@ -1668,6 +1669,7 @@ class CEnvModel : public CBaseAnimating string_t m_iszSequence_Off; int m_iAction_On; int m_iAction_Off; + int m_iAnim_Speed; }; TYPEDESCRIPTION CEnvModel::m_SaveData[] = @@ -1703,6 +1705,11 @@ void CEnvModel::KeyValue( KeyValueData *pkvd ) m_iAction_Off = atoi(pkvd->szValue); pkvd->fHandled = TRUE; } + else if (FStrEq(pkvd->szKeyName, "m_iAnim_Speed")) + { + m_iAnim_Speed = atoi(pkvd->szValue); + pkvd->fHandled = TRUE; + } else { CBaseAnimating::KeyValue( pkvd ); @@ -1727,6 +1734,16 @@ void CEnvModel :: Spawn( void ) DROP_TO_FLOOR ( ENT(pev) ); } + if( pev->spawnflags & SF_ENVMODEL_REPEATABLE ) + { + pev->sequence = 1; + pev->animtime = gpGlobals->time; + if( m_iAnim_Speed > 0 ) + pev->framerate = m_iAnim_Speed; + else + pev->framerate = 1.0; + } + SetBoneController( 0, 0 ); SetBoneController( 1, 0 ); @@ -1737,7 +1754,7 @@ void CEnvModel :: Spawn( void ) void CEnvModel::Precache( void ) { - PRECACHE_MODEL( (char *)STRING(pev->model) ); + PRECACHE_MODEL( STRING(pev->model) ); } STATE CEnvModel::GetState( void ) @@ -1768,6 +1785,9 @@ void CEnvModel::Think( void ) // ALERT(at_console, "env_model Think fr=%f\n", pev->framerate); + if( pev->spawnflags & SF_ENVMODEL_REPEATABLE ) + return; + StudioFrameAdvance ( ); // set m_fSequenceFinished if necessary // if (m_fSequenceLoops) @@ -4573,3 +4593,105 @@ void CParticle::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use //ALERT(at_console, "Setting body %d\n", pev->body); } } + +//========================================================= +// env_hidehud, Hide/Unhide the HUD +//========================================================= +class CEnvHideHUD : public CPointEntity +{ +public: + void Spawn( void ); + void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); +}; + +LINK_ENTITY_TO_CLASS( env_drawbars, CEnvHideHUD ) +LINK_ENTITY_TO_CLASS( env_hidehud, CEnvHideHUD ) +LINK_ENTITY_TO_CLASS( env_drawstatic, CEnvHideHUD ) + +void CEnvHideHUD::Spawn( void ) +{ + pev->effects = EF_NODRAW; + pev->solid = SOLID_NOT; + pev->movetype = MOVETYPE_NONE; +} + +void CEnvHideHUD::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) +{ + CBasePlayer *pPlayer = NULL; + + if( pActivator && pActivator->IsPlayer() ) + pPlayer = (CBasePlayer *)pActivator; + else + pPlayer = (CBasePlayer *)CBaseEntity::Instance( g_engfuncs.pfnPEntityOfEntIndex( 1 ) ); + + if( pPlayer ) + { + if( FClassnameIs( pev, "env_drawbars" ) ) + { + if( pPlayer->m_iHideHUD == HIDEHUD_BLACKBARS ) + ClearBits( pPlayer->m_iHideHUD, HIDEHUD_BLACKBARS ); + else + SetBits( pPlayer->m_iHideHUD, HIDEHUD_BLACKBARS ); + } + else if( FClassnameIs( pev, "env_hidehud" ) ) + { + if( pPlayer->m_iHideHUD == HIDEHUD_ALL_EXCLUDEMESSAGE ) + ClearBits( pPlayer->m_iHideHUD, HIDEHUD_ALL_EXCLUDEMESSAGE ); + else + SetBits( pPlayer->m_iHideHUD, HIDEHUD_ALL_EXCLUDEMESSAGE ); + } + else if( FClassnameIs( pev, "env_drawstatic" ) ) + { + if( pPlayer->m_iHideHUD == HIDEHUD_NOISEEFFECT ) + ClearBits( pPlayer->m_iHideHUD, HIDEHUD_NOISEEFFECT ); + else + SetBits( pPlayer->m_iHideHUD, HIDEHUD_NOISEEFFECT ); + } + } +} + +class CEnvGameBeaten : public CPointEntity +{ +public: + void Spawn( void ); + void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ); +}; + +LINK_ENTITY_TO_CLASS( env_gamebeaten1, CEnvGameBeaten ); +LINK_ENTITY_TO_CLASS( env_gamebeaten2, CEnvGameBeaten ); +LINK_ENTITY_TO_CLASS( env_gamebeaten3, CEnvGameBeaten ); +LINK_ENTITY_TO_CLASS( env_gamebeaten4, CEnvGameBeaten ); + +void CEnvGameBeaten::Spawn( void ) +{ + pev->effects = EF_NODRAW; + pev->solid = SOLID_NOT; + pev->movetype = MOVETYPE_NONE; +} + +void CEnvGameBeaten::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) +{ + CBaseEntity *pPlayer = NULL; + + if( pActivator && pActivator->IsPlayer() ) + pPlayer = pActivator; + else + pPlayer = CBaseEntity::Instance( g_engfuncs.pfnPEntityOfEntIndex( 1 ) ); + + if( pPlayer ) + { + FILE *fp; + char filename[32]; + const char *pGameBeatenNum = STRING( pev->classname ); + + pGameBeatenNum += ( strlen( pGameBeatenNum ) - 1 ); + sprintf( filename, "gmgeneral%c.aomdc", *pGameBeatenNum ); + + fp = fopen( filename, "wt" ); + + if( !fp ) return; + + fprintf( fp, "Beaten Ending%c = 1", *pGameBeatenNum ); + fclose( fp ); + } +} diff --git a/dlls/func_break.cpp b/dlls/func_break.cpp index 709a6c2b..5cdb1852 100644 --- a/dlls/func_break.cpp +++ b/dlls/func_break.cpp @@ -39,25 +39,26 @@ 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 + "item_flashlight", // 3 + "weapon_axe", // 4 + "weapon_beretta", // 5 + "weapon_deagle", // 6 + "weapon_glock", // 7 + "weapon_hammer", // 8 + "weapon_knife", // 9 + "weapon_mp5k", // 10 + "weapon_P228", // 11 + "weapon_revolver", // 12 + "weapon_shotgun", // 13 + "weapon_uzi", // 14 + "ammo_beretta", // 15 + "ammo_deagle", // 16 + "ammo_glock", // 17 + "ammo_mp5k", // 18 + "ammo_P228", // 19 + "ammo_revolver", // 20 + "ammo_shotgun", // 21 + "ammo_uzi" // 22 }; void CBreakable::KeyValue( KeyValueData* pkvd ) diff --git a/dlls/game.cpp b/dlls/game.cpp index c84c907c..bfa444ec 100644 --- a/dlls/game.cpp +++ b/dlls/game.cpp @@ -31,7 +31,6 @@ cvar_t friendlyfire = { "mp_friendlyfire","0", FCVAR_SERVER }; cvar_t falldamage = { "mp_falldamage","0", FCVAR_SERVER }; cvar_t weaponstay = { "mp_weaponstay","0", FCVAR_SERVER }; cvar_t selfgauss = { "mp_selfgauss", "1", FCVAR_SERVER }; -cvar_t satchelfix = { "mp_satchelfix", "0", FCVAR_SERVER }; cvar_t forcerespawn = { "mp_forcerespawn","1", FCVAR_SERVER }; cvar_t flashlight = { "mp_flashlight","0", FCVAR_SERVER }; cvar_t aimcrosshair = { "mp_autocrosshair","1", FCVAR_SERVER }; @@ -40,6 +39,7 @@ cvar_t teamlist = { "mp_teamlist","hgrunt;scientist", FCVAR_SERVER }; cvar_t teamoverride = { "mp_teamoverride","1" }; cvar_t defaultteam = { "mp_defaultteam","0" }; cvar_t allowmonsters = { "mp_allowmonsters","0", FCVAR_SERVER }; +cvar_t infiniteflashlight = { "sv_infiniteflashlight", "0", FCVAR_SERVER }; cvar_t bhopcap = { "mp_bhopcap", "1", FCVAR_SERVER }; cvar_t impulsetarget={"sohl_impulsetarget","0", FCVAR_SERVER }; //LRC - trigger ents manually @@ -250,6 +250,15 @@ cvar_t sk_snark_dmg_pop1 = {"sk_snark_dmg_pop1","0"}; cvar_t sk_snark_dmg_pop2 = {"sk_snark_dmg_pop2","0"}; cvar_t sk_snark_dmg_pop3 = {"sk_snark_dmg_pop3","0"}; +// Wheelchair Monster +cvar_t sk_wheelchair_health1 = {"sk_wheelchair_health1","0"}; +cvar_t sk_wheelchair_health2 = {"sk_wheelchair_health2","0"}; +cvar_t sk_wheelchair_health3 = {"sk_wheelchair_health3","0"}; + +cvar_t sk_wheelchair_dmg_attack1 = {"sk_wheelchair_dmg_attack1","0"}; +cvar_t sk_wheelchair_dmg_attack2 = {"sk_wheelchair_dmg_attack2","0"}; +cvar_t sk_wheelchair_dmg_attack3 = {"sk_wheelchair_dmg_attack3","0"}; + // Zombie cvar_t sk_zombie_health1 = {"sk_zombie_health1","0"}; cvar_t sk_zombie_health2 = {"sk_zombie_health2","0"}; @@ -263,6 +272,32 @@ cvar_t sk_zombie_dmg_both_slash1 = {"sk_zombie_dmg_both_slash1","0"}; cvar_t sk_zombie_dmg_both_slash2 = {"sk_zombie_dmg_both_slash2","0"}; cvar_t sk_zombie_dmg_both_slash3 = {"sk_zombie_dmg_both_slash3","0"}; +// Zombie2 +cvar_t sk_zombie2_health1 = {"sk_zombie2_health1","0"}; +cvar_t sk_zombie2_health2 = {"sk_zombie2_health2","0"}; +cvar_t sk_zombie2_health3 = {"sk_zombie2_health3","0"}; + +cvar_t sk_zombie2_dmg_one_slash1 = {"sk_zombie2_dmg_one_slash1","0"}; +cvar_t sk_zombie2_dmg_one_slash2 = {"sk_zombie2_dmg_one_slash2","0"}; +cvar_t sk_zombie2_dmg_one_slash3 = {"sk_zombie2_dmg_one_slash3","0"}; + +cvar_t sk_zombie2_dmg_both_slash1 = {"sk_zombie2_dmg_both_slash1","0"}; +cvar_t sk_zombie2_dmg_both_slash2 = {"sk_zombie2_dmg_both_slash2","0"}; +cvar_t sk_zombie2_dmg_both_slash3 = {"sk_zombie2_dmg_both_slash3","0"}; + +// Zombie3 +cvar_t sk_zombie3_health1 = {"sk_zombie3_health1","0"}; +cvar_t sk_zombie3_health2 = {"sk_zombie3_health2","0"}; +cvar_t sk_zombie3_health3 = {"sk_zombie3_health3","0"}; + +cvar_t sk_zombie3_dmg_one_slash1 = {"sk_zombie3_dmg_one_slash1","0"}; +cvar_t sk_zombie3_dmg_one_slash2 = {"sk_zombie3_dmg_one_slash2","0"}; +cvar_t sk_zombie3_dmg_one_slash3 = {"sk_zombie3_dmg_one_slash3","0"}; + +cvar_t sk_zombie3_dmg_both_slash1 = {"sk_zombie3_dmg_both_slash1","0"}; +cvar_t sk_zombie3_dmg_both_slash2 = {"sk_zombie3_dmg_both_slash2","0"}; +cvar_t sk_zombie3_dmg_both_slash3 = {"sk_zombie3_dmg_both_slash3","0"}; + //Turret cvar_t sk_turret_health1 = {"sk_turret_health1","0"}; cvar_t sk_turret_health2 = {"sk_turret_health2","0"}; @@ -280,89 +315,61 @@ cvar_t sk_sentry_health3 = {"sk_sentry_health3","0"}; // PLAYER WEAPONS -// Crowbar whack -cvar_t sk_plr_crowbar1 = {"sk_plr_crowbar1","0"}; -cvar_t sk_plr_crowbar2 = {"sk_plr_crowbar2","0"}; -cvar_t sk_plr_crowbar3 = {"sk_plr_crowbar3","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"}; + +// Hammer whack +cvar_t sk_plr_hammer1 = {"sk_plr_hammer1","0"}; +cvar_t sk_plr_hammer2 = {"sk_plr_hammer2","0"}; +cvar_t sk_plr_hammer3 = {"sk_plr_hammer3","0"}; + +// Axe slash +cvar_t sk_plr_axe1 = {"sk_plr_axe1","0"}; +cvar_t sk_plr_axe2 = {"sk_plr_axe2","0"}; +cvar_t sk_plr_axe3 = {"sk_plr_axe3","0"}; // Glock Round -cvar_t sk_plr_9mm_bullet1 = {"sk_plr_9mm_bullet1","0"}; -cvar_t sk_plr_9mm_bullet2 = {"sk_plr_9mm_bullet2","0"}; -cvar_t sk_plr_9mm_bullet3 = {"sk_plr_9mm_bullet3","0"}; +cvar_t sk_plr_glock1 = {"sk_plr_glock1","0"}; +cvar_t sk_plr_glock2 = {"sk_plr_glock2","0"}; +cvar_t sk_plr_glock3 = {"sk_plr_glock3","0"}; -// 357 Round -cvar_t sk_plr_357_bullet1 = {"sk_plr_357_bullet1","0"}; -cvar_t sk_plr_357_bullet2 = {"sk_plr_357_bullet2","0"}; -cvar_t sk_plr_357_bullet3 = {"sk_plr_357_bullet3","0"}; +// Beretta round +cvar_t sk_plr_beretta1 = {"sk_plr_beretta1","0"}; +cvar_t sk_plr_beretta2 = {"sk_plr_beretta2","0"}; +cvar_t sk_plr_beretta3 = {"sk_plr_beretta3","0"}; -// MP5 Round +// P228 round +cvar_t sk_plr_p2281 = {"sk_plr_p2281","0"}; +cvar_t sk_plr_p2282 = {"sk_plr_p2282","0"}; +cvar_t sk_plr_p2283 = {"sk_plr_p2283","0"}; + +// Revolver round +cvar_t sk_plr_revolver1 = {"sk_plr_revolver1","0"}; +cvar_t sk_plr_revolver2 = {"sk_plr_revolver2","0"}; +cvar_t sk_plr_revolver3 = {"sk_plr_revolver3","0"}; + +// Uzi round +cvar_t sk_plr_uzi1 = {"sk_plr_uzi1","0"}; +cvar_t sk_plr_uzi2 = {"sk_plr_uzi2","0"}; +cvar_t sk_plr_uzi3 = {"sk_plr_uzi3","0"}; + +// MP5K Round cvar_t sk_plr_9mmAR_bullet1 = {"sk_plr_9mmAR_bullet1","0"}; cvar_t sk_plr_9mmAR_bullet2 = {"sk_plr_9mmAR_bullet2","0"}; cvar_t sk_plr_9mmAR_bullet3 = {"sk_plr_9mmAR_bullet3","0"}; - -// M203 grenade -cvar_t sk_plr_9mmAR_grenade1 = {"sk_plr_9mmAR_grenade1","0"}; -cvar_t sk_plr_9mmAR_grenade2 = {"sk_plr_9mmAR_grenade2","0"}; -cvar_t sk_plr_9mmAR_grenade3 = {"sk_plr_9mmAR_grenade3","0"}; - +// Deagle round +cvar_t sk_plr_deagle1 = {"sk_plr_deagle1","0"}; +cvar_t sk_plr_deagle2 = {"sk_plr_deagle2","0"}; +cvar_t sk_plr_deagle3 = {"sk_plr_deagle3","0"}; // Shotgun buckshot cvar_t sk_plr_buckshot1 = {"sk_plr_buckshot1","0"}; cvar_t sk_plr_buckshot2 = {"sk_plr_buckshot2","0"}; cvar_t sk_plr_buckshot3 = {"sk_plr_buckshot3","0"}; - -// Crossbow -cvar_t sk_plr_xbow_bolt_client1 = {"sk_plr_xbow_bolt_client1","0"}; -cvar_t sk_plr_xbow_bolt_client2 = {"sk_plr_xbow_bolt_client2","0"}; -cvar_t sk_plr_xbow_bolt_client3 = {"sk_plr_xbow_bolt_client3","0"}; - -cvar_t sk_plr_xbow_bolt_monster1 = {"sk_plr_xbow_bolt_monster1","0"}; -cvar_t sk_plr_xbow_bolt_monster2 = {"sk_plr_xbow_bolt_monster2","0"}; -cvar_t sk_plr_xbow_bolt_monster3 = {"sk_plr_xbow_bolt_monster3","0"}; - - -// RPG -cvar_t sk_plr_rpg1 = {"sk_plr_rpg1","0"}; -cvar_t sk_plr_rpg2 = {"sk_plr_rpg2","0"}; -cvar_t sk_plr_rpg3 = {"sk_plr_rpg3","0"}; - - -// Zero Point Generator -cvar_t sk_plr_gauss1 = {"sk_plr_gauss1","0"}; -cvar_t sk_plr_gauss2 = {"sk_plr_gauss2","0"}; -cvar_t sk_plr_gauss3 = {"sk_plr_gauss3","0"}; - - -// Tau Cannon -cvar_t sk_plr_egon_narrow1 = {"sk_plr_egon_narrow1","0"}; -cvar_t sk_plr_egon_narrow2 = {"sk_plr_egon_narrow2","0"}; -cvar_t sk_plr_egon_narrow3 = {"sk_plr_egon_narrow3","0"}; - -cvar_t sk_plr_egon_wide1 = {"sk_plr_egon_wide1","0"}; -cvar_t sk_plr_egon_wide2 = {"sk_plr_egon_wide2","0"}; -cvar_t sk_plr_egon_wide3 = {"sk_plr_egon_wide3","0"}; - - -// Hand Grendade -cvar_t sk_plr_hand_grenade1 = {"sk_plr_hand_grenade1","0"}; -cvar_t sk_plr_hand_grenade2 = {"sk_plr_hand_grenade2","0"}; -cvar_t sk_plr_hand_grenade3 = {"sk_plr_hand_grenade3","0"}; - - -// Satchel Charge -cvar_t sk_plr_satchel1 = {"sk_plr_satchel1","0"}; -cvar_t sk_plr_satchel2 = {"sk_plr_satchel2","0"}; -cvar_t sk_plr_satchel3 = {"sk_plr_satchel3","0"}; - - -// 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"}; - - // WORLD WEAPONS cvar_t sk_12mm_bullet1 = {"sk_12mm_bullet1","0"}; cvar_t sk_12mm_bullet2 = {"sk_12mm_bullet2","0"}; @@ -472,7 +479,6 @@ void GameDLLInit( void ) CVAR_REGISTER( &falldamage ); CVAR_REGISTER( &weaponstay ); CVAR_REGISTER( &selfgauss ); - CVAR_REGISTER( &satchelfix ); CVAR_REGISTER( &forcerespawn ); CVAR_REGISTER( &flashlight ); CVAR_REGISTER( &aimcrosshair ); @@ -481,8 +487,9 @@ void GameDLLInit( void ) CVAR_REGISTER( &teamoverride ); CVAR_REGISTER( &defaultteam ); CVAR_REGISTER( &allowmonsters ); - CVAR_REGISTER (&impulsetarget); //LRC - CVAR_REGISTER (&mw_debug); //LRC + CVAR_REGISTER( &infiniteflashlight ); + CVAR_REGISTER( &impulsetarget ); //LRC + CVAR_REGISTER( &mw_debug ); //LRC CVAR_REGISTER( &bhopcap ); CVAR_REGISTER( &mp_chattime ); @@ -676,6 +683,15 @@ void GameDLLInit( void ) CVAR_REGISTER( &sk_snark_dmg_pop2 );// {"sk_snark_dmg_pop2","0"}; CVAR_REGISTER( &sk_snark_dmg_pop3 );// {"sk_snark_dmg_pop3","0"}; + // Wheelchair Monster + CVAR_REGISTER( &sk_wheelchair_health1 );// {"sk_wheelchair_health1","0"}; + CVAR_REGISTER( &sk_wheelchair_health2 );// {"sk_wheelchair_health2","0"}; + CVAR_REGISTER( &sk_wheelchair_health3 );// {"sk_wheelchair_health3","0"}; + + CVAR_REGISTER( &sk_wheelchair_dmg_attack1 );// {"sk_wheelchair_dmg_attack1","0"}; + CVAR_REGISTER( &sk_wheelchair_dmg_attack2 );// {"sk_wheelchair_dmg_attack2","0"}; + CVAR_REGISTER( &sk_wheelchair_dmg_attack3 );// {"sk_wheelchair_dmg_attack3","0"}; + // Zombie CVAR_REGISTER( &sk_zombie_health1 );// {"sk_zombie_health1","0"}; CVAR_REGISTER( &sk_zombie_health2 );// {"sk_zombie_health3","0"}; @@ -689,6 +705,32 @@ void GameDLLInit( void ) CVAR_REGISTER( &sk_zombie_dmg_both_slash2 );// {"sk_zombie_dmg_both_slash2","0"}; CVAR_REGISTER( &sk_zombie_dmg_both_slash3 );// {"sk_zombie_dmg_both_slash3","0"}; + // Zombie2 + CVAR_REGISTER( &sk_zombie2_health1 );// {"sk_zombie2_health1","0"}; + CVAR_REGISTER( &sk_zombie2_health2 );// {"sk_zombie2_health2","0"}; + CVAR_REGISTER( &sk_zombie2_health3 );// {"sk_zombie2_health3","0"}; + + CVAR_REGISTER( &sk_zombie2_dmg_one_slash1 );// {"sk_zombie2_dmg_one_slash1","0"}; + CVAR_REGISTER( &sk_zombie2_dmg_one_slash2 );// {"sk_zombie2_dmg_one_slash2","0"}; + CVAR_REGISTER( &sk_zombie2_dmg_one_slash3 );// {"sk_zombie2_dmg_one_slash3","0"}; + + CVAR_REGISTER( &sk_zombie2_dmg_both_slash1 );// {"sk_zombie2_dmg_both_slash1","0"}; + CVAR_REGISTER( &sk_zombie2_dmg_both_slash2 );// {"sk_zombie2_dmg_both_slash2","0"}; + CVAR_REGISTER( &sk_zombie2_dmg_both_slash3 );// {"sk_zombie2_dmg_both_slash3","0"}; + + // Zombie3 + CVAR_REGISTER( &sk_zombie3_health1 );// {"sk_zombie3_health1","0"}; + CVAR_REGISTER( &sk_zombie3_health2 );// {"sk_zombie3_health2","0"}; + CVAR_REGISTER( &sk_zombie3_health3 );// {"sk_zombie3_health3","0"}; + + CVAR_REGISTER( &sk_zombie3_dmg_one_slash1 );// {"sk_zombie3_dmg_one_slash1","0"}; + CVAR_REGISTER( &sk_zombie3_dmg_one_slash2 );// {"sk_zombie3_dmg_one_slash2","0"}; + CVAR_REGISTER( &sk_zombie3_dmg_one_slash3 );// {"sk_zombie3_dmg_one_slash3","0"}; + + CVAR_REGISTER( &sk_zombie3_dmg_both_slash1 );// {"sk_zombie3_dmg_both_slash1","0"}; + CVAR_REGISTER( &sk_zombie3_dmg_both_slash2 );// {"sk_zombie3_dmg_both_slash2","0"}; + CVAR_REGISTER( &sk_zombie3_dmg_both_slash3 );// {"sk_zombie3_dmg_both_slash3","0"}; + //Turret CVAR_REGISTER( &sk_turret_health1 );// {"sk_turret_health1","0"}; CVAR_REGISTER( &sk_turret_health2 );// {"sk_turret_health2","0"}; @@ -707,79 +749,61 @@ void GameDLLInit( void ) // PLAYER WEAPONS - // Crowbar whack - CVAR_REGISTER( &sk_plr_crowbar1 );// {"sk_plr_crowbar1","0"}; - CVAR_REGISTER( &sk_plr_crowbar2 );// {"sk_plr_crowbar2","0"}; - CVAR_REGISTER( &sk_plr_crowbar3 );// {"sk_plr_crowbar3","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"}; + + // Hammer whack + CVAR_REGISTER( &sk_plr_hammer1 );// {"sk_plr_hammer1","0"}; + CVAR_REGISTER( &sk_plr_hammer2 );// {"sk_plr_hammer2","0"}; + CVAR_REGISTER( &sk_plr_hammer3 );// {"sk_plr_hammer3","0"}; + + // Axe slash + CVAR_REGISTER( &sk_plr_axe1 );// {"sk_plr_axe1","0"}; + CVAR_REGISTER( &sk_plr_axe2 );// {"sk_plr_axe2","0"}; + CVAR_REGISTER( &sk_plr_axe3 );// {"sk_plr_axe3","0"}; // Glock Round - CVAR_REGISTER( &sk_plr_9mm_bullet1 );// {"sk_plr_9mm_bullet1","0"}; - CVAR_REGISTER( &sk_plr_9mm_bullet2 );// {"sk_plr_9mm_bullet2","0"}; - CVAR_REGISTER( &sk_plr_9mm_bullet3 );// {"sk_plr_9mm_bullet3","0"}; + CVAR_REGISTER( &sk_plr_glock1 );// {"sk_plr_glock1","0"}; + CVAR_REGISTER( &sk_plr_glock2 );// {"sk_plr_glock2","0"}; + CVAR_REGISTER( &sk_plr_glock3 );// {"sk_plr_glock3","0"}; - // 357 Round - CVAR_REGISTER( &sk_plr_357_bullet1 );// {"sk_plr_357_bullet1","0"}; - CVAR_REGISTER( &sk_plr_357_bullet2 );// {"sk_plr_357_bullet2","0"}; - CVAR_REGISTER( &sk_plr_357_bullet3 );// {"sk_plr_357_bullet3","0"}; + // Beretta round + CVAR_REGISTER( &sk_plr_beretta1 );// {"sk_plr_beretta1","0"}; + CVAR_REGISTER( &sk_plr_beretta2 );// {"sk_plr_beretta2","0"}; + CVAR_REGISTER( &sk_plr_beretta3 );// {"sk_plr_beretta3","0"}; - // MP5 Round + // P228 round + CVAR_REGISTER( &sk_plr_p2281 );// {"sk_plr_p2281","0"}; + CVAR_REGISTER( &sk_plr_p2282 );// {"sk_plr_p2282","0"}; + CVAR_REGISTER( &sk_plr_p2283 );// {"sk_plr_p2283","0"}; + + // Revolver round + CVAR_REGISTER( &sk_plr_revolver1 );// {"sk_plr_revolver1","0"}; + CVAR_REGISTER( &sk_plr_revolver2 );// {"sk_plr_revolver2","0"}; + CVAR_REGISTER( &sk_plr_revolver3 );// {"sk_plr_revolver3","0"}; + + // Uzi round + CVAR_REGISTER( &sk_plr_uzi1 );// {"sk_plr_uzi1","0"}; + CVAR_REGISTER( &sk_plr_uzi2 );// {"sk_plr_uzi2","0"}; + CVAR_REGISTER( &sk_plr_uzi3 );// {"sk_plr_uzi3","0"}; + + // MP5K Round CVAR_REGISTER( &sk_plr_9mmAR_bullet1 );// {"sk_plr_9mmAR_bullet1","0"}; CVAR_REGISTER( &sk_plr_9mmAR_bullet2 );// {"sk_plr_9mmAR_bullet2","0"}; CVAR_REGISTER( &sk_plr_9mmAR_bullet3 );// {"sk_plr_9mmAR_bullet3","0"}; - // M203 grenade - CVAR_REGISTER( &sk_plr_9mmAR_grenade1 );// {"sk_plr_9mmAR_grenade1","0"}; - CVAR_REGISTER( &sk_plr_9mmAR_grenade2 );// {"sk_plr_9mmAR_grenade2","0"}; - CVAR_REGISTER( &sk_plr_9mmAR_grenade3 );// {"sk_plr_9mmAR_grenade3","0"}; + // Deagle round + CVAR_REGISTER( &sk_plr_deagle1 );// {"sk_plr_deagle1","0"}; + CVAR_REGISTER( &sk_plr_deagle2 );// {"sk_plr_deagle2","0"}; + CVAR_REGISTER( &sk_plr_deagle3 );// {"sk_plr_deagle3","0"}; // Shotgun buckshot CVAR_REGISTER( &sk_plr_buckshot1 );// {"sk_plr_buckshot1","0"}; CVAR_REGISTER( &sk_plr_buckshot2 );// {"sk_plr_buckshot2","0"}; CVAR_REGISTER( &sk_plr_buckshot3 );// {"sk_plr_buckshot3","0"}; - // Crossbow - CVAR_REGISTER( &sk_plr_xbow_bolt_monster1 );// {"sk_plr_xbow_bolt1","0"}; - CVAR_REGISTER( &sk_plr_xbow_bolt_monster2 );// {"sk_plr_xbow_bolt2","0"}; - CVAR_REGISTER( &sk_plr_xbow_bolt_monster3 );// {"sk_plr_xbow_bolt3","0"}; - - CVAR_REGISTER( &sk_plr_xbow_bolt_client1 );// {"sk_plr_xbow_bolt1","0"}; - CVAR_REGISTER( &sk_plr_xbow_bolt_client2 );// {"sk_plr_xbow_bolt2","0"}; - CVAR_REGISTER( &sk_plr_xbow_bolt_client3 );// {"sk_plr_xbow_bolt3","0"}; - - // RPG - CVAR_REGISTER( &sk_plr_rpg1 );// {"sk_plr_rpg1","0"}; - CVAR_REGISTER( &sk_plr_rpg2 );// {"sk_plr_rpg2","0"}; - CVAR_REGISTER( &sk_plr_rpg3 );// {"sk_plr_rpg3","0"}; - - // Gauss Gun - CVAR_REGISTER( &sk_plr_gauss1 );// {"sk_plr_gauss1","0"}; - CVAR_REGISTER( &sk_plr_gauss2 );// {"sk_plr_gauss2","0"}; - CVAR_REGISTER( &sk_plr_gauss3 );// {"sk_plr_gauss3","0"}; - - // Egon Gun - CVAR_REGISTER( &sk_plr_egon_narrow1 );// {"sk_plr_egon_narrow1","0"}; - CVAR_REGISTER( &sk_plr_egon_narrow2 );// {"sk_plr_egon_narrow2","0"}; - CVAR_REGISTER( &sk_plr_egon_narrow3 );// {"sk_plr_egon_narrow3","0"}; - - CVAR_REGISTER( &sk_plr_egon_wide1 );// {"sk_plr_egon_wide1","0"}; - CVAR_REGISTER( &sk_plr_egon_wide2 );// {"sk_plr_egon_wide2","0"}; - CVAR_REGISTER( &sk_plr_egon_wide3 );// {"sk_plr_egon_wide3","0"}; - - // Hand Grendade - CVAR_REGISTER( &sk_plr_hand_grenade1 );// {"sk_plr_hand_grenade1","0"}; - CVAR_REGISTER( &sk_plr_hand_grenade2 );// {"sk_plr_hand_grenade2","0"}; - CVAR_REGISTER( &sk_plr_hand_grenade3 );// {"sk_plr_hand_grenade3","0"}; - - // Satchel Charge - CVAR_REGISTER( &sk_plr_satchel1 );// {"sk_plr_satchel1","0"}; - CVAR_REGISTER( &sk_plr_satchel2 );// {"sk_plr_satchel2","0"}; - CVAR_REGISTER( &sk_plr_satchel3 );// {"sk_plr_satchel3","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"}; - // WORLD WEAPONS CVAR_REGISTER( &sk_12mm_bullet1 );// {"sk_12mm_bullet1","0"}; CVAR_REGISTER( &sk_12mm_bullet2 );// {"sk_12mm_bullet2","0"}; diff --git a/dlls/game.h b/dlls/game.h index 0dc5ba87..2d59476d 100644 --- a/dlls/game.h +++ b/dlls/game.h @@ -28,7 +28,6 @@ extern cvar_t friendlyfire; extern cvar_t falldamage; extern cvar_t weaponstay; extern cvar_t selfgauss; -extern cvar_t satchelfix; extern cvar_t forcerespawn; extern cvar_t flashlight; extern cvar_t aimcrosshair; @@ -37,6 +36,7 @@ extern cvar_t teamlist; extern cvar_t teamoverride; extern cvar_t defaultteam; extern cvar_t allowmonsters; +extern cvar_t infiniteflashlight; // Engine Cvars extern cvar_t *g_psv_gravity; diff --git a/dlls/gamerules.cpp b/dlls/gamerules.cpp index 9d7084c5..1ed24c89 100644 --- a/dlls/gamerules.cpp +++ b/dlls/gamerules.cpp @@ -214,11 +214,25 @@ void CGameRules::RefreshSkillData ( void ) gSkillData.snarkDmgBite = GetSkillCvar( "sk_snark_dmg_bite" ); gSkillData.snarkDmgPop = GetSkillCvar( "sk_snark_dmg_pop" ); + // Wheelchair Monster + gSkillData.wheelchairHealth = GetSkillCvar( "sk_wheelchair_health" ); + gSkillData.wheelchairDmgAttack = GetSkillCvar( "sk_wheelchair_dmg_attack" ); + // Zombie gSkillData.zombieHealth = GetSkillCvar( "sk_zombie_health" ); gSkillData.zombieDmgOneSlash = GetSkillCvar( "sk_zombie_dmg_one_slash" ); gSkillData.zombieDmgBothSlash = GetSkillCvar( "sk_zombie_dmg_both_slash" ); + // Zombie2 + gSkillData.zombie2Health = GetSkillCvar( "sk_zombie2_health" ); + gSkillData.zombie2DmgOneSlash = GetSkillCvar( "sk_zombie2_dmg_one_slash" ); + gSkillData.zombie2DmgBothSlash = GetSkillCvar( "sk_zombie2_dmg_both_slash" ); + + // Zombie3 + gSkillData.zombie3Health = GetSkillCvar( "sk_zombie3_health" ); + gSkillData.zombie3DmgOneSlash = GetSkillCvar( "sk_zombie3_dmg_one_slash" ); + gSkillData.zombie3DmgBothSlash = GetSkillCvar( "sk_zombie3_dmg_both_slash" ); + //Turret gSkillData.turretHealth = GetSkillCvar( "sk_turret_health" ); @@ -230,47 +244,39 @@ void CGameRules::RefreshSkillData ( void ) // PLAYER WEAPONS - // Crowbar whack - gSkillData.plrDmgCrowbar = GetSkillCvar( "sk_plr_crowbar" ); + // Knife slash + gSkillData.plrDmgKnife = GetSkillCvar( "sk_plr_knife" ); + + // Hammer whack + gSkillData.plrDmgHammer = GetSkillCvar( "sk_plr_hammer" ); + + // Axe slash + gSkillData.plrDmgAxe = GetSkillCvar( "sk_plr_axe" ); // Glock Round - gSkillData.plrDmg9MM = GetSkillCvar( "sk_plr_9mm_bullet" ); + gSkillData.plrDmgGlock = GetSkillCvar( "sk_plr_glock" ); - // 357 Round - gSkillData.plrDmg357 = GetSkillCvar( "sk_plr_357_bullet" ); + // Beretta round + gSkillData.plrDmgBeretta = GetSkillCvar( "sk_plr_beretta" ); - // MP5 Round - gSkillData.plrDmgMP5 = GetSkillCvar( "sk_plr_9mmAR_bullet" ); + // P228 round + gSkillData.plrDmgP228 = GetSkillCvar( "sk_plr_p228" ); - // M203 grenade - gSkillData.plrDmgM203Grenade = GetSkillCvar( "sk_plr_9mmAR_grenade" ); + // Revolver round + gSkillData.plrDmgRevolver = GetSkillCvar( "sk_plr_revolver" ); + + // Uzi round + gSkillData.plrDmgUzi = GetSkillCvar( "sk_plr_uzi" ); + + // MP5K Round + gSkillData.plrDmgMP5K = GetSkillCvar( "sk_plr_9mmAR_bullet" ); + + // Deagle round + gSkillData.plrDmgDeagle = GetSkillCvar( "sk_plr_deagle" ); // Shotgun buckshot gSkillData.plrDmgBuckshot = GetSkillCvar( "sk_plr_buckshot" ); - // Crossbow - gSkillData.plrDmgCrossbowClient = GetSkillCvar( "sk_plr_xbow_bolt_client" ); - gSkillData.plrDmgCrossbowMonster = GetSkillCvar( "sk_plr_xbow_bolt_monster" ); - - // RPG - gSkillData.plrDmgRPG = GetSkillCvar( "sk_plr_rpg" ); - - // Gauss gun - gSkillData.plrDmgGauss = GetSkillCvar( "sk_plr_gauss" ); - - // Egon Gun - gSkillData.plrDmgEgonNarrow = GetSkillCvar( "sk_plr_egon_narrow" ); - gSkillData.plrDmgEgonWide = GetSkillCvar( "sk_plr_egon_wide" ); - - // Hand Grendade - gSkillData.plrDmgHandGrenade = GetSkillCvar( "sk_plr_hand_grenade" ); - - // Satchel Charge - gSkillData.plrDmgSatchel = GetSkillCvar( "sk_plr_satchel" ); - - // Tripmine - gSkillData.plrDmgTripmine = GetSkillCvar( "sk_plr_tripmine" ); - // MONSTER WEAPONS gSkillData.monDmg12MM = GetSkillCvar( "sk_12mm_bullet" ); gSkillData.monDmgMP5 = GetSkillCvar ("sk_9mmAR_bullet" ); @@ -279,14 +285,6 @@ void CGameRules::RefreshSkillData ( void ) // MONSTER HORNET gSkillData.monDmgHornet = GetSkillCvar( "sk_hornet_dmg" ); - // PLAYER HORNET -// Up to this point, player hornet damage and monster hornet damage were both using -// monDmgHornet to determine how much damage to do. In tuning the hivehand, we now need -// to separate player damage and monster hivehand damage. Since it's so late in the project, we've -// added plrDmgHornet to the SKILLDATA struct, but not to the engine CVar list, so it's inaccesible -// via SKILLS.CFG. Any player hivehand tuning must take place in the code. (sjb) - gSkillData.plrDmgHornet = 7; - // HEALTH/CHARGE gSkillData.suitchargerCapacity = GetSkillCvar( "sk_suitcharger" ); gSkillData.batteryCapacity = GetSkillCvar( "sk_battery" ); diff --git a/dlls/gamerules.h b/dlls/gamerules.h index e4f51f99..200b45a6 100644 --- a/dlls/gamerules.h +++ b/dlls/gamerules.h @@ -19,7 +19,7 @@ #ifndef GAMERULES_H #define GAMERULES_H //LRC -#define GAME_NAME "Spirit of Half-Life" +#define GAME_NAME "Afraid of Monsters: Director's Cut" //#include "weapons.h" //#include "items.h" class CBasePlayerItem; diff --git a/dlls/ggrenade.cpp b/dlls/ggrenade.cpp index 35442469..0ac35199 100644 --- a/dlls/ggrenade.cpp +++ b/dlls/ggrenade.cpp @@ -377,7 +377,7 @@ CGrenade *CGrenade::ShootContact( entvars_t *pevOwner, Vector vecStart, Vector v // Explode on contact pGrenade->SetTouch( &CGrenade::ExplodeTouch ); - pGrenade->pev->dmg = gSkillData.plrDmgM203Grenade; + pGrenade->pev->dmg = 100; return pGrenade; } diff --git a/dlls/headcrab.cpp b/dlls/headcrab.cpp index 01b01fa3..0a0faa4f 100644 --- a/dlls/headcrab.cpp +++ b/dlls/headcrab.cpp @@ -289,7 +289,7 @@ void CHeadCrab::Spawn() pev->solid = SOLID_SLIDEBOX; pev->movetype = MOVETYPE_STEP; - m_bloodColor = BLOOD_COLOR_GREEN; + m_bloodColor = BLOOD_COLOR_RED; pev->effects = 0; if (pev->health == 0) pev->health = gSkillData.headcrabHealth; diff --git a/dlls/healthkit.cpp b/dlls/healthkit.cpp index 9c39046e..ffb2f560 100644 --- a/dlls/healthkit.cpp +++ b/dlls/healthkit.cpp @@ -69,6 +69,9 @@ BOOL CHealthKit::MyTouch( CBasePlayer *pPlayer ) return FALSE; } + if( !( pPlayer->m_afButtonPressed & IN_USE ) ) + return FALSE; + if( pPlayer->TakeHealth( gSkillData.healthkitCapacity, DMG_GENERIC ) ) { MESSAGE_BEGIN( MSG_ONE, gmsgItemPickup, NULL, pPlayer->pev ); diff --git a/dlls/hornet.cpp b/dlls/hornet.cpp index dda47a5e..e67b75d4 100644 --- a/dlls/hornet.cpp +++ b/dlls/hornet.cpp @@ -99,15 +99,8 @@ void CHornet::Spawn( void ) if( !pSoundEnt ) pSoundEnt = edict(); - if( !FNullEnt( pev->owner ) && ( pev->owner->v.flags & FL_CLIENT ) ) - { - pev->dmg = gSkillData.plrDmgHornet; - } - else - { - // no real owner, or owner isn't a client. - pev->dmg = gSkillData.monDmgHornet; - } + // no real owner, or owner isn't a client. + pev->dmg = gSkillData.monDmgHornet; SetNextThink( 0.1 ); ResetSequenceInfo(); diff --git a/dlls/houndeye.cpp b/dlls/houndeye.cpp index 6c28b9d0..4127fd11 100644 --- a/dlls/houndeye.cpp +++ b/dlls/houndeye.cpp @@ -322,12 +322,12 @@ void CHoundeye::Spawn() if (pev->model) SET_MODEL(ENT(pev), STRING(pev->model)); //LRC else - SET_MODEL( ENT( pev ), "models/houndeye.mdl" ); + SET_MODEL( ENT( pev ), "models/black_dog.mdl" ); UTIL_SetSize( pev, Vector( -16, -16, 0 ), Vector( 16, 16, 36 ) ); pev->solid = SOLID_SLIDEBOX; pev->movetype = MOVETYPE_STEP; - m_bloodColor = BLOOD_COLOR_YELLOW; + m_bloodColor = BLOOD_COLOR_RED; pev->effects = 0; if (pev->health == 0) pev->health = gSkillData.houndeyeHealth; @@ -349,7 +349,7 @@ void CHoundeye::Precache() if (pev->model) PRECACHE_MODEL(STRING(pev->model)); //LRC else - PRECACHE_MODEL( "models/houndeye.mdl" ); + PRECACHE_MODEL( "models/black_dog.mdl" ); PRECACHE_SOUND( "houndeye/he_alert1.wav" ); PRECACHE_SOUND( "houndeye/he_alert2.wav" ); @@ -504,8 +504,8 @@ void CHoundeye::PainSound( void ) //========================================================= void CHoundeye::WriteBeamColor( void ) { - BYTE bRed, bGreen, bBlue; - + BYTE bRed = 255, bGreen = 0, bBlue = 0; +/* if( InSquad() ) { switch( SquadCount() ) @@ -541,7 +541,7 @@ void CHoundeye::WriteBeamColor( void ) bGreen = 220; bBlue = 255; } - +*/ WRITE_BYTE( bRed ); WRITE_BYTE( bGreen ); WRITE_BYTE( bBlue ); diff --git a/dlls/items.cpp b/dlls/items.cpp index 76de7b6a..38b46bd3 100644 --- a/dlls/items.cpp +++ b/dlls/items.cpp @@ -70,6 +70,9 @@ void CWorldItem::Spawn( void ) case 45: // ITEM_SUIT: pEntity = CBaseEntity::Create( "item_suit", pev->origin, pev->angles ); break; + case 46: // ITEM_FLASHLIGHT: + pEntity = CBaseEntity::Create( "item_flashlight", pev->origin, pev->angles ); + break; } if( !pEntity ) @@ -213,7 +216,7 @@ class CItemBattery : public CItem if (pev->model) SET_MODEL(ENT(pev), STRING(pev->model)); //LRC else - SET_MODEL( ENT( pev ), "models/w_battery.mdl" ); + SET_MODEL( ENT( pev ), "models/battery.mdl" ); CItem::Spawn(); } void Precache( void ) @@ -221,7 +224,7 @@ class CItemBattery : public CItem if (pev->model) PRECACHE_MODEL(STRING(pev->model)); //LRC else - PRECACHE_MODEL( "models/w_battery.mdl" ); + PRECACHE_MODEL( "models/battery.mdl" ); if (pev->noise) PRECACHE_SOUND( STRING(pev->noise) ); //LRC @@ -235,8 +238,11 @@ class CItemBattery : public CItem return FALSE; } + if( !( pPlayer->m_afButtonPressed & IN_USE ) ) + return FALSE; + if( ( pPlayer->pev->armorvalue < MAX_NORMAL_BATTERY ) && - ( pPlayer->pev->weapons & ( 1 << WEAPON_SUIT ) ) ) + ( pPlayer->pev->weapons & ( 1 << WEAPON_FLASHLIGHT ) ) ) { int pct; char szcharge[64]; @@ -319,6 +325,37 @@ class CItemSecurity : public CItem LINK_ENTITY_TO_CLASS( item_security, CItemSecurity ) +class CItemFlashlight : public CItem +{ + void Spawn( void ) + { + Precache(); + SET_MODEL( ENT( pev ), "models/w_flashlight.mdl" ); + CItem::Spawn(); + } + void Precache( void ) + { + PRECACHE_MODEL( "models/w_flashlight.mdl" ); + PRECACHE_SOUND( "items/gunpickup2.wav" ); + } + BOOL MyTouch(CBasePlayer *pPlayer) + { + if( !( pPlayer->m_afButtonPressed & IN_USE ) ) + return FALSE; + + if( pPlayer->pev->weapons & ( 1 << WEAPON_FLASHLIGHT ) ) + return FALSE; + + EMIT_SOUND( pPlayer->edict(), CHAN_ITEM, "items/gunpickup2.wav", 1, ATTN_NORM ); + + pPlayer->pev->weapons |= ( 1 << WEAPON_FLASHLIGHT ); + pPlayer->m_flFlashLightTime = gpGlobals->time + 0.3; // + FLASH_CHARGE_TIME; + return TRUE; + } +}; + +LINK_ENTITY_TO_CLASS( item_flashlight, CItemFlashlight ); + class CItemLongJump : public CItem { void Spawn( void ) diff --git a/dlls/monsters.cpp b/dlls/monsters.cpp index f7d14728..8e0bf7f3 100644 --- a/dlls/monsters.cpp +++ b/dlls/monsters.cpp @@ -3431,7 +3431,7 @@ CBaseEntity *CBaseMonster::DropItem( const char *pszItemName, const Vector &vecP BOOL CBaseMonster::ShouldFadeOnDeath( void ) { // if flagged to fade out or I have an owner (I came from a monster spawner) - if( ( pev->spawnflags & SF_MONSTER_FADECORPSE ) || !FNullEnt( pev->owner ) ) + //if( ( pev->spawnflags & SF_MONSTER_FADECORPSE ) || !FNullEnt( pev->owner ) ) return TRUE; return FALSE; diff --git a/dlls/multiplay_gamerules.cpp b/dlls/multiplay_gamerules.cpp index 8f4cd3b9..3116869a 100644 --- a/dlls/multiplay_gamerules.cpp +++ b/dlls/multiplay_gamerules.cpp @@ -142,46 +142,6 @@ void CHalfLifeMultiplay::RefreshSkillData( void ) // suitcharger gSkillData.suitchargerCapacity = 30; - - // Crowbar whack - gSkillData.plrDmgCrowbar = 25; - - // Glock Round - gSkillData.plrDmg9MM = 12; - - // 357 Round - gSkillData.plrDmg357 = 40; - - // MP5 Round - gSkillData.plrDmgMP5 = 12; - - // M203 grenade - gSkillData.plrDmgM203Grenade = 100; - - // Shotgun buckshot - gSkillData.plrDmgBuckshot = 20;// fewer pellets in deathmatch - - // Crossbow - gSkillData.plrDmgCrossbowClient = 20; - - // RPG - gSkillData.plrDmgRPG = 120; - - // Egon - gSkillData.plrDmgEgonWide = 20; - gSkillData.plrDmgEgonNarrow = 10; - - // Hand Grendade - gSkillData.plrDmgHandGrenade = 100; - - // Satchel Charge - gSkillData.plrDmgSatchel = 120; - - // Tripmine - gSkillData.plrDmgTripmine = 150; - - // hornet - gSkillData.plrDmgHornet = 10; } // longest the intermission can last, in seconds @@ -580,12 +540,12 @@ void CHalfLifeMultiplay::PlayerSpawn( CBasePlayer *pPlayer ) addDefault = FALSE; } - if( addDefault ) + /*if( addDefault ) { pPlayer->GiveNamedItem( "weapon_crowbar" ); pPlayer->GiveNamedItem( "weapon_9mmhandgun" ); pPlayer->GiveAmmo( 68, "9mm", _9MM_MAX_CARRY );// 4 full reloads - } + }*/ } //========================================================= diff --git a/dlls/player.cpp b/dlls/player.cpp index d2b59211..1df00033 100644 --- a/dlls/player.cpp +++ b/dlls/player.cpp @@ -69,8 +69,8 @@ extern CGraph WorldGraph; #define TRAIN_FAST 0x04 #define TRAIN_BACK 0x05 -#define FLASH_DRAIN_TIME 1.2 //100 units/3 minutes -#define FLASH_CHARGE_TIME 0.2 // 100 units/20 seconds (seconds per unit) +#define FLASH_DRAIN_TIME 0.12 //100 units/12 seconds +#define FLASH_CHARGE_TIME 0.3 // 100 units/3 seconds (seconds per unit) #ifdef XENWARRIOR float g_fEnvFadeTime = 0; // flashlight can't be used until this time expires. @@ -496,29 +496,6 @@ int CBasePlayer::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, fl // keep track of amount of damage last sustained m_lastDamageAmount = (int)flDamage; - // Armor. - if( !( pev->flags & FL_GODMODE ) && pev->armorvalue && !( bitsDamageType & ( DMG_FALL | DMG_DROWN ) ) )// armor doesn't protect against fall or drown damage! - { - float flNew = flDamage * flRatio; - - float flArmor; - - flArmor = ( flDamage - flNew ) * flBonus; - - // Does this use more armor than we have? - if( flArmor > pev->armorvalue ) - { - flArmor = pev->armorvalue; - flArmor *= ( 1 / flBonus ); - flNew = flDamage - flArmor; - pev->armorvalue = 0; - } - else - pev->armorvalue -= flArmor; - - flDamage = flNew; - } - // this cast to INT is critical!!! If a player ends up with 0.5 health, the engine will get that // as an int (zero) and think the player is dead! (this will incite a clientside screentilt, etc) fTookDamage = CBaseMonster::TakeDamage( pevInflictor, pevAttacker, (int)flDamage, bitsDamageType ); @@ -857,9 +834,6 @@ void CBasePlayer::RemoveAllItems( BOOL removeSuit ) for( i = 0; i < MAX_AMMO_SLOTS; i++ ) m_rgAmmo[i] = 0; - if( satchelfix.value ) - DeactivateSatchels( this ); - UpdateClientData(); // send Selected Weapon Message to our client MESSAGE_BEGIN( MSG_ONE, gmsgCurWeapon, NULL, pev ); @@ -906,7 +880,7 @@ void CBasePlayer::RemoveItems( int iWeaponMask, int i9mm, int i357, int iBuck, i CBasePlayerItem *pCurrentItem; // hornetgun is outside the spawnflags Worldcraft can set - handle it seperately. - if (iHornet) + /*if (iHornet) iWeaponMask |= 1<angles.x = 0; @@ -1266,12 +1242,9 @@ void CBasePlayer::TabulateAmmo() { ammo_9mm = AmmoInventory( GetAmmoIndex( "9mm" ) ); ammo_357 = AmmoInventory( GetAmmoIndex( "357" ) ); - ammo_argrens = AmmoInventory( GetAmmoIndex( "ARgrenades" ) ); - ammo_bolts = AmmoInventory( GetAmmoIndex( "bolts" ) ); + ammo_9mmar = AmmoInventory( GetAmmoIndex( "9mmar" ) ); + ammo_50ae = AmmoInventory( GetAmmoIndex( "50AE" ) ); ammo_buckshot = AmmoInventory( GetAmmoIndex( "buckshot" ) ); - ammo_rockets = AmmoInventory( GetAmmoIndex( "rockets" ) ); - ammo_uranium = AmmoInventory( GetAmmoIndex( "uranium" ) ); - ammo_hornets = AmmoInventory( GetAmmoIndex( "Hornets" ) ); } /* @@ -2690,10 +2663,19 @@ void CBasePlayer::PostThink() if( !IsAlive() ) goto pt_end; - #ifdef XENWARRIOR if (FlashlightIsOn()) + #ifdef XENWARRIOR UTIL_ScreenFade(this, Vector(150, 20, 150), 0, 0, 100, FFADE_STAYOUT ); #endif + { + TraceResult tr; + Vector start = pev->origin + pev->view_ofs; + Vector end = start + gpGlobals->v_forward * 8192; + + UTIL_MakeVectors( pev->angles ); + UTIL_TraceLine( start, end, dont_ignore_monsters, edict(), &tr ); + UTIL_MuzzleLight( tr.vecEndPos, 110.0f, 48, 48, 48, 0.1f, 100.0f ); + } // Handle Tank controlling if( m_pTank != 0 ) @@ -3020,8 +3002,8 @@ void CBasePlayer::Spawn( void ) m_flNextAttack = UTIL_WeaponTimeBase(); StartSneaking(); - m_iFlashBattery = 99; - m_flFlashLightTime = 1; // force first message + m_iFlashBattery = 0; + m_flFlashLightTime = 0; // force first message // dont let uninitialized value here hurt the player m_flFallVelocity = 0; @@ -3102,7 +3084,7 @@ void CBasePlayer::Precache( void ) m_iClientBattery = -1; - m_flFlashLightTime = 1; + m_flFlashLightTime = 0; m_iTrain |= TRAIN_NEW; @@ -3501,7 +3483,7 @@ void CBasePlayer::FlashlightTurnOn( void ) } #endif - if( (pev->weapons & ( 1 << WEAPON_SUIT ) ) ) + if( (pev->weapons & ( 1 << WEAPON_FLASHLIGHT ) ) ) { EMIT_SOUND_DYN( ENT( pev ), CHAN_WEAPON, SOUND_FLASHLIGHT_ON, 1.0, ATTN_NORM, 0, PITCH_NORM ); @@ -3706,32 +3688,15 @@ void CBasePlayer::CheatImpulseCommands( int iImpulse ) case 101: gEvilImpulse101 = TRUE; - GiveNamedItem( "item_suit" ); + if( !( pev->weapons & ( 1 << WEAPON_SUIT ) ) ) + 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" ); -#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" ); -#endif + GiveNamedItem( "weapon_glock" ); + GiveNamedItem( "ammo_glock" ); + GiveNamedItem( "weapon_beretta" ); + GiveNamedItem( "ammo_beretta" ); + GiveNamedItem( "weapon_P228" ); + GiveNamedItem( "ammo_P228" ); gEvilImpulse101 = FALSE; break; case 102: @@ -4154,6 +4119,16 @@ void CBasePlayer::UpdateClientData( void ) InitStatusBar(); } + edict_t *pEnt = FIND_ENTITY_BY_CLASSNAME( 0, "weapon_gmgeneral" ); + if( !FNullEnt( ENT( pEnt ) ) ) + { + if( !UTIL_FileExists( "gmgeneral1.aomdc" ) || !UTIL_FileExists( "gmgeneral2.aomdc" ) + || !UTIL_FileExists( "gmgeneral3.aomdc" ) || !UTIL_FileExists( "gmgeneral4.aomdc" ) ) + { + REMOVE_ENTITY( ENT( pEnt ) ); + } + } + if( m_iHideHUD != m_iClientHideHUD ) { MESSAGE_BEGIN( MSG_ONE, gmsgHideWeapon, NULL, pev ); @@ -4245,23 +4220,39 @@ void CBasePlayer::UpdateClientData( void ) // Update Flashlight if( ( m_flFlashLightTime ) && ( m_flFlashLightTime <= gpGlobals->time ) ) { - if( FlashlightIsOn() ) + if( pev->armorvalue == 100 ) + m_iFlashBattery = 0; + + if( FlashlightIsOn() && !infiniteflashlight.value ) { if( m_iFlashBattery ) { m_flFlashLightTime = FLASH_DRAIN_TIME + gpGlobals->time; m_iFlashBattery--; - - if( !m_iFlashBattery ) - FlashlightTurnOff(); } + else if( !m_iFlashBattery && pev->armorvalue ) + { + m_flFlashLightTime = FLASH_DRAIN_TIME + gpGlobals->time; + m_iFlashBattery = 99; + pev->armorvalue--; + } + else + FlashlightTurnOff(); } else { - if( m_iFlashBattery < 100 ) + if( pev->armorvalue < 5 ) { - m_flFlashLightTime = FLASH_CHARGE_TIME + gpGlobals->time; - m_iFlashBattery++; + if( m_iFlashBattery < 100 ) + { + m_flFlashLightTime = FLASH_CHARGE_TIME + gpGlobals->time; + m_iFlashBattery++; + } + else + { + pev->armorvalue++; + m_iFlashBattery = 0; + } } else m_flFlashLightTime = 0; @@ -4364,6 +4355,56 @@ void CBasePlayer::UpdateClientData( void ) } } +void CBasePlayer::ThunderAttack() +{ + EMIT_SOUND( ENT( pev ), CHAN_NETWORKVOICE_BASE, "davidbad/thunder_hit.wav", 1.0, ATTN_NORM ); + Vector VecSrc = pev->origin + Vector( RANDOM_FLOAT( -1.0, 1.0 ), RANDOM_FLOAT( -1.0, 1.0 ), RANDOM_FLOAT( -1.0, 1.0 ) ) * 128; + + pev->velocity = Vector( 0.0, 0.0, 0.2 ); + pev->origin = pev->origin + pev->velocity; + + MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); + WRITE_BYTE( TE_BEAMENTPOINT ); + WRITE_SHORT( entindex() ); + WRITE_COORD( VecSrc.x ); + WRITE_COORD( VecSrc.y ); + WRITE_COORD( VecSrc.z ); + WRITE_SHORT( g_sModelIndexLightning ); + WRITE_BYTE( 0 ); // framestart + WRITE_BYTE( 10 ); // framerate + WRITE_BYTE( 3 ); // life + WRITE_BYTE( 150 ); // width + WRITE_BYTE( 80 ); // noise + WRITE_BYTE( 64 ); // r, g, b + WRITE_BYTE( 128 ); // r, g, b + WRITE_BYTE( 255 ); // r, g, b + WRITE_BYTE( 150 ); // brightness + WRITE_BYTE( 5 ); // speed + MESSAGE_END(); + + // blast circle + MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, pev->origin ); + WRITE_BYTE( TE_BEAMCYLINDER ); + WRITE_COORD( pev->origin.x );// coord coord coord (center position) + WRITE_COORD( pev->origin.y ); + WRITE_COORD( pev->origin.z - 32.0f ); + WRITE_COORD( pev->origin.x );// coord coord coord (axis and radius) + WRITE_COORD( pev->origin.y ); + WRITE_COORD( pev->origin.z + 166.0f ); + WRITE_SHORT( g_sModelIndexSmoke ); // short (sprite index) + WRITE_BYTE( 0 ); // byte (starting frame) + WRITE_BYTE( 0 ); // byte (frame rate in 0.1's) + WRITE_BYTE( 2 ); // byte (life in 0.1's) + WRITE_BYTE( 16 ); // byte (line width in 0.1's) + WRITE_BYTE( 0 ); // byte (noise amplitude in 0.01's) + WRITE_BYTE( 64 ); // byte,byte,byte (color) + WRITE_BYTE( 128 ); + WRITE_BYTE( 255 ); + WRITE_BYTE( 100 ); // byte (brightness) + WRITE_BYTE( 0 ); // byte (scroll speed in 0.1's) + MESSAGE_END(); +} + //========================================================= // FBecomeProne - Overridden for the player to set the proper // physics flags when a barnacle grabs player. @@ -4676,14 +4717,8 @@ int CBasePlayer::GetCustomDecalFrames( void ) // DropPlayerItem - drop the named item, or if no name, // the active item. //========================================================= -void CBasePlayer::DropPlayerItem( char *pszItemName ) +void CBasePlayer::DropPlayerItem( const char *pszItemName ) { - if( !g_pGameRules->IsMultiplayer() || ( weaponstay.value > 0 ) ) - { - // no dropping in single player. - return; - } - if( !strlen( pszItemName ) ) { // if this string has no length, the client didn't type a name! @@ -4728,7 +4763,8 @@ void CBasePlayer::DropPlayerItem( char *pszItemName ) if( pWeapon ) { if( !g_pGameRules->GetNextBestWeapon( this, pWeapon ) ) - return; // can't drop the item they asked for, may be our last item or something we can't holster + ; + // return; // can't drop the item they asked for, may be our last item or something we can't holster UTIL_MakeVectors( pev->angles ); @@ -4740,27 +4776,7 @@ void CBasePlayer::DropPlayerItem( char *pszItemName ) pWeaponBox->PackWeapon( pWeapon ); pWeaponBox->pev->velocity = gpGlobals->v_forward * 300 + gpGlobals->v_forward * 100; - // drop half of the ammo for this weapon. - int iAmmoIndex; - - iAmmoIndex = GetAmmoIndex( pWeapon->pszAmmo1() ); // ??? - - if( iAmmoIndex != -1 ) - { - // this weapon weapon uses ammo, so pack an appropriate amount. - if( pWeapon->iFlags() & ITEM_FLAG_EXHAUSTIBLE ) - { - // pack up all the ammo, this weapon is its own ammo type - pWeaponBox->PackAmmo( MAKE_STRING( pWeapon->pszAmmo1() ), m_rgAmmo[iAmmoIndex] ); - m_rgAmmo[iAmmoIndex] = 0; - } - else - { - // pack half of the ammo - pWeaponBox->PackAmmo( MAKE_STRING( pWeapon->pszAmmo1() ), m_rgAmmo[iAmmoIndex] / 2 ); - m_rgAmmo[iAmmoIndex] /= 2; - } - } + SET_MODEL( ENT( pWeaponBox->pev ), WorldWeaponModels[pWeapon->m_iId] ); return;// we're done, so stop searching with the FOR loop. } diff --git a/dlls/player.h b/dlls/player.h index f0ee4a9e..6116d2df 100644 --- a/dlls/player.h +++ b/dlls/player.h @@ -250,7 +250,9 @@ public: // JOHN: sends custom messages if player HUD data has changed (eg health, ammo) virtual void UpdateClientData( void ); - + + void ThunderAttack(); + static TYPEDESCRIPTION m_playerSaveData[]; // Player is moved across the transition by other means @@ -281,7 +283,7 @@ public: void AddPointsToTeam( int score, BOOL bAllowNegativeScore ); BOOL AddPlayerItem( CBasePlayerItem *pItem ); BOOL RemovePlayerItem( CBasePlayerItem *pItem, bool bCallHoster ); - void DropPlayerItem ( char *pszItemName ); + void DropPlayerItem ( const char *pszItemName ); BOOL HasPlayerItem( CBasePlayerItem *pCheckItem ); BOOL HasNamedPlayerItem( const char *pszItemName ); BOOL HasWeapons( void );// do I have ANY weapons? diff --git a/dlls/rpg.cpp b/dlls/rpg.cpp index 1e1ed68a..65a68685 100644 --- a/dlls/rpg.cpp +++ b/dlls/rpg.cpp @@ -23,22 +23,6 @@ #include "player.h" #include "gamerules.h" -enum rpg_e -{ - RPG_IDLE = 0, - RPG_FIDGET, - RPG_RELOAD, // to reload - RPG_FIRE2, // to empty - RPG_HOLSTER1, // loaded - RPG_DRAW1, // loaded - RPG_HOLSTER2, // unloaded - RPG_DRAW_UL, // unloaded - RPG_IDLE_UL, // unloaded idle - RPG_FIDGET_UL // unloaded fidget -}; - -LINK_ENTITY_TO_CLASS( weapon_rpg, CRpg ) - #ifndef CLIENT_DLL LINK_ENTITY_TO_CLASS( laser_spot, CLaserSpot ) @@ -113,500 +97,5 @@ void CLaserSpot::Precache( void ) { PRECACHE_MODEL( "sprites/laserdot.spr" ); } - -LINK_ENTITY_TO_CLASS( rpg_rocket, CRpgRocket ) - -//========================================================= -//========================================================= -CRpgRocket *CRpgRocket::CreateRpgRocket( Vector vecOrigin, Vector vecAngles, CBaseEntity *pOwner, CRpg *pLauncher ) -{ - CRpgRocket *pRocket = GetClassPtr( (CRpgRocket *)NULL ); - - UTIL_SetOrigin( pRocket, vecOrigin ); - pRocket->pev->angles = vecAngles; - pRocket->Spawn(); - pRocket->SetTouch( &CRpgRocket::RocketTouch ); - pRocket->m_hLauncher = pLauncher;// remember what RPG fired me. - pLauncher->m_cActiveRockets++;// register this missile as active for the launcher - pRocket->pev->owner = pOwner->edict(); - - return pRocket; -} - -//========================================================= -//========================================================= -void CRpgRocket::Spawn( void ) -{ - Precache(); - // motor - pev->movetype = MOVETYPE_BOUNCE; - pev->solid = SOLID_BBOX; - - SET_MODEL( ENT( pev ), "models/rpgrocket.mdl" ); - UTIL_SetSize( pev, Vector( 0, 0, 0 ), Vector( 0, 0, 0 ) ); - UTIL_SetOrigin( this, pev->origin ); - - pev->classname = MAKE_STRING( "rpg_rocket" ); - - SetThink( &CRpgRocket::IgniteThink ); - SetTouch(&CRpgRocket :: ExplodeTouch ); - - pev->angles.x -= 30; - UTIL_MakeVectors( pev->angles ); - pev->angles.x = -( pev->angles.x + 30 ); - - pev->velocity = gpGlobals->v_forward * 250; - pev->gravity = 0.5; - - SetNextThink( 0.4 ); - - pev->dmg = gSkillData.plrDmgRPG; -} - -//========================================================= -//========================================================= -void CRpgRocket::RocketTouch( CBaseEntity *pOther ) -{ - if( CRpg* pLauncher = (CRpg*)( (CBaseEntity*)( m_hLauncher ) ) ) - { - // my launcher is still around, tell it I'm dead. - pLauncher->m_cActiveRockets--; - } - - STOP_SOUND( edict(), CHAN_VOICE, "weapons/rocket1.wav" ); - ExplodeTouch( pOther ); -} - -//========================================================= -//========================================================= -void CRpgRocket::Precache( void ) -{ - PRECACHE_MODEL( "models/rpgrocket.mdl" ); - m_iTrail = PRECACHE_MODEL( "sprites/smoke.spr" ); - PRECACHE_SOUND( "weapons/rocket1.wav" ); -} - -void CRpgRocket::IgniteThink( void ) -{ - // pev->movetype = MOVETYPE_TOSS; - - pev->movetype = MOVETYPE_FLY; - pev->effects |= EF_LIGHT; - - // make rocket sound - EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/rocket1.wav", 1, 0.5 ); - - // rocket trail - MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY ); - WRITE_BYTE( TE_BEAMFOLLOW ); - WRITE_SHORT( entindex() ); // entity - WRITE_SHORT( m_iTrail ); // model - WRITE_BYTE( 40 ); // life - WRITE_BYTE( 5 ); // width - WRITE_BYTE( 224 ); // r, g, b - WRITE_BYTE( 224 ); // r, g, b - WRITE_BYTE( 255 ); // r, g, b - WRITE_BYTE( 255 ); // brightness - MESSAGE_END(); // move PHS/PVS data sending into here (SEND_ALL, SEND_PVS, SEND_PHS) - - m_flIgniteTime = gpGlobals->time; - - // set to follow laser spot - SetThink( &CRpgRocket::FollowThink ); - SetNextThink( 0.1 ); -} - -void CRpgRocket::FollowThink( void ) -{ - CBaseEntity *pOther = NULL; - Vector vecTarget; - Vector vecDir; - float flDist, flMax, flDot; - TraceResult tr; - - UTIL_MakeAimVectors( pev->angles ); - - vecTarget = gpGlobals->v_forward; - flMax = 4096; - - // Examine all entities within a reasonable radius - while( ( pOther = UTIL_FindEntityByClassname( pOther, "laser_spot" ) ) != NULL ) - { - UTIL_TraceLine( pev->origin, pOther->pev->origin, dont_ignore_monsters, ENT( pev ), &tr ); - // ALERT( at_console, "%f\n", tr.flFraction ); - if( tr.flFraction >= 0.90 ) - { - vecDir = pOther->pev->origin - pev->origin; - flDist = vecDir.Length(); - vecDir = vecDir.Normalize(); - flDot = DotProduct( gpGlobals->v_forward, vecDir ); - if( ( flDot > 0 ) && ( flDist * ( 1 - flDot ) < flMax ) ) - { - flMax = flDist * ( 1 - flDot ); - vecTarget = vecDir; - } - } - } - - pev->angles = UTIL_VecToAngles( vecTarget ); - - // this acceleration and turning math is totally wrong, but it seems to respond well so don't change it. - float flSpeed = pev->velocity.Length(); - if( gpGlobals->time - m_flIgniteTime < 1.0 ) - { - pev->velocity = pev->velocity * 0.2 + vecTarget * ( flSpeed * 0.8 + 400 ); - if (pev->waterlevel == 3 && pev->watertype > CONTENT_FLYFIELD) - { - // go slow underwater - if( pev->velocity.Length() > 300 ) - { - pev->velocity = pev->velocity.Normalize() * 300; - } - UTIL_BubbleTrail( pev->origin - pev->velocity * 0.1, pev->origin, 4 ); - } - else - { - if( pev->velocity.Length() > 2000 ) - { - pev->velocity = pev->velocity.Normalize() * 2000; - } - } - } - else - { - if( pev->effects & EF_LIGHT ) - { - pev->effects = 0; - STOP_SOUND( ENT( pev ), CHAN_VOICE, "weapons/rocket1.wav" ); - } - pev->velocity = pev->velocity * 0.2 + vecTarget * flSpeed * 0.798; - if ((pev->waterlevel == 0 || pev->watertype == CONTENT_FOG) && pev->velocity.Length() < 1500) - { - if( CRpg *pLauncher = (CRpg*)( (CBaseEntity*)( m_hLauncher ) ) ) - { - // my launcher is still around, tell it I'm dead. - pLauncher->m_cActiveRockets--; - } - Detonate(); - } - } - // ALERT( at_console, "%.0f\n", flSpeed ); - - SetNextThink( 0.1 ); -} #endif - -void CRpg::Reload( void ) -{ - int iResult = 0; - - // don't bother with any of this if don't need to reload. - if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == RPG_MAX_CLIP ) - return; - - // because the RPG waits to autoreload when no missiles are active while the LTD is on, the - // weapons code is constantly calling into this function, but is often denied because - // a) missiles are in flight, but the LTD is on - // or - // b) player is totally out of ammo and has nothing to switch to, and should be allowed to - // shine the designator around - // - // Set the next attack time into the future so that WeaponIdle will get called more often - // than reload, allowing the RPG LTD to be updated - - m_flNextPrimaryAttack = GetNextAttackDelay( 0.5 ); - - if( m_cActiveRockets && m_fSpotActive ) - { - // no reloading when there are active missiles tracking the designator. - // ward off future autoreload attempts by setting next attack time into the future for a bit. - return; - } - -#ifndef CLIENT_DLL - if( m_pSpot && m_fSpotActive ) - { - m_pSpot->Suspend( 2.1 ); - m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 2.1; - } -#endif - - if( m_iClip == 0 ) - iResult = DefaultReload( RPG_MAX_CLIP, RPG_RELOAD, 2 ); - - if( iResult ) - m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); -} - -void CRpg::Spawn() -{ - Precache(); - m_iId = WEAPON_RPG; - - SET_MODEL( ENT( pev ), "models/w_rpg.mdl" ); - m_fSpotActive = 1; - -#ifdef CLIENT_DLL - if( bIsMultiplayer() ) -#else - if( g_pGameRules->IsMultiplayer() ) -#endif - { - // more default ammo in multiplay. - m_iDefaultAmmo = RPG_DEFAULT_GIVE * 2; - } - else - { - m_iDefaultAmmo = RPG_DEFAULT_GIVE; - } - - FallInit();// get ready to fall down. -} - -void CRpg::Precache( void ) -{ - PRECACHE_MODEL( "models/w_rpg.mdl" ); - PRECACHE_MODEL( "models/v_rpg.mdl" ); - PRECACHE_MODEL( "models/p_rpg.mdl" ); - - PRECACHE_SOUND( "items/9mmclip1.wav" ); - - UTIL_PrecacheOther( "laser_spot" ); - UTIL_PrecacheOther( "rpg_rocket" ); - - PRECACHE_SOUND( "weapons/rocketfire1.wav" ); - PRECACHE_SOUND( "weapons/glauncher.wav" ); // alternative fire sound - - m_usRpg = PRECACHE_EVENT( 1, "events/rpg.sc" ); -} - -int CRpg::GetItemInfo( ItemInfo *p ) -{ - p->pszName = STRING( pev->classname ); - p->pszAmmo1 = "rockets"; - p->iMaxAmmo1 = ROCKET_MAX_CARRY; - p->pszAmmo2 = NULL; - p->iMaxAmmo2 = -1; - p->iMaxClip = RPG_MAX_CLIP; - p->iSlot = 3; - p->iPosition = 0; - p->iId = m_iId = WEAPON_RPG; - p->iFlags = 0; - p->iWeight = RPG_WEIGHT; - - return 1; -} - -int CRpg::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; -} - -BOOL CRpg::Deploy() -{ - if( m_iClip == 0 ) - { - return DefaultDeploy( "models/v_rpg.mdl", "models/p_rpg.mdl", RPG_DRAW_UL, "rpg" ); - } - - return DefaultDeploy( "models/v_rpg.mdl", "models/p_rpg.mdl", RPG_DRAW1, "rpg" ); -} - -BOOL CRpg::CanHolster( void ) -{ - if( m_fSpotActive && m_cActiveRockets ) - { - // can't put away while guiding a missile. - return FALSE; - } - - return TRUE; -} - -void CRpg::Holster( int skiplocal /* = 0 */ ) -{ - m_fInReload = FALSE;// cancel any reload in progress. - - m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5; - - SendWeaponAnim( RPG_HOLSTER1 ); - -#ifndef CLIENT_DLL - if( m_pSpot ) - { - m_pSpot->Killed( NULL, GIB_NEVER ); - m_pSpot = NULL; - } -#endif -} - -void CRpg::PrimaryAttack() -{ - if( m_iClip ) - { - m_pPlayer->m_iWeaponVolume = LOUD_GUN_VOLUME; - m_pPlayer->m_iWeaponFlash = BRIGHT_GUN_FLASH; - -#ifndef CLIENT_DLL - // player "shoot" animation - m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); - - UTIL_MakeVectors( m_pPlayer->pev->v_angle ); - Vector vecSrc = m_pPlayer->GetGunPosition() + gpGlobals->v_forward * 16 + gpGlobals->v_right * 8 + gpGlobals->v_up * -8; - - CRpgRocket *pRocket = CRpgRocket::CreateRpgRocket( vecSrc, m_pPlayer->pev->v_angle, m_pPlayer, this ); - - UTIL_MakeVectors( m_pPlayer->pev->v_angle );// RpgRocket::Create stomps on globals, so remake. - pRocket->pev->velocity = pRocket->pev->velocity + gpGlobals->v_forward * DotProduct( m_pPlayer->pev->velocity, gpGlobals->v_forward ); -#endif - - // firing RPG no longer turns on the designator. ALT fire is a toggle switch for the LTD. - // Ken signed up for this as a global change (sjb) - - int flags; -#if defined( CLIENT_WEAPONS ) - flags = FEV_NOTHOST; -#else - flags = 0; -#endif - PLAYBACK_EVENT( flags, m_pPlayer->edict(), m_usRpg ); - - m_iClip--; - - m_flNextPrimaryAttack = GetNextAttackDelay( 1.5 ); - m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.5; - - ResetEmptySound(); - } - else - { - PlayEmptySound(); - m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.2; - } - UpdateSpot(); -} - -void CRpg::SecondaryAttack() -{ - m_fSpotActive = !m_fSpotActive; - -#ifndef CLIENT_DLL - if( !m_fSpotActive && m_pSpot ) - { - m_pSpot->Killed( NULL, GIB_NORMAL ); - m_pSpot = NULL; - } -#endif - m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.2; -} - -void CRpg::WeaponIdle( void ) -{ - UpdateSpot(); - - if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) - return; - - if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] ) - { - ResetEmptySound(); - - int iAnim; - float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 ); - if( flRand <= 0.75 || m_fSpotActive ) - { - if( m_iClip == 0 ) - iAnim = RPG_IDLE_UL; - else - iAnim = RPG_IDLE; - - m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 90.0 / 15.0; - } - else - { - if( m_iClip == 0 ) - iAnim = RPG_FIDGET_UL; - else - iAnim = RPG_FIDGET; - - m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 3.0; - } - - SendWeaponAnim( iAnim ); - } - else - { - m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1; - } -} - -void CRpg::UpdateSpot( void ) -{ -#ifndef CLIENT_DLL - if( m_fSpotActive ) - { - if( !m_pSpot ) - { - m_pSpot = CLaserSpot::CreateSpot(); - } - - UTIL_MakeVectors( m_pPlayer->pev->v_angle ); - Vector vecSrc = m_pPlayer->GetGunPosition(); - Vector vecAiming = gpGlobals->v_forward; - - TraceResult tr; - UTIL_TraceLine( vecSrc, vecSrc + vecAiming * 8192, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr ); - - UTIL_SetOrigin( m_pSpot, tr.vecEndPos ); - } -#endif -} - -class CRpgAmmo : public CBasePlayerAmmo -{ - void Spawn( void ) - { - Precache(); - SET_MODEL( ENT( pev ), "models/w_rpgammo.mdl" ); - CBasePlayerAmmo::Spawn(); - } - void Precache( void ) - { - PRECACHE_MODEL( "models/w_rpgammo.mdl" ); - PRECACHE_SOUND( "items/9mmclip1.wav" ); - } - BOOL AddAmmo( CBaseEntity *pOther ) - { - int iGive; -#ifdef CLIENT_DLL - if( bIsMultiplayer() ) -#else - if( g_pGameRules->IsMultiplayer() ) -#endif - { - // hand out more ammo per rocket in multiplayer. - iGive = AMMO_RPGCLIP_GIVE * 2; - } - else - { - iGive = AMMO_RPGCLIP_GIVE; - } - - if( pOther->GiveAmmo( iGive, "rockets", ROCKET_MAX_CARRY ) != -1 ) - { - EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM ); - return TRUE; - } - return FALSE; - } -}; - -LINK_ENTITY_TO_CLASS( ammo_rpgclip, CRpgAmmo ) #endif diff --git a/dlls/scripted.cpp b/dlls/scripted.cpp index fd01c945..c2ff048b 100644 --- a/dlls/scripted.cpp +++ b/dlls/scripted.cpp @@ -414,17 +414,31 @@ void CCineMonster::PossessEntity( void ) m_iState = STATE_ON; // LRC: assume we'll set it to 'on', unless proven otherwise... switch( m_fMoveTo ) { - case 1: - case 2: - DelayStart( 1 ); - m_iState = STATE_TURN_ON; - // fall through... - case 0: - case 4: - case 5: - case 6: + case 5: + case 0: pTarget->m_scriptState = SCRIPT_WAIT; break; + case 1: + pTarget->m_scriptState = SCRIPT_WALK_TO_MARK; + break; + case 2: + pTarget->m_scriptState = SCRIPT_RUN_TO_MARK; + break; + case 4: + UTIL_SetOrigin( pTarget, pev->origin ); + pTarget->pev->ideal_yaw = pev->angles.y; + pTarget->pev->avelocity = g_vecZero; + pTarget->pev->velocity = g_vecZero; + pTarget->pev->effects |= EF_NOINTERP; + pTarget->pev->angles.y = pev->angles.y; + pTarget->m_scriptState = SCRIPT_WAIT; + m_startTime = gpGlobals->time + 1E6; + // UNDONE: Add a flag to do this so people can fixup physics after teleporting monsters + pTarget->pev->flags &= ~FL_ONGROUND; + break; + default: + ALERT(at_aiconsole, "aiscript: invalid Move To Position value!"); + break; } // ALERT( at_aiconsole, "\"%s\" found and used (INT: %s)\n", STRING( pTarget->pev->targetname ), FBitSet(pev->spawnflags, SF_SCRIPT_NOINTERRUPT)?"No":"Yes" ); diff --git a/dlls/shotgun.cpp b/dlls/shotgun.cpp index 229956f1..7a7e3405 100644 --- a/dlls/shotgun.cpp +++ b/dlls/shotgun.cpp @@ -23,65 +23,66 @@ #include "gamerules.h" // special deathmatch shotgun spreads -#define VECTOR_CONE_DM_SHOTGUN Vector( 0.08716, 0.04362, 0.00 )// 10 degrees by 5 degrees +#define VECTOR_CONE_DM_SHOTGUN Vector( 0.08716, 0.04362, 0.00 )// 10 degrees by 5 degrees #define VECTOR_CONE_DM_DOUBLESHOTGUN Vector( 0.17365, 0.04362, 0.00 ) // 20 degrees by 5 degrees enum shotgun_e { SHOTGUN_IDLE = 0, + SHOTGUN_IDLE2, SHOTGUN_FIRE, - SHOTGUN_FIRE2, - SHOTGUN_RELOAD, - SHOTGUN_PUMP, - SHOTGUN_START_RELOAD, - SHOTGUN_DRAW, - SHOTGUN_HOLSTER, - SHOTGUN_IDLE4, - SHOTGUN_IDLE_DEEP + SHOTGUN_RELOAD_START, + SHOTGUN_RELOAD_INS, + SHOTGUN_RELOAD_END, + SHOTGUN_DRAW }; -LINK_ENTITY_TO_CLASS( weapon_shotgun, CShotgun ) +LINK_ENTITY_TO_CLASS( weapon_shotgun, CShotgun ); -void CShotgun::Spawn() +void CShotgun::Spawn( ) { - Precache(); + Precache( ); m_iId = WEAPON_SHOTGUN; - SET_MODEL( ENT( pev ), "models/w_shotgun.mdl" ); + SET_MODEL(ENT(pev), "models/w_shotgun.mdl"); m_iDefaultAmmo = SHOTGUN_DEFAULT_GIVE; FallInit();// get ready to fall } + void CShotgun::Precache( void ) { - PRECACHE_MODEL( "models/v_shotgun.mdl" ); - PRECACHE_MODEL( "models/w_shotgun.mdl" ); - PRECACHE_MODEL( "models/p_shotgun.mdl" ); + PRECACHE_MODEL("models/v_shotgun.mdl"); + PRECACHE_MODEL("models/w_shotgun.mdl"); + PRECACHE_MODEL("models/p_shotgun.mdl"); - m_iShell = PRECACHE_MODEL( "models/shotgunshell.mdl" );// shotgun shell + m_iShell = PRECACHE_MODEL ("models/shotgunshell.mdl");// shotgun shell - PRECACHE_SOUND( "items/9mmclip1.wav" ); + PRECACHE_SOUND("items/9mmclip1.wav"); - PRECACHE_SOUND( "weapons/dbarrel1.wav" );//shotgun - PRECACHE_SOUND( "weapons/sbarrel1.wav" );//shotgun + PRECACHE_SOUND ("weapons/dbarrel1.wav");//shotgun + PRECACHE_SOUND ("weapons/sbarrel1.wav");//shotgun - PRECACHE_SOUND( "weapons/reload1.wav" ); // shotgun reload - PRECACHE_SOUND( "weapons/reload3.wav" ); // shotgun reload + PRECACHE_SOUND ("weapons/shotgun_fire_safe.wav"); + PRECACHE_SOUND ("weapons/shotgun_fire.wav"); + PRECACHE_SOUND ("weapons/shotgun_insert.wav"); + PRECACHE_SOUND ("weapons/shotgun_pump.wav"); + //PRECACHE_SOUND ("weapons/reload1.wav"); // shotgun reload + //PRECACHE_SOUND ("weapons/reload3.wav"); // shotgun reload - //PRECACHE_SOUND( "weapons/sshell1.wav" ); // shotgun reload - played on client - //PRECACHE_SOUND( "weapons/sshell3.wav" ); // shotgun reload - played on client +// PRECACHE_SOUND ("weapons/sshell1.wav"); // shotgun reload - played on client +// PRECACHE_SOUND ("weapons/sshell3.wav"); // shotgun reload - played on client - PRECACHE_SOUND( "weapons/357_cock1.wav" ); // gun empty sound - PRECACHE_SOUND( "weapons/scock1.wav" ); // cock gun + PRECACHE_SOUND ("weapons/357_cock1.wav"); // gun empty sound + PRECACHE_SOUND ("weapons/scock1.wav"); // cock gun - m_usSingleFire = PRECACHE_EVENT( 1, "events/shotgun1.sc" ); - m_usDoubleFire = PRECACHE_EVENT( 1, "events/shotgun2.sc" ); + m_usSingleFire = PRECACHE_EVENT( 1, "events/shotgun.sc" ); } int CShotgun::AddToPlayer( CBasePlayer *pPlayer ) { - if( CBasePlayerWeapon::AddToPlayer( pPlayer ) ) + if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) ) { MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev ); WRITE_BYTE( m_iId ); @@ -91,16 +92,17 @@ int CShotgun::AddToPlayer( CBasePlayer *pPlayer ) return FALSE; } -int CShotgun::GetItemInfo( ItemInfo *p ) + +int CShotgun::GetItemInfo(ItemInfo *p) { - p->pszName = STRING( pev->classname ); + p->pszName = STRING(pev->classname); p->pszAmmo1 = "buckshot"; p->iMaxAmmo1 = BUCKSHOT_MAX_CARRY; p->pszAmmo2 = NULL; p->iMaxAmmo2 = -1; p->iMaxClip = SHOTGUN_MAX_CLIP; p->iSlot = 2; - p->iPosition = 1; + p->iPosition = 2; p->iFlags = 0; p->iId = m_iId = WEAPON_SHOTGUN; p->iWeight = SHOTGUN_WEIGHT; @@ -108,33 +110,38 @@ int CShotgun::GetItemInfo( ItemInfo *p ) return 1; } -BOOL CShotgun::Deploy() + + +BOOL CShotgun::Deploy( ) { - return DefaultDeploy( "models/v_shotgun.mdl", "models/p_shotgun.mdl", SHOTGUN_DRAW, "shotgun" ); + return DefaultDeploy( "models/v_shotgun.mdl", "models/p_shotgun.mdl", SHOTGUN_DRAW, "Shotgun" ); } void CShotgun::PrimaryAttack() { // don't fire underwater - if( m_pPlayer->pev->waterlevel == 3 ) if (m_pPlayer->pev->waterlevel == 3 && m_pPlayer->pev->watertype > CONTENT_FLYFIELD) { - PlayEmptySound(); - m_flNextPrimaryAttack = GetNextAttackDelay( 0.15 ); + PlayEmptySound( ); + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15; return; } - if( m_iClip <= 0 ) + if (m_iClip <= 0) { - Reload(); - if( m_iClip == 0 ) - PlayEmptySound(); + Reload( ); + if (m_iClip == 0) + PlayEmptySound( ); return; } m_pPlayer->m_iWeaponVolume = LOUD_GUN_VOLUME; m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH; +#ifndef CLIENT_DLL + SetThink( &CShotgun::LolShell ); + pev->nextthink = gpGlobals->time + 0.6; +#endif m_iClip--; int flags; @@ -143,153 +150,69 @@ void CShotgun::PrimaryAttack() #else flags = 0; #endif - m_pPlayer->pev->effects = (int)( m_pPlayer->pev->effects ) | EF_MUZZLEFLASH; - // player "shoot" animation - m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); + m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH; - Vector vecSrc = m_pPlayer->GetGunPosition(); + Vector vecSrc = m_pPlayer->GetGunPosition( ); Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); - Vector vecDir; - -#ifdef CLIENT_DLL - if( bIsMultiplayer() ) -#else - if( g_pGameRules->IsMultiplayer() ) -#endif - { - vecDir = m_pPlayer->FireBulletsPlayer( 4, vecSrc, vecAiming, VECTOR_CONE_DM_SHOTGUN, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed ); - } - else - { - // regular old, untouched spread. - vecDir = m_pPlayer->FireBulletsPlayer( 6, vecSrc, vecAiming, VECTOR_CONE_10DEGREES, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed ); - } + // regular old, untouched spread. + Vector vecDir = m_pPlayer->FireBulletsPlayer( 8, vecSrc, vecAiming, VECTOR_CONE_10DEGREES, 2048, BULLET_PLAYER_BUCKSHOT, 0, gSkillData.plrDmgBuckshot, m_pPlayer->pev, m_pPlayer->random_seed ); PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usSingleFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 ); - if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 ) - // HEV suit - indicate out of ammo condition - m_pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 ); - - //if( m_iClip != 0 ) + if (m_iClip != 0) m_flPumpTime = gpGlobals->time + 0.5; - m_flNextPrimaryAttack = GetNextAttackDelay( 0.75 ); - m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.75; - if( m_iClip != 0 ) + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.3; + if (m_iClip != 0) m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 5.0; else - m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.75; + m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.3; m_fInSpecialReload = 0; } -void CShotgun::SecondaryAttack( void ) +void CShotgun::LolShell( void ) { - // don't fire underwater - if (m_pPlayer->pev->waterlevel == 3 && m_pPlayer->pev->watertype > CONTENT_FLYFIELD) - { - PlayEmptySound(); - m_flNextPrimaryAttack = GetNextAttackDelay( 0.15 ); - return; - } +#ifndef CLIENT_DLL + Vector vecShellVelocity = m_pPlayer->pev->velocity + + gpGlobals->v_right * 60 + + gpGlobals->v_up * 200 + + gpGlobals->v_forward * 40; - if( m_iClip <= 1 ) - { - Reload(); - PlayEmptySound(); - return; - } - - m_pPlayer->m_iWeaponVolume = LOUD_GUN_VOLUME; - m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH; - - m_iClip -= 2; - - int flags; -#if defined( CLIENT_WEAPONS ) - flags = FEV_NOTHOST; -#else - flags = 0; + EjectBrass( m_pPlayer->pev->origin + m_pPlayer->pev->view_ofs + gpGlobals->v_up * -12 + gpGlobals->v_forward * 45 + gpGlobals->v_right * 30, vecShellVelocity, pev->angles.y, m_iShell, TE_BOUNCE_SHOTSHELL ); #endif - m_pPlayer->pev->effects = (int)( m_pPlayer->pev->effects ) | EF_MUZZLEFLASH; - - // player "shoot" animation - m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); - - Vector vecSrc = m_pPlayer->GetGunPosition(); - Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); - - Vector vecDir; - -#ifdef CLIENT_DLL - if( bIsMultiplayer() ) -#else - if( g_pGameRules->IsMultiplayer() ) -#endif - { - // tuned for deathmatch - vecDir = m_pPlayer->FireBulletsPlayer( 8, vecSrc, vecAiming, VECTOR_CONE_DM_DOUBLESHOTGUN, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed ); - } - else - { - // untouched default single player - vecDir = m_pPlayer->FireBulletsPlayer( 12, vecSrc, vecAiming, VECTOR_CONE_10DEGREES, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed ); - } - - PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usDoubleFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 ); - - if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 ) - // HEV suit - indicate out of ammo condition - m_pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 ); - - //if( m_iClip != 0 ) - m_flPumpTime = gpGlobals->time + 0.95; - - m_flNextPrimaryAttack = GetNextAttackDelay( 1.5 ); - m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.5; - if( m_iClip != 0 ) - m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 6.0; - else - m_flTimeWeaponIdle = 1.5; - - m_fInSpecialReload = 0; } void CShotgun::Reload( void ) { - if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == SHOTGUN_MAX_CLIP ) + if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == SHOTGUN_MAX_CLIP) return; // don't reload until recoil is done - if( m_flNextPrimaryAttack > UTIL_WeaponTimeBase() ) + if (m_flNextPrimaryAttack > UTIL_WeaponTimeBase()) return; // check to see if we're ready to reload - if( m_fInSpecialReload == 0 ) + if (m_fInSpecialReload == 0) { - SendWeaponAnim( SHOTGUN_START_RELOAD ); + SendWeaponAnim( SHOTGUN_RELOAD_START ); m_fInSpecialReload = 1; m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.6; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.6; - m_flNextPrimaryAttack = GetNextAttackDelay( 1.0 ); - m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0; + m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.0; return; } - else if( m_fInSpecialReload == 1 ) + else if (m_fInSpecialReload == 1) { - if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) + if (m_flTimeWeaponIdle > UTIL_WeaponTimeBase()) return; // was waiting for gun to move to side m_fInSpecialReload = 2; - if( RANDOM_LONG( 0, 1 ) ) - EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/reload1.wav", 1, ATTN_NORM, 0, 85 + RANDOM_LONG( 0, 0x1f ) ); - else - EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/reload3.wav", 1, ATTN_NORM, 0, 85 + RANDOM_LONG( 0, 0x1f ) ); + EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/shotgun_insert.wav", 1, ATTN_NORM, 0, 85 + RANDOM_LONG(0,0x1f)); - SendWeaponAnim( SHOTGUN_RELOAD ); + SendWeaponAnim( SHOTGUN_RELOAD_INS ); m_flNextReload = UTIL_WeaponTimeBase() + 0.5; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5; @@ -303,91 +226,73 @@ void CShotgun::Reload( void ) } } -void CShotgun::WeaponTick() -{ - if( m_flPumpTime && m_flPumpTime < gpGlobals->time ) - { - // play pumping sound - EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/scock1.wav", 1, ATTN_NORM, 0, 95 + RANDOM_LONG( 0, 0x1f ) ); - m_flPumpTime = 0; - } -} void CShotgun::WeaponIdle( void ) { - ResetEmptySound(); + ResetEmptySound( ); m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES ); - if( m_flTimeWeaponIdle < UTIL_WeaponTimeBase() ) + if ( m_flPumpTime && m_flPumpTime < gpGlobals->time ) { - if( m_iClip == 0 && m_fInSpecialReload == 0 && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] ) + // play pumping sound + EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/shotgun_pump.wav", 1, ATTN_NORM, 0, 95 + RANDOM_LONG(0,0x1f)); + m_flPumpTime = 0; + } + + if (m_flTimeWeaponIdle < UTIL_WeaponTimeBase() ) + { + if (m_iClip == 0 && m_fInSpecialReload == 0 && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) { - Reload(); + Reload( ); } - else if( m_fInSpecialReload != 0 ) + else if (m_fInSpecialReload != 0) { - if( m_iClip != SHOTGUN_MAX_CLIP && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] ) + if (m_iClip != SHOTGUN_MAX_CLIP && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]) { - Reload(); + Reload( ); } else { // reload debounce has timed out - SendWeaponAnim( SHOTGUN_PUMP ); - + SendWeaponAnim( SHOTGUN_RELOAD_END ); // play cocking sound - EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/scock1.wav", 1, ATTN_NORM, 0, 95 + RANDOM_LONG( 0, 0x1f ) ); + EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/shotgun_pump.wav", 1, ATTN_NORM, 0, 95 + RANDOM_LONG(0,0x1f)); m_fInSpecialReload = 0; m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.5; } } else { - int iAnim; - float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 ); - if( flRand <= 0.8 ) - { - iAnim = SHOTGUN_IDLE_DEEP; - m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + ( 60.0 / 12.0 );// * RANDOM_LONG( 2, 5 ); - } - else if( flRand <= 0.95 ) - { - iAnim = SHOTGUN_IDLE; - m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + ( 20.0 / 9.0 ); - } - else - { - iAnim = SHOTGUN_IDLE4; - m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + ( 20.0 / 9.0 ); - } - SendWeaponAnim( iAnim ); + SendWeaponAnim( SHOTGUN_IDLE ); + m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (20.0/9.0); } } } + + class CShotgunAmmo : public CBasePlayerAmmo { void Spawn( void ) { - Precache(); - SET_MODEL( ENT( pev ), "models/w_shotbox.mdl" ); - CBasePlayerAmmo::Spawn(); + Precache( ); + SET_MODEL(ENT(pev), "models/w_shotbox.mdl"); + CBasePlayerAmmo::Spawn( ); } void Precache( void ) { - PRECACHE_MODEL( "models/w_shotbox.mdl" ); - PRECACHE_SOUND( "items/9mmclip1.wav" ); + PRECACHE_MODEL ("models/w_shotbox.mdl"); + PRECACHE_SOUND("items/9mmclip1.wav"); } BOOL AddAmmo( CBaseEntity *pOther ) { - if( pOther->GiveAmmo( AMMO_BUCKSHOTBOX_GIVE, "buckshot", BUCKSHOT_MAX_CARRY ) != -1 ) + if (pOther->GiveAmmo( AMMO_BUCKSHOTBOX_GIVE, "buckshot", BUCKSHOT_MAX_CARRY ) != -1) { - EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM ); + EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM); return TRUE; } return FALSE; } }; - -LINK_ENTITY_TO_CLASS( ammo_buckshot, CShotgunAmmo ) +LINK_ENTITY_TO_CLASS( ammo_buckshot, CShotgunAmmo ); diff --git a/dlls/skill.h b/dlls/skill.h index 5244c923..13430303 100644 --- a/dlls/skill.h +++ b/dlls/skill.h @@ -84,31 +84,37 @@ struct skilldata_t float snarkDmgBite; float snarkDmgPop; + float wheelchairHealth; + float wheelchairDmgAttack; + float zombieHealth; float zombieDmgOneSlash; float zombieDmgBothSlash; + float zombie2Health; + float zombie2DmgOneSlash; + float zombie2DmgBothSlash; + + float zombie3Health; + float zombie3DmgOneSlash; + float zombie3DmgBothSlash; + float turretHealth; float miniturretHealth; float sentryHealth; // Player Weapons - float plrDmgCrowbar; - float plrDmg9MM; - float plrDmg357; - float plrDmgMP5; - float plrDmgM203Grenade; + float plrDmgKnife; + float plrDmgHammer; + float plrDmgAxe; + float plrDmgGlock; + float plrDmgBeretta; + float plrDmgP228; + float plrDmgRevolver; + float plrDmgUzi; + float plrDmgMP5K; + float plrDmgDeagle; float plrDmgBuckshot; - float plrDmgCrossbowClient; - float plrDmgCrossbowMonster; - float plrDmgRPG; - float plrDmgGauss; - float plrDmgEgonNarrow; - float plrDmgEgonWide; - float plrDmgHornet; - float plrDmgHandGrenade; - float plrDmgSatchel; - float plrDmgTripmine; // weapons shared by monsters float monDmg9MM; diff --git a/dlls/squeakgrenade.cpp b/dlls/squeakgrenade.cpp index 5ad051d4..03e81cb7 100644 --- a/dlls/squeakgrenade.cpp +++ b/dlls/squeakgrenade.cpp @@ -409,181 +409,4 @@ void CSqueakGrenade::SuperBounceTouch( CBaseEntity *pOther ) m_flNextBounceSoundTime = gpGlobals->time + 0.5;// half second. } #endif - -LINK_ENTITY_TO_CLASS( weapon_snark, CSqueak ) - -void CSqueak::Spawn() -{ - Precache(); - m_iId = WEAPON_SNARK; - SET_MODEL( ENT( pev ), "models/w_sqknest.mdl" ); - - FallInit();//get ready to fall down. - - m_iDefaultAmmo = SNARK_DEFAULT_GIVE; - - pev->sequence = 1; - pev->animtime = gpGlobals->time; - pev->framerate = 1.0; -} - -void CSqueak::Precache( void ) -{ - PRECACHE_MODEL( "models/w_sqknest.mdl" ); - PRECACHE_MODEL( "models/v_squeak.mdl" ); - PRECACHE_MODEL( "models/p_squeak.mdl" ); - PRECACHE_SOUND( "squeek/sqk_hunt2.wav" ); - PRECACHE_SOUND( "squeek/sqk_hunt3.wav" ); - UTIL_PrecacheOther( "monster_snark" ); - - m_usSnarkFire = PRECACHE_EVENT( 1, "events/snarkfire.sc" ); -} - -int CSqueak::GetItemInfo( ItemInfo *p ) -{ - p->pszName = STRING( pev->classname ); - p->pszAmmo1 = "Snarks"; - p->iMaxAmmo1 = SNARK_MAX_CARRY; - p->pszAmmo2 = NULL; - p->iMaxAmmo2 = -1; - p->iMaxClip = WEAPON_NOCLIP; - p->iSlot = 4; - p->iPosition = 3; - p->iId = m_iId = WEAPON_SNARK; - p->iWeight = SNARK_WEIGHT; - p->iFlags = ITEM_FLAG_LIMITINWORLD | ITEM_FLAG_EXHAUSTIBLE; - - return 1; -} - -BOOL CSqueak::Deploy() -{ - // play hunt sound - float flRndSound = RANDOM_FLOAT( 0, 1 ); - - if( flRndSound <= 0.5 ) - EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "squeek/sqk_hunt2.wav", 1, ATTN_NORM, 0, 100 ); - else - EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "squeek/sqk_hunt3.wav", 1, ATTN_NORM, 0, 100 ); - - m_pPlayer->m_iWeaponVolume = QUIET_GUN_VOLUME; - - return DefaultDeploy( "models/v_squeak.mdl", "models/p_squeak.mdl", SQUEAK_UP, "squeak" ); -} - -void CSqueak::Holster( int skiplocal /* = 0 */ ) -{ - m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5; - - if( !m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] ) - { - m_pPlayer->pev->weapons &= ~( 1 << WEAPON_SNARK ); - SetThink(&CSqueak:: DestroyItem ); - SetNextThink( 0.1 ); - return; - } - - SendWeaponAnim( SQUEAK_DOWN ); - EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "common/null.wav", 1.0, ATTN_NORM ); -} - -void CSqueak::PrimaryAttack() -{ - if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] ) - { - UTIL_MakeVectors( m_pPlayer->pev->v_angle ); - TraceResult tr; - Vector trace_origin; - - // HACK HACK: Ugly hacks to handle change in origin based on new physics code for players - // Move origin up if crouched and start trace a bit outside of body ( 20 units instead of 16 ) - trace_origin = m_pPlayer->pev->origin; - if( m_pPlayer->pev->flags & FL_DUCKING ) - { - trace_origin = trace_origin - ( VEC_HULL_MIN - VEC_DUCK_HULL_MIN ); - } - - // find place to toss monster - UTIL_TraceLine( trace_origin + gpGlobals->v_forward * 20, trace_origin + gpGlobals->v_forward * 64, dont_ignore_monsters, NULL, &tr ); - - int flags; -#ifdef CLIENT_WEAPONS - flags = FEV_NOTHOST; -#else - flags = 0; -#endif - PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usSnarkFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, 0.0, 0.0, 0, 0, 0, 0 ); - - if( tr.fAllSolid == 0 && tr.fStartSolid == 0 && tr.flFraction > 0.25 ) - { - // player "shoot" animation - m_pPlayer->SetAnimation( PLAYER_ATTACK1 ); -#ifndef CLIENT_DLL - CBaseEntity *pSqueak = CBaseEntity::Create( "monster_snark", tr.vecEndPos, m_pPlayer->pev->v_angle, m_pPlayer->edict() ); - pSqueak->pev->velocity = gpGlobals->v_forward * 200 + m_pPlayer->pev->velocity; -#endif - // play hunt sound - float flRndSound = RANDOM_FLOAT( 0, 1 ); - - if( flRndSound <= 0.5 ) - EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "squeek/sqk_hunt2.wav", 1, ATTN_NORM, 0, 105 ); - else - EMIT_SOUND_DYN( ENT( pev ), CHAN_VOICE, "squeek/sqk_hunt3.wav", 1, ATTN_NORM, 0, 105 ); - - m_pPlayer->m_iWeaponVolume = QUIET_GUN_VOLUME; - - m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType]--; - - m_fJustThrown = 1; - - m_flNextPrimaryAttack = GetNextAttackDelay( 0.3 ); - m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.0; - } - } -} - -void CSqueak::SecondaryAttack( void ) -{ - -} - -void CSqueak::WeaponIdle( void ) -{ - if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() ) - return; - - if( m_fJustThrown ) - { - m_fJustThrown = 0; - - if( !m_pPlayer->m_rgAmmo[PrimaryAmmoIndex()] ) - { - RetireWeapon(); - return; - } - - SendWeaponAnim( SQUEAK_UP ); - m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 ); - return; - } - - int iAnim; - float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 ); - if( flRand <= 0.75 ) - { - iAnim = SQUEAK_IDLE1; - m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 30.0 / 16 * (2); - } - else if( flRand <= 0.875 ) - { - iAnim = SQUEAK_FIDGETFIT; - m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 70.0 / 16.0; - } - else - { - iAnim = SQUEAK_FIDGETNIP; - m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 80.0 / 16.0; - } - SendWeaponAnim( iAnim ); -} #endif diff --git a/dlls/stats.cpp b/dlls/stats.cpp index e37832c8..8fa4cbf6 100644 --- a/dlls/stats.cpp +++ b/dlls/stats.cpp @@ -21,7 +21,7 @@ float AmmoDamage( const char *pName ) { - if( !pName ) + /*if( !pName ) return 0; if( !strcmp( pName, "9mm" ) ) @@ -43,7 +43,7 @@ float AmmoDamage( const char *pName ) if( !strcmp( pName, "Satchel Charge") ) return gSkillData.plrDmgSatchel; if( !strcmp( pName, "Trip Mine") ) - return gSkillData.plrDmgTripmine; + return gSkillData.plrDmgTripmine;*/ return 0; } diff --git a/dlls/triggers.cpp b/dlls/triggers.cpp index 607b7af1..c515ba96 100644 --- a/dlls/triggers.cpp +++ b/dlls/triggers.cpp @@ -271,6 +271,7 @@ void CTriggerRelay::KeyValue( KeyValueData *pkvd ) void CTriggerRelay::Spawn( void ) { + pev->nextthink = gpGlobals->time + 0.1f; } void CTriggerRelay::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value ) @@ -5023,6 +5024,9 @@ void CTriggerChangeCVar::Think( void ) #define SF_CAMERA_PLAYER_POSITION 1 #define SF_CAMERA_PLAYER_TARGET 2 #define SF_CAMERA_PLAYER_TAKECONTROL 4 +#define SF_CAMERA_PLAYER_HIDEHUD 8 +#define SF_CAMERA_PLAYER_BLACKBARS 16 +#define SF_CAMERA_PLAYER_NOISEEFFECT 32 class CTriggerCamera : public CBaseDelay { @@ -5161,10 +5165,18 @@ void CTriggerCamera::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYP return; } + CBasePlayer *pPlayer = (CBasePlayer *)pActivator; if( FBitSet( pev->spawnflags, SF_CAMERA_PLAYER_TAKECONTROL ) ) - { - ( (CBasePlayer *)pActivator )->EnableControl( FALSE ); - } + pPlayer->EnableControl( FALSE ); + + if( FBitSet( pev->spawnflags, SF_CAMERA_PLAYER_HIDEHUD ) ) + SetBits( pPlayer->m_iHideHUD, HIDEHUD_ALL_EXCLUDEMESSAGE ); + + if( FBitSet( pev->spawnflags, SF_CAMERA_PLAYER_BLACKBARS ) ) + SetBits( pPlayer->m_iHideHUD, HIDEHUD_BLACKBARS ); + + if( FBitSet( pev->spawnflags, SF_CAMERA_PLAYER_NOISEEFFECT ) ) + SetBits( pPlayer->m_iHideHUD, HIDEHUD_NOISEEFFECT ); if( m_sPath ) { @@ -5231,9 +5243,21 @@ void CTriggerCamera::FollowTarget() { if( m_hPlayer->IsAlive() ) { + CBasePlayer *pPlayer = (CBasePlayer *)((CBaseEntity *)m_hPlayer); SET_VIEW( m_hPlayer->edict(), m_hPlayer->edict() ); - ( (CBasePlayer *)( (CBaseEntity *)m_hPlayer ) )->EnableControl( TRUE ); + + pPlayer->EnableControl( TRUE ); + + if( FBitSet( pev->spawnflags, SF_CAMERA_PLAYER_HIDEHUD ) ) + ClearBits( pPlayer->m_iHideHUD, HIDEHUD_ALL_EXCLUDEMESSAGE ); + + if( FBitSet( pev->spawnflags, SF_CAMERA_PLAYER_BLACKBARS ) ) + ClearBits( pPlayer->m_iHideHUD, HIDEHUD_BLACKBARS ); + + if( FBitSet( pev->spawnflags, SF_CAMERA_PLAYER_NOISEEFFECT ) ) + ClearBits( pPlayer->m_iHideHUD, HIDEHUD_NOISEEFFECT ); } + SUB_UseTargets( this, USE_TOGGLE, 0 ); pev->avelocity = Vector( 0, 0, 0 ); m_state = 0; diff --git a/dlls/util.cpp b/dlls/util.cpp index 3d45d173..5ea330cb 100644 --- a/dlls/util.cpp +++ b/dlls/util.cpp @@ -32,6 +32,32 @@ #include "gamerules.h" #include "movewith.h" #include "locus.h" +#include + +void UTIL_MuzzleLight( Vector vecSrc, float flRadius, byte r, byte g, byte b, float flTime, float flDecay ) +{ + MESSAGE_BEGIN( MSG_PVS, SVC_TEMPENTITY, vecSrc ); + WRITE_BYTE( TE_DLIGHT ); + WRITE_COORD( vecSrc.x ); // X + WRITE_COORD( vecSrc.y ); // Y + WRITE_COORD( vecSrc.z ); // Z + WRITE_BYTE( flRadius * 0.1f ); // radius * 0.1 + WRITE_BYTE( r ); // r + WRITE_BYTE( g ); // g + WRITE_BYTE( b ); // b + WRITE_BYTE( flTime * 10.0f ); // time * 10 + WRITE_BYTE( flDecay * 0.1f ); // decay * 0.1 + MESSAGE_END(); +} + +BOOL UTIL_FileExists( const char* filename ) +{ + struct stat checkfile; + if( 0 > stat( filename, &checkfile ) ) + return FALSE; + + return TRUE; +} float UTIL_WeaponTimeBase( void ) { diff --git a/dlls/util.h b/dlls/util.h index fdcf2417..63c679f9 100644 --- a/dlls/util.h +++ b/dlls/util.h @@ -609,6 +609,8 @@ void UTIL_UnsetGroupTrace( void ); int UTIL_SharedRandomLong( unsigned int seed, int low, int high ); float UTIL_SharedRandomFloat( unsigned int seed, float low, float high ); +void UTIL_MuzzleLight( Vector vecSrc, float flRadius, byte r, byte g, byte b, float flTime, float flDecay ); +BOOL UTIL_FileExists( const char* filename ); float UTIL_WeaponTimeBase( void ); int GetStdLightStyle (int iStyle); //LRC- declared here so it can be used by everything that // needs to deal with the standard lightstyles. diff --git a/dlls/weapons.cpp b/dlls/weapons.cpp index 15c1df6c..80ac65a2 100644 --- a/dlls/weapons.cpp +++ b/dlls/weapons.cpp @@ -36,6 +36,7 @@ extern int gEvilImpulse101; #define NOT_USED 255 +DLL_GLOBAL short g_sModelIndexLightning; DLL_GLOBAL short g_sModelIndexLaser;// holds the index for the laser beam DLL_GLOBAL const char *g_pModelNameLaser = "sprites/laserbeam.spr"; DLL_GLOBAL short g_sModelIndexLaserDot;// holds the index for the laser beam dot @@ -300,64 +301,59 @@ void W_Precache( void ) UTIL_PrecacheOther( "item_antidote" ); UTIL_PrecacheOther( "item_security" ); UTIL_PrecacheOther( "item_longjump" ); + UTIL_PrecacheOther( "item_flashlight" ); // shotgun UTIL_PrecacheOtherWeapon( "weapon_shotgun" ); UTIL_PrecacheOther( "ammo_buckshot" ); - // crowbar - UTIL_PrecacheOtherWeapon( "weapon_crowbar" ); + // knife + UTIL_PrecacheOtherWeapon( "weapon_knife" ); + + // axe + UTIL_PrecacheOtherWeapon( "weapon_axe" ); + + // hammer + UTIL_PrecacheOtherWeapon( "weapon_hammer" ); + + // spear + UTIL_PrecacheOtherWeapon( "weapon_Spear" ); // glock - UTIL_PrecacheOtherWeapon( "weapon_9mmhandgun" ); - UTIL_PrecacheOther( "ammo_9mmclip" ); - UTIL_PrecacheOther( "ammo_9mmbox" ); //LRC + UTIL_PrecacheOtherWeapon( "weapon_glock" ); + UTIL_PrecacheOther( "ammo_glock" ); - // mp5 - UTIL_PrecacheOtherWeapon( "weapon_9mmAR" ); - UTIL_PrecacheOther( "ammo_9mmAR" ); - UTIL_PrecacheOther( "ammo_ARgrenades" ); + // mp5k + UTIL_PrecacheOtherWeapon( "weapon_mp5k" ); + UTIL_PrecacheOther( "ammo_mp5k" ); -#if !defined( OEM_BUILD ) && !defined( HLDEMO_BUILD ) - // python - UTIL_PrecacheOtherWeapon( "weapon_357" ); - UTIL_PrecacheOther( "ammo_357" ); + // revolver + UTIL_PrecacheOtherWeapon( "weapon_revolver" ); + UTIL_PrecacheOther( "ammo_revolver" ); - // gauss - UTIL_PrecacheOtherWeapon( "weapon_gauss" ); - UTIL_PrecacheOther( "ammo_gaussclip" ); + // p228 + UTIL_PrecacheOtherWeapon( "weapon_P228" ); + UTIL_PrecacheOther( "ammo_P228" ); - // rpg - UTIL_PrecacheOtherWeapon( "weapon_rpg" ); - UTIL_PrecacheOther( "ammo_rpgclip" ); + // uzi + UTIL_PrecacheOtherWeapon( "weapon_uzi" ); + UTIL_PrecacheOther( "ammo_uzi" ); - // crossbow - UTIL_PrecacheOtherWeapon( "weapon_crossbow" ); - UTIL_PrecacheOther( "ammo_crossbow" ); + // beretta + UTIL_PrecacheOtherWeapon( "weapon_beretta" ); + UTIL_PrecacheOther( "ammo_beretta" ); - // egon - UTIL_PrecacheOtherWeapon( "weapon_egon" ); -#endif - // tripmine - UTIL_PrecacheOtherWeapon( "weapon_tripmine" ); -#if !defined( OEM_BUILD ) && !defined( HLDEMO_BUILD ) - // satchel charge - UTIL_PrecacheOtherWeapon( "weapon_satchel" ); -#endif - // hand grenade - UTIL_PrecacheOtherWeapon("weapon_handgrenade"); -#if !defined( OEM_BUILD ) && !defined( HLDEMO_BUILD ) - // squeak grenade - UTIL_PrecacheOtherWeapon( "weapon_snark" ); + // desert eagle + UTIL_PrecacheOtherWeapon( "weapon_deagle" ); + UTIL_PrecacheOther( "ammo_deagle" ); - // hornetgun - UTIL_PrecacheOtherWeapon( "weapon_hornetgun" ); + // gmgeneral + UTIL_PrecacheOtherWeapon( "weapon_gmgeneral" ); + UTIL_PrecacheOther( "ammo_gmgeneral" ); - if( g_pGameRules->IsDeathmatch() ) - { - UTIL_PrecacheOther( "weaponbox" );// container for dropped deathmatch weapons - } -#endif + UTIL_PrecacheOther( "weaponbox" );// container for dropped deathmatch weapons + + g_sModelIndexLightning = PRECACHE_MODEL( "sprites/lgtning.spr" );// lightning g_sModelIndexFireball = PRECACHE_MODEL( "sprites/zerogxplode.spr" );// fireball g_sModelIndexWExplosion = PRECACHE_MODEL( "sprites/WXplo1.spr" );// underwater fireball g_sModelIndexSmoke = PRECACHE_MODEL( "sprites/steam1.spr" );// smoke @@ -563,6 +559,24 @@ void CBasePlayerItem::DefaultTouch( CBaseEntity *pOther ) CBasePlayer *pPlayer = (CBasePlayer *)pOther; + if( !( pPlayer->m_afButtonPressed & IN_USE )) + return; + + for( int i = 0; i < MAX_ITEM_TYPES; i++ ) + { + if( !pPlayer->m_rgpPlayerItems[i] ) + continue; + + if( FStrEq( STRING( pPlayer->m_rgpPlayerItems[i]->pev->classname ), STRING( pev->classname ) ) ) + break; + + if( pPlayer->m_rgpPlayerItems[i]->iItemSlot() == iItemSlot() ) + { + pPlayer->DropPlayerItem( STRING( pPlayer->m_rgpPlayerItems[i]->pev->classname ) ); + break; + } + } + // can I have this? if( !g_pGameRules->CanHavePlayerItem( pPlayer, this ) ) { @@ -919,31 +933,6 @@ BOOL CBasePlayerWeapon::IsUseable( void ) BOOL CBasePlayerWeapon::CanDeploy( void ) { - BOOL bHasAmmo = 0; - - if( !pszAmmo1() ) - { - // this weapon doesn't use ammo, can always deploy. - return TRUE; - } - - if( pszAmmo1() ) - { - bHasAmmo |= ( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] != 0 ); - } - if( pszAmmo2() ) - { - bHasAmmo |= ( m_pPlayer->m_rgAmmo[m_iSecondaryAmmoType] != 0 ); - } - if( m_iClip > 0 ) - { - bHasAmmo |= 1; - } - if( !bHasAmmo ) - { - return FALSE; - } - return TRUE; } @@ -1067,6 +1056,11 @@ void CBasePlayerAmmo::DefaultTouch( CBaseEntity *pOther ) return; } + CBasePlayer *pPlayer = (CBasePlayer *)pOther; + + if( !( pPlayer->m_afButtonPressed & IN_USE ) ) + return; + if( AddAmmo( pOther ) ) { if( g_pGameRules->AmmoShouldRespawn( this ) == GR_AMMO_RESPAWN_YES ) @@ -1347,6 +1341,24 @@ void CWeaponBox::Touch( CBaseEntity *pOther ) CBasePlayer *pPlayer = (CBasePlayer *)pOther; int i; + if( !( pPlayer->m_afButtonPressed & IN_USE ) ) + return; + + for( i = 0; i < MAX_ITEM_TYPES; i++ ) + { + if( !pPlayer->m_rgpPlayerItems[i] ) + continue; + + if( m_rgpPlayerItems[pPlayer->m_rgpPlayerItems[i]->iItemSlot()] ) + { + if( FStrEq( STRING( pPlayer->m_rgpPlayerItems[i]->pev->classname ), STRING( m_rgpPlayerItems[pPlayer->m_rgpPlayerItems[i]->iItemSlot()]->pev->classname ) ) ) + break; + + pPlayer->DropPlayerItem( STRING( pPlayer->m_rgpPlayerItems[i]->pev->classname ) ); + break; + } + } + // dole out ammo for( i = 0; i < MAX_AMMO_SLOTS; i++ ) { @@ -1607,22 +1619,6 @@ void CBasePlayerWeapon::PrintState( void ) ALERT( at_console, "m_iclip: %i\n", m_iClip ); } -TYPEDESCRIPTION CRpg::m_SaveData[] = -{ - DEFINE_FIELD( CRpg, m_fSpotActive, FIELD_INTEGER ), - DEFINE_FIELD( CRpg, m_cActiveRockets, FIELD_INTEGER ), -}; - -IMPLEMENT_SAVERESTORE( CRpg, CBasePlayerWeapon ) - -TYPEDESCRIPTION CRpgRocket::m_SaveData[] = -{ - DEFINE_FIELD( CRpgRocket, m_flIgniteTime, FIELD_TIME ), - DEFINE_FIELD( CRpgRocket, m_hLauncher, FIELD_EHANDLE ), -}; - -IMPLEMENT_SAVERESTORE( CRpgRocket, CGrenade ) - TYPEDESCRIPTION CShotgun::m_SaveData[] = { DEFINE_FIELD( CShotgun, m_flNextReload, FIELD_TIME ), @@ -1633,42 +1629,3 @@ TYPEDESCRIPTION CShotgun::m_SaveData[] = }; IMPLEMENT_SAVERESTORE( CShotgun, CBasePlayerWeapon ) - -TYPEDESCRIPTION CGauss::m_SaveData[] = -{ - DEFINE_FIELD( CGauss, m_fInAttack, FIELD_INTEGER ), - //DEFINE_FIELD( CGauss, m_flStartCharge, FIELD_TIME ), - //DEFINE_FIELD( CGauss, m_flPlayAftershock, FIELD_TIME ), - //DEFINE_FIELD( CGauss, m_flNextAmmoBurn, FIELD_TIME ), - DEFINE_FIELD( CGauss, m_fPrimaryFire, FIELD_BOOLEAN ), -}; - -IMPLEMENT_SAVERESTORE( CGauss, CBasePlayerWeapon ) - -TYPEDESCRIPTION CEgon::m_SaveData[] = -{ - //DEFINE_FIELD( CEgon, m_pBeam, FIELD_CLASSPTR ), - //DEFINE_FIELD( CEgon, m_pNoise, FIELD_CLASSPTR ), - //DEFINE_FIELD( CEgon, m_pSprite, FIELD_CLASSPTR ), - DEFINE_FIELD( CEgon, m_shootTime, FIELD_TIME ), - DEFINE_FIELD( CEgon, m_fireState, FIELD_INTEGER ), - DEFINE_FIELD( CEgon, m_fireMode, FIELD_INTEGER ), - DEFINE_FIELD( CEgon, m_shakeTime, FIELD_TIME ), - DEFINE_FIELD( CEgon, m_flAmmoUseTime, FIELD_TIME ), -}; - -IMPLEMENT_SAVERESTORE( CEgon, CBasePlayerWeapon ) - -TYPEDESCRIPTION CHgun::m_SaveData[] = -{ - DEFINE_FIELD( CHgun, m_flRechargeTime, FIELD_FLOAT ), -}; - -IMPLEMENT_SAVERESTORE( CHgun, CBasePlayerWeapon ) - -TYPEDESCRIPTION CSatchel::m_SaveData[] = -{ - DEFINE_FIELD( CSatchel, m_chargeReady, FIELD_INTEGER ), -}; - -IMPLEMENT_SAVERESTORE( CSatchel, CBasePlayerWeapon ) diff --git a/dlls/weapons.h b/dlls/weapons.h index 2c96551f..69c4b87d 100644 --- a/dlls/weapons.h +++ b/dlls/weapons.h @@ -63,108 +63,93 @@ public: #define ITEM_BATTERY 4 #define WEAPON_NONE 0 -#define WEAPON_CROWBAR 1 -#define WEAPON_GLOCK 2 -#define WEAPON_PYTHON 3 -#define WEAPON_MP5 4 -#define WEAPON_CHAINGUN 5 -#define WEAPON_CROSSBOW 6 -#define WEAPON_SHOTGUN 7 -#define WEAPON_RPG 8 -#define WEAPON_GAUSS 9 -#define WEAPON_EGON 10 -#define WEAPON_HORNETGUN 11 -#define WEAPON_HANDGRENADE 12 -#define WEAPON_TRIPMINE 13 -#define WEAPON_SATCHEL 14 -#define WEAPON_SNARK 15 +#define WEAPON_SHOTGUN 7 +#define WEAPON_BERETTA 16 +#define WEAPON_GLOCK 17 +#define WEAPON_P228 18 +#define WEAPON_DEAGLE 19 +#define WEAPON_REVOLVER 20 +#define WEAPON_MP5K 21 +#define WEAPON_UZI 22 +#define WEAPON_KNIFE 23 +#define WEAPON_AXE 24 +#define WEAPON_HAMMER 25 +#define WEAPON_SPEAR 26 +#define WEAPON_GMGENERAL 27 #define WEAPON_ALLWEAPONS (~(1<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 Reload( void ); void WeaponIdle( void ); + float m_flNextAnimTime; + int m_iShell; virtual BOOL UseDecrement( void ) { @@ -979,26 +850,31 @@ public: } private: - unsigned short m_usTripFire; + unsigned short m_usUzi; }; -class CSqueak : public CBasePlayerWeapon +class CGMGeneral : public CBasePlayerWeapon { public: void Spawn( void ); void Precache( void ); - int iItemSlot( void ) { return 5; } + int iItemSlot( void ) { return 3; } int GetItemInfo(ItemInfo *p); + int AddToPlayer( CBasePlayer *pPlayer ); + void Holster( int skiplocal = 0 ); void PrimaryAttack( void ); void SecondaryAttack( void ); BOOL Deploy( void ); - void Holster( int skiplocal = 0 ); + void Reload( void ); void WeaponIdle( void ); - int m_fJustThrown; + float m_flNextAnimTime; + int m_iShell; + + BOOL m_fInZoom; virtual BOOL UseDecrement( void ) - { + { #if defined( CLIENT_WEAPONS ) return TRUE; #else @@ -1007,6 +883,6 @@ public: } private: - unsigned short m_usSnarkFire; + unsigned short m_usGMGeneral; }; #endif // WEAPONS_H diff --git a/dlls/zombie.cpp b/dlls/zombie.cpp index 3dd90e5e..3faf7d63 100644 --- a/dlls/zombie.cpp +++ b/dlls/zombie.cpp @@ -16,52 +16,7 @@ // Zombie //========================================================= -// UNDONE: Don't flinch every time you get hit - -#include "extdll.h" -#include "util.h" -#include "cbase.h" -#include "monsters.h" -#include "schedule.h" - -//========================================================= -// Monster's Anim Events Go Here -//========================================================= -#define ZOMBIE_AE_ATTACK_RIGHT 0x01 -#define ZOMBIE_AE_ATTACK_LEFT 0x02 -#define ZOMBIE_AE_ATTACK_BOTH 0x03 - -#define ZOMBIE_FLINCH_DELAY 2 // at most one flinch every n secs - -class CZombie : public CBaseMonster -{ -public: - void Spawn( void ); - void Precache( void ); - void SetYawSpeed( void ); - int Classify( void ); - void HandleAnimEvent( MonsterEvent_t *pEvent ); - int IgnoreConditions( void ); - - float m_flNextFlinch; - - void PainSound( void ); - void AlertSound( void ); - void IdleSound( void ); - void AttackSound( void ); - - static const char *pAttackSounds[]; - static const char *pIdleSounds[]; - static const char *pAlertSounds[]; - static const char *pPainSounds[]; - static const char *pAttackHitSounds[]; - static const char *pAttackMissSounds[]; - - // No range attacks - BOOL CheckRangeAttack1( float flDot, float flDist ) { return FALSE; } - BOOL CheckRangeAttack2( float flDot, float flDist ) { return FALSE; } - int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType ); -}; +#include "zombie.h" LINK_ENTITY_TO_CLASS( monster_zombie, CZombie ) @@ -274,7 +229,7 @@ void CZombie::Spawn() pev->solid = SOLID_SLIDEBOX; pev->movetype = MOVETYPE_STEP; - m_bloodColor = BLOOD_COLOR_GREEN; + m_bloodColor = BLOOD_COLOR_RED; if (pev->health == 0) pev->health = gSkillData.zombieHealth; pev->view_ofs = VEC_VIEW;// position of the eyes relative to monster's origin.