Merge recreated "Afraid of Monsters: Director's Cut" source code.

This commit is contained in:
Night Owl 2018-02-27 16:46:58 +05:00
parent 7979101020
commit a000cbf8ad
80 changed files with 6891 additions and 3566 deletions

41
Readme.txt Normal file
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 )
{

72
cl_dll/aomdc/blackbar.cpp Normal file
View File

@ -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 <string.h>
#include <time.h>
#include <stdio.h>
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;
}

86
cl_dll/aomdc/neffect.cpp Normal file
View File

@ -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 <string.h>
#include <time.h>
#include <stdio.h>
#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;
}

View File

@ -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 )

View File

@ -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;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -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 );

View File

@ -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;

View File

@ -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 );

View File

@ -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; }

View File

@ -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 );
}

View File

@ -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();
}

View File

@ -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 );
}

View File

@ -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
}

View File

@ -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 );

View File

@ -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

View File

@ -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 );

View File

@ -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;
}
/*

View File

@ -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

View File

@ -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

View File

@ -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 );
}

282
dlls/aomdc/axe.cpp Normal file
View File

@ -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;
}

446
dlls/aomdc/baddavid.cpp Normal file
View File

@ -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));
}

211
dlls/aomdc/beretta.cpp Normal file
View File

@ -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 );

206
dlls/aomdc/deagle.cpp Normal file
View File

@ -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 );

171
dlls/aomdc/ghost.cpp Normal file
View File

@ -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
//=========================================================

224
dlls/aomdc/glock.cpp Normal file
View File

@ -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 );

212
dlls/aomdc/gmgeneral.cpp Normal file
View File

@ -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 );

239
dlls/aomdc/hammer.cpp Normal file
View File

@ -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 );
}
}

315
dlls/aomdc/knife.cpp Normal file
View File

@ -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;
}

213
dlls/aomdc/mp5k.cpp Normal file
View File

@ -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 );

207
dlls/aomdc/p228.cpp Normal file
View File

@ -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 );

208
dlls/aomdc/revolver.cpp Normal file
View File

@ -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

268
dlls/aomdc/spear.cpp Normal file
View File

@ -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 );
}
}

209
dlls/aomdc/uzi.cpp Normal file
View File

@ -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 );

237
dlls/aomdc/wheelchair.cpp Normal file
View File

@ -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;
}

51
dlls/aomdc/zombie.h Normal file
View File

@ -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 );
};

256
dlls/aomdc/zombie2.cpp Normal file
View File

@ -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
//=========================================================

256
dlls/aomdc/zombie3.cpp Normal file
View File

@ -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
//=========================================================

256
dlls/aomdc/zombie4.cpp Normal file
View File

@ -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
//=========================================================

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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 )

View File

@ -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

View File

@ -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;
}
}
}
}

View File

@ -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 );

View File

@ -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 );

View File

@ -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 )

View File

@ -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 );
}
}

View File

@ -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 )

View File

@ -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"};

View File

@ -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;

View File

@ -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" );

View File

@ -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;

View File

@ -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;
}

View File

@ -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;

View File

@ -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 );

View File

@ -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();

View File

@ -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 );

View File

@ -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 )

View File

@ -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;

View File

@ -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
}
}*/
}
//=========================================================

View File

@ -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<<WEAPON_HORNETGUN;
RemoveAmmo("9mm", i9mm);
@ -920,7 +894,7 @@ void CBasePlayer::RemoveItems( int iWeaponMask, int i9mm, int i357, int iBuck, i
RemoveAmmo("Snarks", iSnark);
RemoveAmmo("Trip Mine", iTrip);
RemoveAmmo("Hand Grenade", iGren);
RemoveAmmo("Hornets", iHornet);
RemoveAmmo("Hornets", iHornet);*/
for (i = 0; i < MAX_ITEM_TYPES; i++)
{
@ -1080,6 +1054,8 @@ void CBasePlayer::Killed( entvars_t *pevAttacker, int iGib )
return;
}
EnableControl( TRUE );
DeathSound();
pev->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.
}

View File

@ -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?

View File

@ -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

View File

@ -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" );

View File

@ -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 );

View File

@ -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;

View File

@ -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

View File

@ -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;
}

View File

@ -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;

View File

@ -32,6 +32,32 @@
#include "gamerules.h"
#include "movewith.h"
#include "locus.h"
#include <sys/stat.h>
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 )
{

View File

@ -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.

View File

@ -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 )

View File

@ -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<<WEAPON_SUIT))
#define WEAPON_FLASHLIGHT 30
#define WEAPON_SUIT 31 // ?????
#define MAX_WEAPONS 32
#define MAX_NORMAL_BATTERY 100
// weapon weight factors (for auto-switching) (-1 = noswitch)
#define CROWBAR_WEIGHT 0
#define GLOCK_WEIGHT 10
#define PYTHON_WEIGHT 15
#define MP5_WEIGHT 15
#define KNIFE_WEIGHT 4
#define AXE_WEIGHT 4
#define HAMMER_WEIGHT 4
#define P228_WEIGHT 14
#define BERETTA_WEIGHT 12
#define GLOCK_WEIGHT 13
#define REVOLVER_WEIGHT 12
#define MP5K_WEIGHT 11
#define SHOTGUN_WEIGHT 15
#define CROSSBOW_WEIGHT 10
#define RPG_WEIGHT 20
#define GAUSS_WEIGHT 20
#define EGON_WEIGHT 20
#define HORNETGUN_WEIGHT 10
#define HANDGRENADE_WEIGHT 5
#define SNARK_WEIGHT 5
#define SATCHEL_WEIGHT -10
#define TRIPMINE_WEIGHT -10
#define DEAGLE_WEIGHT 12
#define UZI_WEIGHT 11
#define GMGENERAL_WEIGHT 11
#define SPEAR_WEIGHT 4
// weapon clip/carry ammo capacities
#define URANIUM_MAX_CARRY 100
#define _9MM_MAX_CARRY 250
#define _357_MAX_CARRY 36
#define BUCKSHOT_MAX_CARRY 125
#define BOLT_MAX_CARRY 50
#define ROCKET_MAX_CARRY 5
#define HANDGRENADE_MAX_CARRY 10
#define SATCHEL_MAX_CARRY 5
#define TRIPMINE_MAX_CARRY 5
#define SNARK_MAX_CARRY 15
#define HORNET_MAX_CARRY 8
#define M203_GRENADE_MAX_CARRY 10
#define P228_MAX_CARRY 250
#define GLOCK_MAX_CARRY 250
#define BERETTA_MAX_CARRY 250
#define REVOLVER_MAX_CARRY 150
#define BUCKSHOT_MAX_CARRY 125
#define UZI_MAX_CARRY 200
#define DEAGLE_MAX_CARRY 170
#define MP5K_MAX_CARRY 200
#define GMGENERAL_MAX_CARRY 210
// the maximum amount of ammo each weapon's clip can hold
#define WEAPON_NOCLIP -1
//#define CROWBAR_MAX_CLIP WEAPON_NOCLIP
#define GLOCK_MAX_CLIP 17
#define PYTHON_MAX_CLIP 6
#define MP5_MAX_CLIP 50
#define MP5_DEFAULT_AMMO 25
//#define KNIFE_MAX_CLIP WEAPON_NOCLIP
#define P228_MAX_CLIP 13
#define GLOCK_MAX_CLIP 20
#define BERETTA_MAX_CLIP 15
#define REVOLVER_MAX_CLIP 6
#define MP5K_MAX_CLIP 30
#define MP5K_DEFAULT_AMMO 30
#define SHOTGUN_MAX_CLIP 8
#define CROSSBOW_MAX_CLIP 5
#define RPG_MAX_CLIP 1
#define GAUSS_MAX_CLIP WEAPON_NOCLIP
#define EGON_MAX_CLIP WEAPON_NOCLIP
#define HORNETGUN_MAX_CLIP WEAPON_NOCLIP
#define HANDGRENADE_MAX_CLIP WEAPON_NOCLIP
#define SATCHEL_MAX_CLIP WEAPON_NOCLIP
#define TRIPMINE_MAX_CLIP WEAPON_NOCLIP
#define SNARK_MAX_CLIP WEAPON_NOCLIP
#define UZI_MAX_CLIP 25
#define DEAGLE_MAX_CLIP 7
#define GMGENERAL_MAX_CLIP 30
// the default amount of ammo that comes with each gun when it spawns
#define GLOCK_DEFAULT_GIVE 17
#define PYTHON_DEFAULT_GIVE 6
#define MP5_DEFAULT_GIVE 25
#define MP5_DEFAULT_AMMO 25
#define MP5_M203_DEFAULT_GIVE 0
#define P228_DEFAULT_GIVE 13
#define GLOCK_DEFAULT_GIVE 20
#define BERETTA_DEFAULT_GIVE 15
#define REVOLVER_DEFAULT_GIVE 6
#define MP5K_DEFAULT_GIVE 30
#define SHOTGUN_DEFAULT_GIVE 12
#define CROSSBOW_DEFAULT_GIVE 5
#define RPG_DEFAULT_GIVE 1
#define GAUSS_DEFAULT_GIVE 20
#define EGON_DEFAULT_GIVE 20
#define HANDGRENADE_DEFAULT_GIVE 5
#define SATCHEL_DEFAULT_GIVE 1
#define TRIPMINE_DEFAULT_GIVE 1
#define SNARK_DEFAULT_GIVE 5
#define HIVEHAND_DEFAULT_GIVE 8
#define UZI_DEFAULT_GIVE 25
#define DEAGLE_DEFAULT_GIVE 7
#define GMGENERAL_DEFAULT_GIVE 30
// The amount of ammo given to a player by an ammo item.
#define AMMO_URANIUMBOX_GIVE 20
#define AMMO_P228CLIP_GIVE P228_MAX_CLIP
#define AMMO_GLOCKCLIP_GIVE GLOCK_MAX_CLIP
#define AMMO_357BOX_GIVE PYTHON_MAX_CLIP
#define AMMO_MP5CLIP_GIVE MP5_MAX_CLIP
#define AMMO_CHAINBOX_GIVE 200
#define AMMO_M203BOX_GIVE 2
#define AMMO_BUCKSHOTBOX_GIVE 12
#define AMMO_CROSSBOWCLIP_GIVE CROSSBOW_MAX_CLIP
#define AMMO_RPGCLIP_GIVE RPG_MAX_CLIP
#define AMMO_URANIUMBOX_GIVE 20
#define AMMO_SNARKBOX_GIVE 5
#define AMMO_BERETTACLIP_GIVE BERETTA_MAX_CLIP
#define AMMO_REVOLVERBOX_GIVE REVOLVER_MAX_CLIP
#define AMMO_MP5KCLIP_GIVE MP5K_MAX_CLIP
#define AMMO_BUCKSHOTBOX_GIVE SHOTGUN_DEFAULT_GIVE
#define AMMO_UZICLIP_GIVE UZI_MAX_CLIP
#define AMMO_DEAGLECLIP_GIVE DEAGLE_MAX_CLIP
#define AMMO_GMGENERALCLIP_GIVE GMGENERAL_DEFAULT_GIVE
// bullet types
typedef enum
@ -210,6 +195,38 @@ typedef struct
int iId;
} AmmoInfo;
static const char *WorldWeaponModels[] =
{
NULL, // WEAPON_NONE
NULL, // WEAPON_CROWBAR
NULL, // WEAPON_GLOCK1
NULL, // WEAPON_PYTHON
NULL, // WEAPON_MP5
NULL, // WEAPON_CHAINGUN
NULL, // WEAPON_CROSSBOW
"models/w_shotgun.mdl", // WEAPON_SHOTGUN
NULL, // WEAPON_RPG
NULL, // WEAPON_GAUSS
NULL, // WEAPON_EGON
NULL, // WEAPON_HORNETGUN
NULL, // WEAPON_HANDGRENADE
NULL, // WEAPON_TRIPMINE
NULL, // WEAPON_SATCHEL
NULL, // WEAPON_SNARK
"models/w_beretta.mdl", // WEAPON_BERETTA
"models/w_glock.mdl", // WEAPON_GLOCK2
"models/w_p228.mdl", // WEAPON_P228
"models/w_deagle.mdl", // WEAPON_DEAGLE
"models/w_revolver.mdl", // WEAPON_REVOLVER
"models/w_mp5k.mdl", // WEAPON_MP5K
"models/w_uzi.mdl", // WEAPON_UZI
"models/w_kitchenknife.mdl", // WEAPON_KNIFE
"models/w_axe.mdl", // WEAPON_AXE
"models/w_hammer.mdl", // WEAPON_HAMMER
"models/w_spear.mdl", // WEAPON_SPEAR
"models/gmgeneral_around.aomdc" // WEAPON_GMGENERAL
};
// Items that the player has in their inventory that they can use
class CBasePlayerItem : public CBaseAnimating
{
@ -373,6 +390,7 @@ public:
extern DLL_GLOBAL short g_sModelIndexLaser;// holds the index for the laser beam
extern DLL_GLOBAL const char *g_pModelNameLaser;
extern DLL_GLOBAL short g_sModelIndexLightning;
extern DLL_GLOBAL short g_sModelIndexLaserDot;// holds the index for the laser beam dot
extern DLL_GLOBAL short g_sModelIndexFireball;// holds the index for the fireball
extern DLL_GLOBAL short g_sModelIndexSmoke;// holds the index for the smoke cloud
@ -463,207 +481,6 @@ bool bIsMultiplayer ( void );
void LoadVModel ( const char *szViewModel, CBasePlayer *m_pPlayer );
#endif
class CGlock : public CBasePlayerWeapon
{
public:
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 2; }
int GetItemInfo( ItemInfo *p );
int AddToPlayer( CBasePlayer *pPlayer );
void PrimaryAttack( void );
void SecondaryAttack( void );
void GlockFire( float flSpread, float flCycleTime, BOOL fUseAutoAim );
BOOL Deploy( void );
void Reload( void );
void WeaponIdle( void );
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
return FALSE;
#endif
}
private:
int m_iShell;
unsigned short m_usFireGlock1;
unsigned short m_usFireGlock2;
};
class CCrowbar : public CBasePlayerWeapon
{
public:
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 1; }
void EXPORT SwingAgain( void );
void EXPORT Smack( void );
int GetItemInfo( ItemInfo *p );
int AddToPlayer( CBasePlayer *pPlayer );
void PrimaryAttack( void );
int Swing( int fFirst );
BOOL Deploy( void );
void Holster( int skiplocal = 0 );
#ifdef CROWBAR_IDLE_ANIM
void WeaponIdle();
#endif
int m_iSwing;
TraceResult m_trHit;
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
return FALSE;
#endif
}
private:
unsigned short m_usCrowbar;
};
class CPython : public CBasePlayerWeapon
{
public:
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 2; }
int GetItemInfo(ItemInfo *p);
int AddToPlayer( CBasePlayer *pPlayer );
void PrimaryAttack( void );
void SecondaryAttack( void );
BOOL Deploy( void );
void Holster( int skiplocal = 0 );
void Reload( void );
void WeaponIdle( void );
float m_flSoundDelay;
BOOL m_fInZoom;// don't save this.
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
return FALSE;
#endif
}
private:
unsigned short m_usFirePython;
};
class CMP5 : public CBasePlayerWeapon
{
public:
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 3; }
int GetItemInfo(ItemInfo *p);
int AddToPlayer( CBasePlayer *pPlayer );
void PrimaryAttack( void );
void SecondaryAttack( void );
int SecondaryAmmoIndex( void );
BOOL Deploy( void );
void Reload( void );
void WeaponIdle( void );
BOOL IsUseable();
float m_flNextAnimTime;
int m_iShell;
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
return FALSE;
#endif
}
private:
unsigned short m_usMP5;
unsigned short m_usMP52;
};
class CCrossbow : public CBasePlayerWeapon
{
public:
void Spawn( void );
void Precache( void );
int iItemSlot( ) { return 3; }
int GetItemInfo(ItemInfo *p);
void FireBolt( void );
void FireSniperBolt( void );
void PrimaryAttack( void );
void SecondaryAttack( void );
int AddToPlayer( CBasePlayer *pPlayer );
BOOL Deploy( );
void Holster( int skiplocal = 0 );
void Reload( void );
void WeaponIdle( void );
int m_fInZoom; // don't save this
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
return FALSE;
#endif
}
private:
unsigned short m_usCrossbow;
unsigned short m_usCrossbow2;
};
class CShotgun : public CBasePlayerWeapon
{
public:
#ifndef CLIENT_DLL
int Save( CSave &save );
int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
#endif
void Spawn( void );
void Precache( void );
int iItemSlot( ) { return 3; }
int GetItemInfo(ItemInfo *p);
int AddToPlayer( CBasePlayer *pPlayer );
void PrimaryAttack( void );
void SecondaryAttack( void );
BOOL Deploy( );
void Reload( void );
void WeaponTick();
void WeaponIdle( void );
int m_fInReload;
float m_flNextReload;
int m_iShell;
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
return FALSE;
#endif
}
private:
unsigned short m_usDoubleFire;
unsigned short m_usSingleFire;
};
class CLaserSpot : public CBaseEntity
{
void Spawn( void );
@ -679,36 +496,136 @@ public:
static CLaserSpot *CreateSpot( const char* spritename );
};
class CRpg : public CBasePlayerWeapon
class CKnife : public CBasePlayerWeapon
{
public:
#ifndef CLIENT_DLL
int Save( CSave &save );
int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 1; }
void EXPORT SwingAgain( void );
void EXPORT Smack( void );
int GetItemInfo(ItemInfo *p);
int AddToPlayer( CBasePlayer *pPlayer );
void PrimaryAttack( void );
int Swing( int fFirst );
BOOL Deploy( void );
void Holster( int skiplocal = 0 );
int m_iSwing;
TraceResult m_trHit;
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
return FALSE;
#endif
}
private:
unsigned short m_usKnife;
};
class CHammer : public CBasePlayerWeapon
{
public:
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 1; }
void EXPORT BigWhackThink( void );
int GetItemInfo(ItemInfo *p);
int AddToPlayer( CBasePlayer *pPlayer );
void PrimaryAttack( void );
BOOL Deploy( void );
int m_iSwing;
TraceResult m_trHit;
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
return FALSE;
#endif
}
private:
unsigned short m_usHammer;
};
class CAxe : public CBasePlayerWeapon
{
public:
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 1; }
void EXPORT SwingAgain( void );
void EXPORT Smack( void );
int GetItemInfo(ItemInfo *p);
int AddToPlayer( CBasePlayer *pPlayer );
void PrimaryAttack( void );
int Swing( int fFirst );
BOOL Deploy( void );
int m_iSwing;
TraceResult m_trHit;
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
return FALSE;
#endif
}
private:
unsigned short m_usAxe;
};
class CSpear : public CBasePlayerWeapon
{
public:
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 1; }
void EXPORT UnStab( void );
void EXPORT BigSpearStab( void );
int GetItemInfo(ItemInfo *p);
int AddToPlayer( CBasePlayer *pPlayer );
void PrimaryAttack( void );
BOOL Deploy( void );
int m_iSwing;
TraceResult m_trHit;
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
return FALSE;
#endif
}
private:
unsigned short m_usSpear;
};
class CGlock : public CBasePlayerWeapon
{
public:
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 2; }
int GetItemInfo(ItemInfo *p);
int AddToPlayer( CBasePlayer *pPlayer );
void PrimaryAttack( void );
void SecondaryAttack( void );
void GlockFire( float flSpread, float flCycleTime, BOOL fUseBurst );
BOOL Deploy( void );
void Reload( void );
int iItemSlot( void ) { return 4; }
int GetItemInfo(ItemInfo *p);
int AddToPlayer( CBasePlayer *pPlayer );
BOOL Deploy( void );
BOOL CanHolster( void );
void Holster( int skiplocal = 0 );
void PrimaryAttack( void );
void SecondaryAttack( void );
void WeaponIdle( void );
void UpdateSpot( void );
BOOL ShouldWeaponIdle( void ) { return TRUE; };
CLaserSpot *m_pSpot;
int m_fSpotActive;
int m_cActiveRockets;// how many missiles in flight from this launcher right now?
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
@ -719,60 +636,27 @@ public:
}
private:
unsigned short m_usRpg;
int m_iShell;
unsigned short m_usFireGlock1;
unsigned short m_usFireGlock2;
};
class CRpgRocket : public CGrenade
class CBeretta : public CBasePlayerWeapon
{
public:
int Save( CSave &save );
int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
void Spawn( void );
void Precache( void );
void EXPORT FollowThink( void );
void EXPORT IgniteThink( void );
void EXPORT RocketTouch( CBaseEntity *pOther );
static CRpgRocket *CreateRpgRocket( Vector vecOrigin, Vector vecAngles, CBaseEntity *pOwner, CRpg *pLauncher );
int m_iTrail;
float m_flIgniteTime;
EHANDLE m_hLauncher; // handle back to the launcher that fired me.
};
class CGauss : public CBasePlayerWeapon
{
public:
#ifndef CLIENT_DLL
int Save( CSave &save );
int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
#endif
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 4; }
int iItemSlot( void ) { return 2; }
int GetItemInfo(ItemInfo *p);
int AddToPlayer( CBasePlayer *pPlayer );
BOOL IsUseable();
BOOL Deploy( void );
void Holster( int skiplocal = 0 );
void PrimaryAttack( void );
void SecondaryAttack( void );
BOOL Deploy( void );
void Reload( void );
void WeaponIdle( void );
void StartFire( void );
void Fire( Vector vecOrigSrc, Vector vecDirShooting, float flDamage );
float GetFullChargeTime( void );
int m_iBalls;
int m_iGlow;
int m_iBeam;
int m_iSoundState; // don't save this
// was this weapon just fired primary or secondary?
// we need to know so we can pick the right set of effects.
BOOL m_fPrimaryFire;
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
@ -783,56 +667,27 @@ public:
}
private:
unsigned short m_usGaussFire;
unsigned short m_usGaussSpin;
int m_iShell;
unsigned short m_usFireBeretta;
};
class CEgon : public CBasePlayerWeapon
class CP228 : public CBasePlayerWeapon
{
public:
#ifndef CLIENT_DLL
int Save( CSave &save );
int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
#endif
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 4; }
int iItemSlot( void ) { return 2; }
int GetItemInfo(ItemInfo *p);
int AddToPlayer( CBasePlayer *pPlayer );
BOOL Deploy( void );
void Holster( int skiplocal = 0 );
void UpdateEffect( const Vector &startPoint, const Vector &endPoint, float timeBlend );
void CreateEffect ( void );
void DestroyEffect ( void );
void EndAttack( void );
void Attack( void );
void PrimaryAttack( void );
BOOL Deploy( void );
void Reload( void );
void WeaponIdle( void );
float m_flAmmoUseTime;// since we use < 1 point of ammo per update, we subtract ammo on a timer.
float GetPulseInterval( void );
float GetDischargeInterval( void );
void Fire( const Vector &vecOrigSrc, const Vector &vecDir );
BOOL HasAmmo( void );
void UseAmmo( int count );
enum EGON_FIREMODE { FIRE_NARROW, FIRE_WIDE};
CBeam *m_pBeam;
CBeam *m_pNoise;
CSprite *m_pSprite;
virtual BOOL UseDecrement( void )
{
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
@ -840,27 +695,15 @@ public:
#endif
}
unsigned short m_usEgonStop;
private:
#ifndef CLIENT_DLL
float m_shootTime;
#endif
EGON_FIREMODE m_fireMode;
float m_shakeTime;
BOOL m_deployed;
int m_iShell;
unsigned short m_usEgonFire;
unsigned short m_usFireP228;
};
class CHgun : public CBasePlayerWeapon
class CDeagle : public CBasePlayerWeapon
{
public:
#ifndef CLIENT_DLL
int Save( CSave &save );
int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
#endif
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 4; }
@ -868,17 +711,105 @@ public:
int AddToPlayer( CBasePlayer *pPlayer );
void PrimaryAttack( void );
void SecondaryAttack( void );
BOOL Deploy( void );
BOOL IsUseable( void );
void Holster( int skiplocal = 0 );
void Reload( void );
void WeaponIdle( void );
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
return FALSE;
#endif
}
private:
int m_iShell;
unsigned short m_usFireDeagle;
};
class CRevolver : public CBasePlayerWeapon
{
public:
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 4; }
int GetItemInfo(ItemInfo *p);
int AddToPlayer( CBasePlayer *pPlayer );
void PrimaryAttack( void );
BOOL Deploy( void );
void Reload( void );
void WeaponIdle( void );
float m_flSoundDelay;
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
return FALSE;
#endif
}
private:
unsigned short m_usFireRevolver;
};
class CShotgun : public CBasePlayerWeapon
{
public:
#ifndef CLIENT_DLL
int Save( CSave &save );
int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
#endif
void Spawn( void );
void Precache( void );
int iItemSlot( ) { return 3; }
int GetItemInfo(ItemInfo *p);
int AddToPlayer( CBasePlayer *pPlayer );
void PrimaryAttack( void );
void EXPORT LolShell();
BOOL Deploy( );
void Reload( void );
void WeaponIdle( void );
int m_fInReload;
float m_flNextReload;
int m_iShell;
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
return FALSE;
#endif
}
private:
unsigned short m_usSingleFire;
};
class CMP5K : public CBasePlayerWeapon
{
public:
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 3; }
int GetItemInfo(ItemInfo *p);
int AddToPlayer( CBasePlayer *pPlayer );
void PrimaryAttack( void );
BOOL Deploy( void );
void Reload( void );
void WeaponIdle( void );
float m_flNextAnimTime;
float m_flRechargeTime;
int m_iFirePhase;// don't save me.
int m_iShell;
virtual BOOL UseDecrement( void )
{
@ -888,86 +819,26 @@ public:
return FALSE;
#endif
}
private:
unsigned short m_usHornetFire;
unsigned short m_usMP5k;
};
class CHandGrenade : public CBasePlayerWeapon
class CUzi : public CBasePlayerWeapon
{
public:
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 5; }
int GetItemInfo(ItemInfo *p);
void PrimaryAttack( void );
BOOL Deploy( void );
BOOL CanHolster( void );
void Holster( int skiplocal = 0 );
void WeaponIdle( void );
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
return FALSE;
#endif
}
};
class CSatchel : public CBasePlayerWeapon
{
public:
#ifndef CLIENT_DLL
int Save( CSave &save );
int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
#endif
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 PrimaryAttack( void );
void SecondaryAttack( void );
int AddDuplicate( CBasePlayerItem *pOriginal );
BOOL CanDeploy( void );
BOOL Deploy( void );
BOOL IsUseable( void );
void Holster( int skiplocal = 0 );
void WeaponIdle( void );
void Throw( void );
virtual BOOL UseDecrement( void )
{
#if defined( CLIENT_WEAPONS )
return TRUE;
#else
return FALSE;
#endif
}
};
class CTripmine : public CBasePlayerWeapon
{
public:
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 5; }
int GetItemInfo(ItemInfo *p);
void SetObjectCollisionBox( void )
{
//!!!BUGBUG - fix the model!
pev->absmin = pev->origin + Vector(-16, -16, -5);
pev->absmax = pev->origin + Vector(16, 16, 28);
}
void PrimaryAttack( void );
BOOL Deploy( void );
void Holster( int skiplocal = 0 );
void 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

View File

@ -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.