mirror of https://github.com/FWGS/hlsdk-xash3d
Merge recreated "Afraid of Monsters: Director's Cut" source code.
This commit is contained in:
parent
7979101020
commit
a000cbf8ad
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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 )
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
1982
cl_dll/ev_hldm.cpp
1982
cl_dll/ev_hldm.cpp
File diff suppressed because it is too large
Load Diff
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
39
cl_dll/hud.h
39
cl_dll/hud.h
|
@ -134,6 +134,10 @@ private:
|
|||
WEAPON *m_pWeapon;
|
||||
int m_HUD_bucket0;
|
||||
int m_HUD_selection;
|
||||
|
||||
int m_HUD_infinite_ammo;
|
||||
HSPRITE ghsprGMinf;
|
||||
wrect_t *gGMinfrc;
|
||||
};
|
||||
|
||||
//
|
||||
|
@ -167,6 +171,39 @@ private:
|
|||
#define FADE_TIME 100
|
||||
|
||||
|
||||
//
|
||||
//-----------------------------------------------------
|
||||
//
|
||||
class CHudBlackBar: public CHudBase
|
||||
{
|
||||
public:
|
||||
int Init( void );
|
||||
int VidInit( void );
|
||||
int Draw( float flTime );
|
||||
|
||||
private:
|
||||
HSPRITE m_hSprite;
|
||||
wrect_t *m_prc;
|
||||
int m_iHeight;
|
||||
int m_iWidth;
|
||||
};
|
||||
|
||||
//
|
||||
//-----------------------------------------------------
|
||||
//
|
||||
class CHudNoiseEffect: public CHudBase
|
||||
{
|
||||
public:
|
||||
int Init( void );
|
||||
int VidInit( void );
|
||||
int Draw(float flTime);
|
||||
|
||||
private:
|
||||
HSPRITE m_hSprite;
|
||||
wrect_t *m_prc;
|
||||
int m_iWidth;
|
||||
};
|
||||
|
||||
//
|
||||
//-----------------------------------------------------
|
||||
//
|
||||
|
@ -692,6 +729,8 @@ public:
|
|||
CHudStatusIcons m_StatusIcons;
|
||||
CHudScoreboard m_Scoreboard;
|
||||
CHudMOTD m_MOTD;
|
||||
CHudBlackBar m_BlackBar;
|
||||
CHudNoiseEffect m_NoiseEffect;
|
||||
CHudParticle m_Particle; // (LRC) -- 30/08/02 November235: Particles to Order
|
||||
|
||||
void Init( void );
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -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));
|
||||
}
|
|
@ -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 );
|
||||
|
|
@ -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 );
|
|
@ -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
|
||||
//=========================================================
|
|
@ -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 );
|
|
@ -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 );
|
|
@ -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 );
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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 );
|
||||
|
|
@ -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 );
|
||||
|
|
@ -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
|
|
@ -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 );
|
||||
}
|
||||
}
|
|
@ -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 );
|
||||
|
|
@ -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;
|
||||
}
|
|
@ -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 );
|
||||
};
|
|
@ -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
|
||||
//=========================================================
|
||||
|
|
@ -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
|
||||
//=========================================================
|
||||
|
|
@ -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
|
||||
//=========================================================
|
||||
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
11
dlls/cbase.h
11
dlls/cbase.h
|
@ -450,13 +450,11 @@ public:
|
|||
//We use this variables to store each ammo count.
|
||||
int ammo_9mm;
|
||||
int ammo_357;
|
||||
int ammo_bolts;
|
||||
int ammo_50ae;
|
||||
int ammo_buckshot;
|
||||
int ammo_rockets;
|
||||
int ammo_uranium;
|
||||
int ammo_hornets;
|
||||
int ammo_argrens;
|
||||
//Special stuff for grenades and satchels.
|
||||
int ammo_9mmar;
|
||||
|
||||
// Special stuff for grenades and satchels.
|
||||
float m_flStartThrow;
|
||||
float m_flReleaseThrow;
|
||||
int m_chargeReady;
|
||||
|
@ -737,6 +735,7 @@ public:
|
|||
#define DMG_SLOWBURN (1 << 21) // in an oven
|
||||
#define DMG_SLOWFREEZE (1 << 22) // in a subzero freezer
|
||||
#define DMG_MORTAR (1 << 23) // Hit by air raid (done to distinguish grenade from mortar)
|
||||
#define DMG_SPEAR (1 << 24)
|
||||
|
||||
// these are the damage types that are allowed to gib corpses
|
||||
#define DMG_GIB_CORPSE ( DMG_CRUSH | DMG_FALL | DMG_BLAST | DMG_SONIC | DMG_CLUB )
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 )
|
||||
|
|
124
dlls/effects.cpp
124
dlls/effects.cpp
|
@ -1647,6 +1647,7 @@ void CSprite::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useTy
|
|||
#define SF_ENVMODEL_OFF 1
|
||||
#define SF_ENVMODEL_DROPTOFLOOR 2
|
||||
#define SF_ENVMODEL_SOLID 4
|
||||
#define SF_ENVMODEL_REPEATABLE 16
|
||||
|
||||
class CEnvModel : public CBaseAnimating
|
||||
{
|
||||
|
@ -1668,6 +1669,7 @@ class CEnvModel : public CBaseAnimating
|
|||
string_t m_iszSequence_Off;
|
||||
int m_iAction_On;
|
||||
int m_iAction_Off;
|
||||
int m_iAnim_Speed;
|
||||
};
|
||||
|
||||
TYPEDESCRIPTION CEnvModel::m_SaveData[] =
|
||||
|
@ -1703,6 +1705,11 @@ void CEnvModel::KeyValue( KeyValueData *pkvd )
|
|||
m_iAction_Off = atoi(pkvd->szValue);
|
||||
pkvd->fHandled = TRUE;
|
||||
}
|
||||
else if (FStrEq(pkvd->szKeyName, "m_iAnim_Speed"))
|
||||
{
|
||||
m_iAnim_Speed = atoi(pkvd->szValue);
|
||||
pkvd->fHandled = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
CBaseAnimating::KeyValue( pkvd );
|
||||
|
@ -1727,6 +1734,16 @@ void CEnvModel :: Spawn( void )
|
|||
DROP_TO_FLOOR ( ENT(pev) );
|
||||
}
|
||||
|
||||
if( pev->spawnflags & SF_ENVMODEL_REPEATABLE )
|
||||
{
|
||||
pev->sequence = 1;
|
||||
pev->animtime = gpGlobals->time;
|
||||
if( m_iAnim_Speed > 0 )
|
||||
pev->framerate = m_iAnim_Speed;
|
||||
else
|
||||
pev->framerate = 1.0;
|
||||
}
|
||||
|
||||
SetBoneController( 0, 0 );
|
||||
SetBoneController( 1, 0 );
|
||||
|
||||
|
@ -1737,7 +1754,7 @@ void CEnvModel :: Spawn( void )
|
|||
|
||||
void CEnvModel::Precache( void )
|
||||
{
|
||||
PRECACHE_MODEL( (char *)STRING(pev->model) );
|
||||
PRECACHE_MODEL( STRING(pev->model) );
|
||||
}
|
||||
|
||||
STATE CEnvModel::GetState( void )
|
||||
|
@ -1768,6 +1785,9 @@ void CEnvModel::Think( void )
|
|||
|
||||
// ALERT(at_console, "env_model Think fr=%f\n", pev->framerate);
|
||||
|
||||
if( pev->spawnflags & SF_ENVMODEL_REPEATABLE )
|
||||
return;
|
||||
|
||||
StudioFrameAdvance ( ); // set m_fSequenceFinished if necessary
|
||||
|
||||
// if (m_fSequenceLoops)
|
||||
|
@ -4573,3 +4593,105 @@ void CParticle::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use
|
|||
//ALERT(at_console, "Setting body %d\n", pev->body);
|
||||
}
|
||||
}
|
||||
|
||||
//=========================================================
|
||||
// env_hidehud, Hide/Unhide the HUD
|
||||
//=========================================================
|
||||
class CEnvHideHUD : public CPointEntity
|
||||
{
|
||||
public:
|
||||
void Spawn( void );
|
||||
void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
|
||||
};
|
||||
|
||||
LINK_ENTITY_TO_CLASS( env_drawbars, CEnvHideHUD )
|
||||
LINK_ENTITY_TO_CLASS( env_hidehud, CEnvHideHUD )
|
||||
LINK_ENTITY_TO_CLASS( env_drawstatic, CEnvHideHUD )
|
||||
|
||||
void CEnvHideHUD::Spawn( void )
|
||||
{
|
||||
pev->effects = EF_NODRAW;
|
||||
pev->solid = SOLID_NOT;
|
||||
pev->movetype = MOVETYPE_NONE;
|
||||
}
|
||||
|
||||
void CEnvHideHUD::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
|
||||
{
|
||||
CBasePlayer *pPlayer = NULL;
|
||||
|
||||
if( pActivator && pActivator->IsPlayer() )
|
||||
pPlayer = (CBasePlayer *)pActivator;
|
||||
else
|
||||
pPlayer = (CBasePlayer *)CBaseEntity::Instance( g_engfuncs.pfnPEntityOfEntIndex( 1 ) );
|
||||
|
||||
if( pPlayer )
|
||||
{
|
||||
if( FClassnameIs( pev, "env_drawbars" ) )
|
||||
{
|
||||
if( pPlayer->m_iHideHUD == HIDEHUD_BLACKBARS )
|
||||
ClearBits( pPlayer->m_iHideHUD, HIDEHUD_BLACKBARS );
|
||||
else
|
||||
SetBits( pPlayer->m_iHideHUD, HIDEHUD_BLACKBARS );
|
||||
}
|
||||
else if( FClassnameIs( pev, "env_hidehud" ) )
|
||||
{
|
||||
if( pPlayer->m_iHideHUD == HIDEHUD_ALL_EXCLUDEMESSAGE )
|
||||
ClearBits( pPlayer->m_iHideHUD, HIDEHUD_ALL_EXCLUDEMESSAGE );
|
||||
else
|
||||
SetBits( pPlayer->m_iHideHUD, HIDEHUD_ALL_EXCLUDEMESSAGE );
|
||||
}
|
||||
else if( FClassnameIs( pev, "env_drawstatic" ) )
|
||||
{
|
||||
if( pPlayer->m_iHideHUD == HIDEHUD_NOISEEFFECT )
|
||||
ClearBits( pPlayer->m_iHideHUD, HIDEHUD_NOISEEFFECT );
|
||||
else
|
||||
SetBits( pPlayer->m_iHideHUD, HIDEHUD_NOISEEFFECT );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class CEnvGameBeaten : public CPointEntity
|
||||
{
|
||||
public:
|
||||
void Spawn( void );
|
||||
void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
|
||||
};
|
||||
|
||||
LINK_ENTITY_TO_CLASS( env_gamebeaten1, CEnvGameBeaten );
|
||||
LINK_ENTITY_TO_CLASS( env_gamebeaten2, CEnvGameBeaten );
|
||||
LINK_ENTITY_TO_CLASS( env_gamebeaten3, CEnvGameBeaten );
|
||||
LINK_ENTITY_TO_CLASS( env_gamebeaten4, CEnvGameBeaten );
|
||||
|
||||
void CEnvGameBeaten::Spawn( void )
|
||||
{
|
||||
pev->effects = EF_NODRAW;
|
||||
pev->solid = SOLID_NOT;
|
||||
pev->movetype = MOVETYPE_NONE;
|
||||
}
|
||||
|
||||
void CEnvGameBeaten::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
|
||||
{
|
||||
CBaseEntity *pPlayer = NULL;
|
||||
|
||||
if( pActivator && pActivator->IsPlayer() )
|
||||
pPlayer = pActivator;
|
||||
else
|
||||
pPlayer = CBaseEntity::Instance( g_engfuncs.pfnPEntityOfEntIndex( 1 ) );
|
||||
|
||||
if( pPlayer )
|
||||
{
|
||||
FILE *fp;
|
||||
char filename[32];
|
||||
const char *pGameBeatenNum = STRING( pev->classname );
|
||||
|
||||
pGameBeatenNum += ( strlen( pGameBeatenNum ) - 1 );
|
||||
sprintf( filename, "gmgeneral%c.aomdc", *pGameBeatenNum );
|
||||
|
||||
fp = fopen( filename, "wt" );
|
||||
|
||||
if( !fp ) return;
|
||||
|
||||
fprintf( fp, "Beaten Ending%c = 1", *pGameBeatenNum );
|
||||
fclose( fp );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 )
|
||||
|
|
288
dlls/game.cpp
288
dlls/game.cpp
|
@ -31,7 +31,6 @@ cvar_t friendlyfire = { "mp_friendlyfire","0", FCVAR_SERVER };
|
|||
cvar_t falldamage = { "mp_falldamage","0", FCVAR_SERVER };
|
||||
cvar_t weaponstay = { "mp_weaponstay","0", FCVAR_SERVER };
|
||||
cvar_t selfgauss = { "mp_selfgauss", "1", FCVAR_SERVER };
|
||||
cvar_t satchelfix = { "mp_satchelfix", "0", FCVAR_SERVER };
|
||||
cvar_t forcerespawn = { "mp_forcerespawn","1", FCVAR_SERVER };
|
||||
cvar_t flashlight = { "mp_flashlight","0", FCVAR_SERVER };
|
||||
cvar_t aimcrosshair = { "mp_autocrosshair","1", FCVAR_SERVER };
|
||||
|
@ -40,6 +39,7 @@ cvar_t teamlist = { "mp_teamlist","hgrunt;scientist", FCVAR_SERVER };
|
|||
cvar_t teamoverride = { "mp_teamoverride","1" };
|
||||
cvar_t defaultteam = { "mp_defaultteam","0" };
|
||||
cvar_t allowmonsters = { "mp_allowmonsters","0", FCVAR_SERVER };
|
||||
cvar_t infiniteflashlight = { "sv_infiniteflashlight", "0", FCVAR_SERVER };
|
||||
cvar_t bhopcap = { "mp_bhopcap", "1", FCVAR_SERVER };
|
||||
|
||||
cvar_t impulsetarget={"sohl_impulsetarget","0", FCVAR_SERVER }; //LRC - trigger ents manually
|
||||
|
@ -250,6 +250,15 @@ cvar_t sk_snark_dmg_pop1 = {"sk_snark_dmg_pop1","0"};
|
|||
cvar_t sk_snark_dmg_pop2 = {"sk_snark_dmg_pop2","0"};
|
||||
cvar_t sk_snark_dmg_pop3 = {"sk_snark_dmg_pop3","0"};
|
||||
|
||||
// Wheelchair Monster
|
||||
cvar_t sk_wheelchair_health1 = {"sk_wheelchair_health1","0"};
|
||||
cvar_t sk_wheelchair_health2 = {"sk_wheelchair_health2","0"};
|
||||
cvar_t sk_wheelchair_health3 = {"sk_wheelchair_health3","0"};
|
||||
|
||||
cvar_t sk_wheelchair_dmg_attack1 = {"sk_wheelchair_dmg_attack1","0"};
|
||||
cvar_t sk_wheelchair_dmg_attack2 = {"sk_wheelchair_dmg_attack2","0"};
|
||||
cvar_t sk_wheelchair_dmg_attack3 = {"sk_wheelchair_dmg_attack3","0"};
|
||||
|
||||
// Zombie
|
||||
cvar_t sk_zombie_health1 = {"sk_zombie_health1","0"};
|
||||
cvar_t sk_zombie_health2 = {"sk_zombie_health2","0"};
|
||||
|
@ -263,6 +272,32 @@ cvar_t sk_zombie_dmg_both_slash1 = {"sk_zombie_dmg_both_slash1","0"};
|
|||
cvar_t sk_zombie_dmg_both_slash2 = {"sk_zombie_dmg_both_slash2","0"};
|
||||
cvar_t sk_zombie_dmg_both_slash3 = {"sk_zombie_dmg_both_slash3","0"};
|
||||
|
||||
// Zombie2
|
||||
cvar_t sk_zombie2_health1 = {"sk_zombie2_health1","0"};
|
||||
cvar_t sk_zombie2_health2 = {"sk_zombie2_health2","0"};
|
||||
cvar_t sk_zombie2_health3 = {"sk_zombie2_health3","0"};
|
||||
|
||||
cvar_t sk_zombie2_dmg_one_slash1 = {"sk_zombie2_dmg_one_slash1","0"};
|
||||
cvar_t sk_zombie2_dmg_one_slash2 = {"sk_zombie2_dmg_one_slash2","0"};
|
||||
cvar_t sk_zombie2_dmg_one_slash3 = {"sk_zombie2_dmg_one_slash3","0"};
|
||||
|
||||
cvar_t sk_zombie2_dmg_both_slash1 = {"sk_zombie2_dmg_both_slash1","0"};
|
||||
cvar_t sk_zombie2_dmg_both_slash2 = {"sk_zombie2_dmg_both_slash2","0"};
|
||||
cvar_t sk_zombie2_dmg_both_slash3 = {"sk_zombie2_dmg_both_slash3","0"};
|
||||
|
||||
// Zombie3
|
||||
cvar_t sk_zombie3_health1 = {"sk_zombie3_health1","0"};
|
||||
cvar_t sk_zombie3_health2 = {"sk_zombie3_health2","0"};
|
||||
cvar_t sk_zombie3_health3 = {"sk_zombie3_health3","0"};
|
||||
|
||||
cvar_t sk_zombie3_dmg_one_slash1 = {"sk_zombie3_dmg_one_slash1","0"};
|
||||
cvar_t sk_zombie3_dmg_one_slash2 = {"sk_zombie3_dmg_one_slash2","0"};
|
||||
cvar_t sk_zombie3_dmg_one_slash3 = {"sk_zombie3_dmg_one_slash3","0"};
|
||||
|
||||
cvar_t sk_zombie3_dmg_both_slash1 = {"sk_zombie3_dmg_both_slash1","0"};
|
||||
cvar_t sk_zombie3_dmg_both_slash2 = {"sk_zombie3_dmg_both_slash2","0"};
|
||||
cvar_t sk_zombie3_dmg_both_slash3 = {"sk_zombie3_dmg_both_slash3","0"};
|
||||
|
||||
//Turret
|
||||
cvar_t sk_turret_health1 = {"sk_turret_health1","0"};
|
||||
cvar_t sk_turret_health2 = {"sk_turret_health2","0"};
|
||||
|
@ -280,89 +315,61 @@ cvar_t sk_sentry_health3 = {"sk_sentry_health3","0"};
|
|||
|
||||
// PLAYER WEAPONS
|
||||
|
||||
// Crowbar whack
|
||||
cvar_t sk_plr_crowbar1 = {"sk_plr_crowbar1","0"};
|
||||
cvar_t sk_plr_crowbar2 = {"sk_plr_crowbar2","0"};
|
||||
cvar_t sk_plr_crowbar3 = {"sk_plr_crowbar3","0"};
|
||||
// Knife slash
|
||||
cvar_t sk_plr_knife1 = {"sk_plr_knife1","0"};
|
||||
cvar_t sk_plr_knife2 = {"sk_plr_knife2","0"};
|
||||
cvar_t sk_plr_knife3 = {"sk_plr_knife3","0"};
|
||||
|
||||
// Hammer whack
|
||||
cvar_t sk_plr_hammer1 = {"sk_plr_hammer1","0"};
|
||||
cvar_t sk_plr_hammer2 = {"sk_plr_hammer2","0"};
|
||||
cvar_t sk_plr_hammer3 = {"sk_plr_hammer3","0"};
|
||||
|
||||
// Axe slash
|
||||
cvar_t sk_plr_axe1 = {"sk_plr_axe1","0"};
|
||||
cvar_t sk_plr_axe2 = {"sk_plr_axe2","0"};
|
||||
cvar_t sk_plr_axe3 = {"sk_plr_axe3","0"};
|
||||
|
||||
// Glock Round
|
||||
cvar_t sk_plr_9mm_bullet1 = {"sk_plr_9mm_bullet1","0"};
|
||||
cvar_t sk_plr_9mm_bullet2 = {"sk_plr_9mm_bullet2","0"};
|
||||
cvar_t sk_plr_9mm_bullet3 = {"sk_plr_9mm_bullet3","0"};
|
||||
cvar_t sk_plr_glock1 = {"sk_plr_glock1","0"};
|
||||
cvar_t sk_plr_glock2 = {"sk_plr_glock2","0"};
|
||||
cvar_t sk_plr_glock3 = {"sk_plr_glock3","0"};
|
||||
|
||||
// 357 Round
|
||||
cvar_t sk_plr_357_bullet1 = {"sk_plr_357_bullet1","0"};
|
||||
cvar_t sk_plr_357_bullet2 = {"sk_plr_357_bullet2","0"};
|
||||
cvar_t sk_plr_357_bullet3 = {"sk_plr_357_bullet3","0"};
|
||||
// Beretta round
|
||||
cvar_t sk_plr_beretta1 = {"sk_plr_beretta1","0"};
|
||||
cvar_t sk_plr_beretta2 = {"sk_plr_beretta2","0"};
|
||||
cvar_t sk_plr_beretta3 = {"sk_plr_beretta3","0"};
|
||||
|
||||
// MP5 Round
|
||||
// P228 round
|
||||
cvar_t sk_plr_p2281 = {"sk_plr_p2281","0"};
|
||||
cvar_t sk_plr_p2282 = {"sk_plr_p2282","0"};
|
||||
cvar_t sk_plr_p2283 = {"sk_plr_p2283","0"};
|
||||
|
||||
// Revolver round
|
||||
cvar_t sk_plr_revolver1 = {"sk_plr_revolver1","0"};
|
||||
cvar_t sk_plr_revolver2 = {"sk_plr_revolver2","0"};
|
||||
cvar_t sk_plr_revolver3 = {"sk_plr_revolver3","0"};
|
||||
|
||||
// Uzi round
|
||||
cvar_t sk_plr_uzi1 = {"sk_plr_uzi1","0"};
|
||||
cvar_t sk_plr_uzi2 = {"sk_plr_uzi2","0"};
|
||||
cvar_t sk_plr_uzi3 = {"sk_plr_uzi3","0"};
|
||||
|
||||
// MP5K Round
|
||||
cvar_t sk_plr_9mmAR_bullet1 = {"sk_plr_9mmAR_bullet1","0"};
|
||||
cvar_t sk_plr_9mmAR_bullet2 = {"sk_plr_9mmAR_bullet2","0"};
|
||||
cvar_t sk_plr_9mmAR_bullet3 = {"sk_plr_9mmAR_bullet3","0"};
|
||||
|
||||
|
||||
// M203 grenade
|
||||
cvar_t sk_plr_9mmAR_grenade1 = {"sk_plr_9mmAR_grenade1","0"};
|
||||
cvar_t sk_plr_9mmAR_grenade2 = {"sk_plr_9mmAR_grenade2","0"};
|
||||
cvar_t sk_plr_9mmAR_grenade3 = {"sk_plr_9mmAR_grenade3","0"};
|
||||
|
||||
// Deagle round
|
||||
cvar_t sk_plr_deagle1 = {"sk_plr_deagle1","0"};
|
||||
cvar_t sk_plr_deagle2 = {"sk_plr_deagle2","0"};
|
||||
cvar_t sk_plr_deagle3 = {"sk_plr_deagle3","0"};
|
||||
|
||||
// Shotgun buckshot
|
||||
cvar_t sk_plr_buckshot1 = {"sk_plr_buckshot1","0"};
|
||||
cvar_t sk_plr_buckshot2 = {"sk_plr_buckshot2","0"};
|
||||
cvar_t sk_plr_buckshot3 = {"sk_plr_buckshot3","0"};
|
||||
|
||||
|
||||
// Crossbow
|
||||
cvar_t sk_plr_xbow_bolt_client1 = {"sk_plr_xbow_bolt_client1","0"};
|
||||
cvar_t sk_plr_xbow_bolt_client2 = {"sk_plr_xbow_bolt_client2","0"};
|
||||
cvar_t sk_plr_xbow_bolt_client3 = {"sk_plr_xbow_bolt_client3","0"};
|
||||
|
||||
cvar_t sk_plr_xbow_bolt_monster1 = {"sk_plr_xbow_bolt_monster1","0"};
|
||||
cvar_t sk_plr_xbow_bolt_monster2 = {"sk_plr_xbow_bolt_monster2","0"};
|
||||
cvar_t sk_plr_xbow_bolt_monster3 = {"sk_plr_xbow_bolt_monster3","0"};
|
||||
|
||||
|
||||
// RPG
|
||||
cvar_t sk_plr_rpg1 = {"sk_plr_rpg1","0"};
|
||||
cvar_t sk_plr_rpg2 = {"sk_plr_rpg2","0"};
|
||||
cvar_t sk_plr_rpg3 = {"sk_plr_rpg3","0"};
|
||||
|
||||
|
||||
// Zero Point Generator
|
||||
cvar_t sk_plr_gauss1 = {"sk_plr_gauss1","0"};
|
||||
cvar_t sk_plr_gauss2 = {"sk_plr_gauss2","0"};
|
||||
cvar_t sk_plr_gauss3 = {"sk_plr_gauss3","0"};
|
||||
|
||||
|
||||
// Tau Cannon
|
||||
cvar_t sk_plr_egon_narrow1 = {"sk_plr_egon_narrow1","0"};
|
||||
cvar_t sk_plr_egon_narrow2 = {"sk_plr_egon_narrow2","0"};
|
||||
cvar_t sk_plr_egon_narrow3 = {"sk_plr_egon_narrow3","0"};
|
||||
|
||||
cvar_t sk_plr_egon_wide1 = {"sk_plr_egon_wide1","0"};
|
||||
cvar_t sk_plr_egon_wide2 = {"sk_plr_egon_wide2","0"};
|
||||
cvar_t sk_plr_egon_wide3 = {"sk_plr_egon_wide3","0"};
|
||||
|
||||
|
||||
// Hand Grendade
|
||||
cvar_t sk_plr_hand_grenade1 = {"sk_plr_hand_grenade1","0"};
|
||||
cvar_t sk_plr_hand_grenade2 = {"sk_plr_hand_grenade2","0"};
|
||||
cvar_t sk_plr_hand_grenade3 = {"sk_plr_hand_grenade3","0"};
|
||||
|
||||
|
||||
// Satchel Charge
|
||||
cvar_t sk_plr_satchel1 = {"sk_plr_satchel1","0"};
|
||||
cvar_t sk_plr_satchel2 = {"sk_plr_satchel2","0"};
|
||||
cvar_t sk_plr_satchel3 = {"sk_plr_satchel3","0"};
|
||||
|
||||
|
||||
// Tripmine
|
||||
cvar_t sk_plr_tripmine1 = {"sk_plr_tripmine1","0"};
|
||||
cvar_t sk_plr_tripmine2 = {"sk_plr_tripmine2","0"};
|
||||
cvar_t sk_plr_tripmine3 = {"sk_plr_tripmine3","0"};
|
||||
|
||||
|
||||
// WORLD WEAPONS
|
||||
cvar_t sk_12mm_bullet1 = {"sk_12mm_bullet1","0"};
|
||||
cvar_t sk_12mm_bullet2 = {"sk_12mm_bullet2","0"};
|
||||
|
@ -472,7 +479,6 @@ void GameDLLInit( void )
|
|||
CVAR_REGISTER( &falldamage );
|
||||
CVAR_REGISTER( &weaponstay );
|
||||
CVAR_REGISTER( &selfgauss );
|
||||
CVAR_REGISTER( &satchelfix );
|
||||
CVAR_REGISTER( &forcerespawn );
|
||||
CVAR_REGISTER( &flashlight );
|
||||
CVAR_REGISTER( &aimcrosshair );
|
||||
|
@ -481,8 +487,9 @@ void GameDLLInit( void )
|
|||
CVAR_REGISTER( &teamoverride );
|
||||
CVAR_REGISTER( &defaultteam );
|
||||
CVAR_REGISTER( &allowmonsters );
|
||||
CVAR_REGISTER (&impulsetarget); //LRC
|
||||
CVAR_REGISTER (&mw_debug); //LRC
|
||||
CVAR_REGISTER( &infiniteflashlight );
|
||||
CVAR_REGISTER( &impulsetarget ); //LRC
|
||||
CVAR_REGISTER( &mw_debug ); //LRC
|
||||
CVAR_REGISTER( &bhopcap );
|
||||
|
||||
CVAR_REGISTER( &mp_chattime );
|
||||
|
@ -676,6 +683,15 @@ void GameDLLInit( void )
|
|||
CVAR_REGISTER( &sk_snark_dmg_pop2 );// {"sk_snark_dmg_pop2","0"};
|
||||
CVAR_REGISTER( &sk_snark_dmg_pop3 );// {"sk_snark_dmg_pop3","0"};
|
||||
|
||||
// Wheelchair Monster
|
||||
CVAR_REGISTER( &sk_wheelchair_health1 );// {"sk_wheelchair_health1","0"};
|
||||
CVAR_REGISTER( &sk_wheelchair_health2 );// {"sk_wheelchair_health2","0"};
|
||||
CVAR_REGISTER( &sk_wheelchair_health3 );// {"sk_wheelchair_health3","0"};
|
||||
|
||||
CVAR_REGISTER( &sk_wheelchair_dmg_attack1 );// {"sk_wheelchair_dmg_attack1","0"};
|
||||
CVAR_REGISTER( &sk_wheelchair_dmg_attack2 );// {"sk_wheelchair_dmg_attack2","0"};
|
||||
CVAR_REGISTER( &sk_wheelchair_dmg_attack3 );// {"sk_wheelchair_dmg_attack3","0"};
|
||||
|
||||
// Zombie
|
||||
CVAR_REGISTER( &sk_zombie_health1 );// {"sk_zombie_health1","0"};
|
||||
CVAR_REGISTER( &sk_zombie_health2 );// {"sk_zombie_health3","0"};
|
||||
|
@ -689,6 +705,32 @@ void GameDLLInit( void )
|
|||
CVAR_REGISTER( &sk_zombie_dmg_both_slash2 );// {"sk_zombie_dmg_both_slash2","0"};
|
||||
CVAR_REGISTER( &sk_zombie_dmg_both_slash3 );// {"sk_zombie_dmg_both_slash3","0"};
|
||||
|
||||
// Zombie2
|
||||
CVAR_REGISTER( &sk_zombie2_health1 );// {"sk_zombie2_health1","0"};
|
||||
CVAR_REGISTER( &sk_zombie2_health2 );// {"sk_zombie2_health2","0"};
|
||||
CVAR_REGISTER( &sk_zombie2_health3 );// {"sk_zombie2_health3","0"};
|
||||
|
||||
CVAR_REGISTER( &sk_zombie2_dmg_one_slash1 );// {"sk_zombie2_dmg_one_slash1","0"};
|
||||
CVAR_REGISTER( &sk_zombie2_dmg_one_slash2 );// {"sk_zombie2_dmg_one_slash2","0"};
|
||||
CVAR_REGISTER( &sk_zombie2_dmg_one_slash3 );// {"sk_zombie2_dmg_one_slash3","0"};
|
||||
|
||||
CVAR_REGISTER( &sk_zombie2_dmg_both_slash1 );// {"sk_zombie2_dmg_both_slash1","0"};
|
||||
CVAR_REGISTER( &sk_zombie2_dmg_both_slash2 );// {"sk_zombie2_dmg_both_slash2","0"};
|
||||
CVAR_REGISTER( &sk_zombie2_dmg_both_slash3 );// {"sk_zombie2_dmg_both_slash3","0"};
|
||||
|
||||
// Zombie3
|
||||
CVAR_REGISTER( &sk_zombie3_health1 );// {"sk_zombie3_health1","0"};
|
||||
CVAR_REGISTER( &sk_zombie3_health2 );// {"sk_zombie3_health2","0"};
|
||||
CVAR_REGISTER( &sk_zombie3_health3 );// {"sk_zombie3_health3","0"};
|
||||
|
||||
CVAR_REGISTER( &sk_zombie3_dmg_one_slash1 );// {"sk_zombie3_dmg_one_slash1","0"};
|
||||
CVAR_REGISTER( &sk_zombie3_dmg_one_slash2 );// {"sk_zombie3_dmg_one_slash2","0"};
|
||||
CVAR_REGISTER( &sk_zombie3_dmg_one_slash3 );// {"sk_zombie3_dmg_one_slash3","0"};
|
||||
|
||||
CVAR_REGISTER( &sk_zombie3_dmg_both_slash1 );// {"sk_zombie3_dmg_both_slash1","0"};
|
||||
CVAR_REGISTER( &sk_zombie3_dmg_both_slash2 );// {"sk_zombie3_dmg_both_slash2","0"};
|
||||
CVAR_REGISTER( &sk_zombie3_dmg_both_slash3 );// {"sk_zombie3_dmg_both_slash3","0"};
|
||||
|
||||
//Turret
|
||||
CVAR_REGISTER( &sk_turret_health1 );// {"sk_turret_health1","0"};
|
||||
CVAR_REGISTER( &sk_turret_health2 );// {"sk_turret_health2","0"};
|
||||
|
@ -707,79 +749,61 @@ void GameDLLInit( void )
|
|||
|
||||
// PLAYER WEAPONS
|
||||
|
||||
// Crowbar whack
|
||||
CVAR_REGISTER( &sk_plr_crowbar1 );// {"sk_plr_crowbar1","0"};
|
||||
CVAR_REGISTER( &sk_plr_crowbar2 );// {"sk_plr_crowbar2","0"};
|
||||
CVAR_REGISTER( &sk_plr_crowbar3 );// {"sk_plr_crowbar3","0"};
|
||||
// Knife slash
|
||||
CVAR_REGISTER( &sk_plr_knife1 );// {"sk_plr_knife1","0"};
|
||||
CVAR_REGISTER( &sk_plr_knife2 );// {"sk_plr_knife2","0"};
|
||||
CVAR_REGISTER( &sk_plr_knife3 );// {"sk_plr_knife3","0"};
|
||||
|
||||
// Hammer whack
|
||||
CVAR_REGISTER( &sk_plr_hammer1 );// {"sk_plr_hammer1","0"};
|
||||
CVAR_REGISTER( &sk_plr_hammer2 );// {"sk_plr_hammer2","0"};
|
||||
CVAR_REGISTER( &sk_plr_hammer3 );// {"sk_plr_hammer3","0"};
|
||||
|
||||
// Axe slash
|
||||
CVAR_REGISTER( &sk_plr_axe1 );// {"sk_plr_axe1","0"};
|
||||
CVAR_REGISTER( &sk_plr_axe2 );// {"sk_plr_axe2","0"};
|
||||
CVAR_REGISTER( &sk_plr_axe3 );// {"sk_plr_axe3","0"};
|
||||
|
||||
// Glock Round
|
||||
CVAR_REGISTER( &sk_plr_9mm_bullet1 );// {"sk_plr_9mm_bullet1","0"};
|
||||
CVAR_REGISTER( &sk_plr_9mm_bullet2 );// {"sk_plr_9mm_bullet2","0"};
|
||||
CVAR_REGISTER( &sk_plr_9mm_bullet3 );// {"sk_plr_9mm_bullet3","0"};
|
||||
CVAR_REGISTER( &sk_plr_glock1 );// {"sk_plr_glock1","0"};
|
||||
CVAR_REGISTER( &sk_plr_glock2 );// {"sk_plr_glock2","0"};
|
||||
CVAR_REGISTER( &sk_plr_glock3 );// {"sk_plr_glock3","0"};
|
||||
|
||||
// 357 Round
|
||||
CVAR_REGISTER( &sk_plr_357_bullet1 );// {"sk_plr_357_bullet1","0"};
|
||||
CVAR_REGISTER( &sk_plr_357_bullet2 );// {"sk_plr_357_bullet2","0"};
|
||||
CVAR_REGISTER( &sk_plr_357_bullet3 );// {"sk_plr_357_bullet3","0"};
|
||||
// Beretta round
|
||||
CVAR_REGISTER( &sk_plr_beretta1 );// {"sk_plr_beretta1","0"};
|
||||
CVAR_REGISTER( &sk_plr_beretta2 );// {"sk_plr_beretta2","0"};
|
||||
CVAR_REGISTER( &sk_plr_beretta3 );// {"sk_plr_beretta3","0"};
|
||||
|
||||
// MP5 Round
|
||||
// P228 round
|
||||
CVAR_REGISTER( &sk_plr_p2281 );// {"sk_plr_p2281","0"};
|
||||
CVAR_REGISTER( &sk_plr_p2282 );// {"sk_plr_p2282","0"};
|
||||
CVAR_REGISTER( &sk_plr_p2283 );// {"sk_plr_p2283","0"};
|
||||
|
||||
// Revolver round
|
||||
CVAR_REGISTER( &sk_plr_revolver1 );// {"sk_plr_revolver1","0"};
|
||||
CVAR_REGISTER( &sk_plr_revolver2 );// {"sk_plr_revolver2","0"};
|
||||
CVAR_REGISTER( &sk_plr_revolver3 );// {"sk_plr_revolver3","0"};
|
||||
|
||||
// Uzi round
|
||||
CVAR_REGISTER( &sk_plr_uzi1 );// {"sk_plr_uzi1","0"};
|
||||
CVAR_REGISTER( &sk_plr_uzi2 );// {"sk_plr_uzi2","0"};
|
||||
CVAR_REGISTER( &sk_plr_uzi3 );// {"sk_plr_uzi3","0"};
|
||||
|
||||
// MP5K Round
|
||||
CVAR_REGISTER( &sk_plr_9mmAR_bullet1 );// {"sk_plr_9mmAR_bullet1","0"};
|
||||
CVAR_REGISTER( &sk_plr_9mmAR_bullet2 );// {"sk_plr_9mmAR_bullet2","0"};
|
||||
CVAR_REGISTER( &sk_plr_9mmAR_bullet3 );// {"sk_plr_9mmAR_bullet3","0"};
|
||||
|
||||
// M203 grenade
|
||||
CVAR_REGISTER( &sk_plr_9mmAR_grenade1 );// {"sk_plr_9mmAR_grenade1","0"};
|
||||
CVAR_REGISTER( &sk_plr_9mmAR_grenade2 );// {"sk_plr_9mmAR_grenade2","0"};
|
||||
CVAR_REGISTER( &sk_plr_9mmAR_grenade3 );// {"sk_plr_9mmAR_grenade3","0"};
|
||||
// Deagle round
|
||||
CVAR_REGISTER( &sk_plr_deagle1 );// {"sk_plr_deagle1","0"};
|
||||
CVAR_REGISTER( &sk_plr_deagle2 );// {"sk_plr_deagle2","0"};
|
||||
CVAR_REGISTER( &sk_plr_deagle3 );// {"sk_plr_deagle3","0"};
|
||||
|
||||
// Shotgun buckshot
|
||||
CVAR_REGISTER( &sk_plr_buckshot1 );// {"sk_plr_buckshot1","0"};
|
||||
CVAR_REGISTER( &sk_plr_buckshot2 );// {"sk_plr_buckshot2","0"};
|
||||
CVAR_REGISTER( &sk_plr_buckshot3 );// {"sk_plr_buckshot3","0"};
|
||||
|
||||
// Crossbow
|
||||
CVAR_REGISTER( &sk_plr_xbow_bolt_monster1 );// {"sk_plr_xbow_bolt1","0"};
|
||||
CVAR_REGISTER( &sk_plr_xbow_bolt_monster2 );// {"sk_plr_xbow_bolt2","0"};
|
||||
CVAR_REGISTER( &sk_plr_xbow_bolt_monster3 );// {"sk_plr_xbow_bolt3","0"};
|
||||
|
||||
CVAR_REGISTER( &sk_plr_xbow_bolt_client1 );// {"sk_plr_xbow_bolt1","0"};
|
||||
CVAR_REGISTER( &sk_plr_xbow_bolt_client2 );// {"sk_plr_xbow_bolt2","0"};
|
||||
CVAR_REGISTER( &sk_plr_xbow_bolt_client3 );// {"sk_plr_xbow_bolt3","0"};
|
||||
|
||||
// RPG
|
||||
CVAR_REGISTER( &sk_plr_rpg1 );// {"sk_plr_rpg1","0"};
|
||||
CVAR_REGISTER( &sk_plr_rpg2 );// {"sk_plr_rpg2","0"};
|
||||
CVAR_REGISTER( &sk_plr_rpg3 );// {"sk_plr_rpg3","0"};
|
||||
|
||||
// Gauss Gun
|
||||
CVAR_REGISTER( &sk_plr_gauss1 );// {"sk_plr_gauss1","0"};
|
||||
CVAR_REGISTER( &sk_plr_gauss2 );// {"sk_plr_gauss2","0"};
|
||||
CVAR_REGISTER( &sk_plr_gauss3 );// {"sk_plr_gauss3","0"};
|
||||
|
||||
// Egon Gun
|
||||
CVAR_REGISTER( &sk_plr_egon_narrow1 );// {"sk_plr_egon_narrow1","0"};
|
||||
CVAR_REGISTER( &sk_plr_egon_narrow2 );// {"sk_plr_egon_narrow2","0"};
|
||||
CVAR_REGISTER( &sk_plr_egon_narrow3 );// {"sk_plr_egon_narrow3","0"};
|
||||
|
||||
CVAR_REGISTER( &sk_plr_egon_wide1 );// {"sk_plr_egon_wide1","0"};
|
||||
CVAR_REGISTER( &sk_plr_egon_wide2 );// {"sk_plr_egon_wide2","0"};
|
||||
CVAR_REGISTER( &sk_plr_egon_wide3 );// {"sk_plr_egon_wide3","0"};
|
||||
|
||||
// Hand Grendade
|
||||
CVAR_REGISTER( &sk_plr_hand_grenade1 );// {"sk_plr_hand_grenade1","0"};
|
||||
CVAR_REGISTER( &sk_plr_hand_grenade2 );// {"sk_plr_hand_grenade2","0"};
|
||||
CVAR_REGISTER( &sk_plr_hand_grenade3 );// {"sk_plr_hand_grenade3","0"};
|
||||
|
||||
// Satchel Charge
|
||||
CVAR_REGISTER( &sk_plr_satchel1 );// {"sk_plr_satchel1","0"};
|
||||
CVAR_REGISTER( &sk_plr_satchel2 );// {"sk_plr_satchel2","0"};
|
||||
CVAR_REGISTER( &sk_plr_satchel3 );// {"sk_plr_satchel3","0"};
|
||||
|
||||
// Tripmine
|
||||
CVAR_REGISTER( &sk_plr_tripmine1 );// {"sk_plr_tripmine1","0"};
|
||||
CVAR_REGISTER( &sk_plr_tripmine2 );// {"sk_plr_tripmine2","0"};
|
||||
CVAR_REGISTER( &sk_plr_tripmine3 );// {"sk_plr_tripmine3","0"};
|
||||
|
||||
// WORLD WEAPONS
|
||||
CVAR_REGISTER( &sk_12mm_bullet1 );// {"sk_12mm_bullet1","0"};
|
||||
CVAR_REGISTER( &sk_12mm_bullet2 );// {"sk_12mm_bullet2","0"};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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" );
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
//=========================================================
|
||||
|
|
218
dlls/player.cpp
218
dlls/player.cpp
|
@ -69,8 +69,8 @@ extern CGraph WorldGraph;
|
|||
#define TRAIN_FAST 0x04
|
||||
#define TRAIN_BACK 0x05
|
||||
|
||||
#define FLASH_DRAIN_TIME 1.2 //100 units/3 minutes
|
||||
#define FLASH_CHARGE_TIME 0.2 // 100 units/20 seconds (seconds per unit)
|
||||
#define FLASH_DRAIN_TIME 0.12 //100 units/12 seconds
|
||||
#define FLASH_CHARGE_TIME 0.3 // 100 units/3 seconds (seconds per unit)
|
||||
|
||||
#ifdef XENWARRIOR
|
||||
float g_fEnvFadeTime = 0; // flashlight can't be used until this time expires.
|
||||
|
@ -496,29 +496,6 @@ int CBasePlayer::TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, fl
|
|||
// keep track of amount of damage last sustained
|
||||
m_lastDamageAmount = (int)flDamage;
|
||||
|
||||
// Armor.
|
||||
if( !( pev->flags & FL_GODMODE ) && pev->armorvalue && !( bitsDamageType & ( DMG_FALL | DMG_DROWN ) ) )// armor doesn't protect against fall or drown damage!
|
||||
{
|
||||
float flNew = flDamage * flRatio;
|
||||
|
||||
float flArmor;
|
||||
|
||||
flArmor = ( flDamage - flNew ) * flBonus;
|
||||
|
||||
// Does this use more armor than we have?
|
||||
if( flArmor > pev->armorvalue )
|
||||
{
|
||||
flArmor = pev->armorvalue;
|
||||
flArmor *= ( 1 / flBonus );
|
||||
flNew = flDamage - flArmor;
|
||||
pev->armorvalue = 0;
|
||||
}
|
||||
else
|
||||
pev->armorvalue -= flArmor;
|
||||
|
||||
flDamage = flNew;
|
||||
}
|
||||
|
||||
// this cast to INT is critical!!! If a player ends up with 0.5 health, the engine will get that
|
||||
// as an int (zero) and think the player is dead! (this will incite a clientside screentilt, etc)
|
||||
fTookDamage = CBaseMonster::TakeDamage( pevInflictor, pevAttacker, (int)flDamage, bitsDamageType );
|
||||
|
@ -857,9 +834,6 @@ void CBasePlayer::RemoveAllItems( BOOL removeSuit )
|
|||
for( i = 0; i < MAX_AMMO_SLOTS; i++ )
|
||||
m_rgAmmo[i] = 0;
|
||||
|
||||
if( satchelfix.value )
|
||||
DeactivateSatchels( this );
|
||||
|
||||
UpdateClientData();
|
||||
// send Selected Weapon Message to our client
|
||||
MESSAGE_BEGIN( MSG_ONE, gmsgCurWeapon, NULL, pev );
|
||||
|
@ -906,7 +880,7 @@ void CBasePlayer::RemoveItems( int iWeaponMask, int i9mm, int i357, int iBuck, i
|
|||
CBasePlayerItem *pCurrentItem;
|
||||
|
||||
// hornetgun is outside the spawnflags Worldcraft can set - handle it seperately.
|
||||
if (iHornet)
|
||||
/*if (iHornet)
|
||||
iWeaponMask |= 1<<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.
|
||||
}
|
||||
|
|
|
@ -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?
|
||||
|
|
511
dlls/rpg.cpp
511
dlls/rpg.cpp
|
@ -23,22 +23,6 @@
|
|||
#include "player.h"
|
||||
#include "gamerules.h"
|
||||
|
||||
enum rpg_e
|
||||
{
|
||||
RPG_IDLE = 0,
|
||||
RPG_FIDGET,
|
||||
RPG_RELOAD, // to reload
|
||||
RPG_FIRE2, // to empty
|
||||
RPG_HOLSTER1, // loaded
|
||||
RPG_DRAW1, // loaded
|
||||
RPG_HOLSTER2, // unloaded
|
||||
RPG_DRAW_UL, // unloaded
|
||||
RPG_IDLE_UL, // unloaded idle
|
||||
RPG_FIDGET_UL // unloaded fidget
|
||||
};
|
||||
|
||||
LINK_ENTITY_TO_CLASS( weapon_rpg, CRpg )
|
||||
|
||||
#ifndef CLIENT_DLL
|
||||
|
||||
LINK_ENTITY_TO_CLASS( laser_spot, CLaserSpot )
|
||||
|
@ -113,500 +97,5 @@ void CLaserSpot::Precache( void )
|
|||
{
|
||||
PRECACHE_MODEL( "sprites/laserdot.spr" );
|
||||
}
|
||||
|
||||
LINK_ENTITY_TO_CLASS( rpg_rocket, CRpgRocket )
|
||||
|
||||
//=========================================================
|
||||
//=========================================================
|
||||
CRpgRocket *CRpgRocket::CreateRpgRocket( Vector vecOrigin, Vector vecAngles, CBaseEntity *pOwner, CRpg *pLauncher )
|
||||
{
|
||||
CRpgRocket *pRocket = GetClassPtr( (CRpgRocket *)NULL );
|
||||
|
||||
UTIL_SetOrigin( pRocket, vecOrigin );
|
||||
pRocket->pev->angles = vecAngles;
|
||||
pRocket->Spawn();
|
||||
pRocket->SetTouch( &CRpgRocket::RocketTouch );
|
||||
pRocket->m_hLauncher = pLauncher;// remember what RPG fired me.
|
||||
pLauncher->m_cActiveRockets++;// register this missile as active for the launcher
|
||||
pRocket->pev->owner = pOwner->edict();
|
||||
|
||||
return pRocket;
|
||||
}
|
||||
|
||||
//=========================================================
|
||||
//=========================================================
|
||||
void CRpgRocket::Spawn( void )
|
||||
{
|
||||
Precache();
|
||||
// motor
|
||||
pev->movetype = MOVETYPE_BOUNCE;
|
||||
pev->solid = SOLID_BBOX;
|
||||
|
||||
SET_MODEL( ENT( pev ), "models/rpgrocket.mdl" );
|
||||
UTIL_SetSize( pev, Vector( 0, 0, 0 ), Vector( 0, 0, 0 ) );
|
||||
UTIL_SetOrigin( this, pev->origin );
|
||||
|
||||
pev->classname = MAKE_STRING( "rpg_rocket" );
|
||||
|
||||
SetThink( &CRpgRocket::IgniteThink );
|
||||
SetTouch(&CRpgRocket :: ExplodeTouch );
|
||||
|
||||
pev->angles.x -= 30;
|
||||
UTIL_MakeVectors( pev->angles );
|
||||
pev->angles.x = -( pev->angles.x + 30 );
|
||||
|
||||
pev->velocity = gpGlobals->v_forward * 250;
|
||||
pev->gravity = 0.5;
|
||||
|
||||
SetNextThink( 0.4 );
|
||||
|
||||
pev->dmg = gSkillData.plrDmgRPG;
|
||||
}
|
||||
|
||||
//=========================================================
|
||||
//=========================================================
|
||||
void CRpgRocket::RocketTouch( CBaseEntity *pOther )
|
||||
{
|
||||
if( CRpg* pLauncher = (CRpg*)( (CBaseEntity*)( m_hLauncher ) ) )
|
||||
{
|
||||
// my launcher is still around, tell it I'm dead.
|
||||
pLauncher->m_cActiveRockets--;
|
||||
}
|
||||
|
||||
STOP_SOUND( edict(), CHAN_VOICE, "weapons/rocket1.wav" );
|
||||
ExplodeTouch( pOther );
|
||||
}
|
||||
|
||||
//=========================================================
|
||||
//=========================================================
|
||||
void CRpgRocket::Precache( void )
|
||||
{
|
||||
PRECACHE_MODEL( "models/rpgrocket.mdl" );
|
||||
m_iTrail = PRECACHE_MODEL( "sprites/smoke.spr" );
|
||||
PRECACHE_SOUND( "weapons/rocket1.wav" );
|
||||
}
|
||||
|
||||
void CRpgRocket::IgniteThink( void )
|
||||
{
|
||||
// pev->movetype = MOVETYPE_TOSS;
|
||||
|
||||
pev->movetype = MOVETYPE_FLY;
|
||||
pev->effects |= EF_LIGHT;
|
||||
|
||||
// make rocket sound
|
||||
EMIT_SOUND( ENT( pev ), CHAN_VOICE, "weapons/rocket1.wav", 1, 0.5 );
|
||||
|
||||
// rocket trail
|
||||
MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY );
|
||||
WRITE_BYTE( TE_BEAMFOLLOW );
|
||||
WRITE_SHORT( entindex() ); // entity
|
||||
WRITE_SHORT( m_iTrail ); // model
|
||||
WRITE_BYTE( 40 ); // life
|
||||
WRITE_BYTE( 5 ); // width
|
||||
WRITE_BYTE( 224 ); // r, g, b
|
||||
WRITE_BYTE( 224 ); // r, g, b
|
||||
WRITE_BYTE( 255 ); // r, g, b
|
||||
WRITE_BYTE( 255 ); // brightness
|
||||
MESSAGE_END(); // move PHS/PVS data sending into here (SEND_ALL, SEND_PVS, SEND_PHS)
|
||||
|
||||
m_flIgniteTime = gpGlobals->time;
|
||||
|
||||
// set to follow laser spot
|
||||
SetThink( &CRpgRocket::FollowThink );
|
||||
SetNextThink( 0.1 );
|
||||
}
|
||||
|
||||
void CRpgRocket::FollowThink( void )
|
||||
{
|
||||
CBaseEntity *pOther = NULL;
|
||||
Vector vecTarget;
|
||||
Vector vecDir;
|
||||
float flDist, flMax, flDot;
|
||||
TraceResult tr;
|
||||
|
||||
UTIL_MakeAimVectors( pev->angles );
|
||||
|
||||
vecTarget = gpGlobals->v_forward;
|
||||
flMax = 4096;
|
||||
|
||||
// Examine all entities within a reasonable radius
|
||||
while( ( pOther = UTIL_FindEntityByClassname( pOther, "laser_spot" ) ) != NULL )
|
||||
{
|
||||
UTIL_TraceLine( pev->origin, pOther->pev->origin, dont_ignore_monsters, ENT( pev ), &tr );
|
||||
// ALERT( at_console, "%f\n", tr.flFraction );
|
||||
if( tr.flFraction >= 0.90 )
|
||||
{
|
||||
vecDir = pOther->pev->origin - pev->origin;
|
||||
flDist = vecDir.Length();
|
||||
vecDir = vecDir.Normalize();
|
||||
flDot = DotProduct( gpGlobals->v_forward, vecDir );
|
||||
if( ( flDot > 0 ) && ( flDist * ( 1 - flDot ) < flMax ) )
|
||||
{
|
||||
flMax = flDist * ( 1 - flDot );
|
||||
vecTarget = vecDir;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pev->angles = UTIL_VecToAngles( vecTarget );
|
||||
|
||||
// this acceleration and turning math is totally wrong, but it seems to respond well so don't change it.
|
||||
float flSpeed = pev->velocity.Length();
|
||||
if( gpGlobals->time - m_flIgniteTime < 1.0 )
|
||||
{
|
||||
pev->velocity = pev->velocity * 0.2 + vecTarget * ( flSpeed * 0.8 + 400 );
|
||||
if (pev->waterlevel == 3 && pev->watertype > CONTENT_FLYFIELD)
|
||||
{
|
||||
// go slow underwater
|
||||
if( pev->velocity.Length() > 300 )
|
||||
{
|
||||
pev->velocity = pev->velocity.Normalize() * 300;
|
||||
}
|
||||
UTIL_BubbleTrail( pev->origin - pev->velocity * 0.1, pev->origin, 4 );
|
||||
}
|
||||
else
|
||||
{
|
||||
if( pev->velocity.Length() > 2000 )
|
||||
{
|
||||
pev->velocity = pev->velocity.Normalize() * 2000;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( pev->effects & EF_LIGHT )
|
||||
{
|
||||
pev->effects = 0;
|
||||
STOP_SOUND( ENT( pev ), CHAN_VOICE, "weapons/rocket1.wav" );
|
||||
}
|
||||
pev->velocity = pev->velocity * 0.2 + vecTarget * flSpeed * 0.798;
|
||||
if ((pev->waterlevel == 0 || pev->watertype == CONTENT_FOG) && pev->velocity.Length() < 1500)
|
||||
{
|
||||
if( CRpg *pLauncher = (CRpg*)( (CBaseEntity*)( m_hLauncher ) ) )
|
||||
{
|
||||
// my launcher is still around, tell it I'm dead.
|
||||
pLauncher->m_cActiveRockets--;
|
||||
}
|
||||
Detonate();
|
||||
}
|
||||
}
|
||||
// ALERT( at_console, "%.0f\n", flSpeed );
|
||||
|
||||
SetNextThink( 0.1 );
|
||||
}
|
||||
#endif
|
||||
|
||||
void CRpg::Reload( void )
|
||||
{
|
||||
int iResult = 0;
|
||||
|
||||
// don't bother with any of this if don't need to reload.
|
||||
if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == RPG_MAX_CLIP )
|
||||
return;
|
||||
|
||||
// because the RPG waits to autoreload when no missiles are active while the LTD is on, the
|
||||
// weapons code is constantly calling into this function, but is often denied because
|
||||
// a) missiles are in flight, but the LTD is on
|
||||
// or
|
||||
// b) player is totally out of ammo and has nothing to switch to, and should be allowed to
|
||||
// shine the designator around
|
||||
//
|
||||
// Set the next attack time into the future so that WeaponIdle will get called more often
|
||||
// than reload, allowing the RPG LTD to be updated
|
||||
|
||||
m_flNextPrimaryAttack = GetNextAttackDelay( 0.5 );
|
||||
|
||||
if( m_cActiveRockets && m_fSpotActive )
|
||||
{
|
||||
// no reloading when there are active missiles tracking the designator.
|
||||
// ward off future autoreload attempts by setting next attack time into the future for a bit.
|
||||
return;
|
||||
}
|
||||
|
||||
#ifndef CLIENT_DLL
|
||||
if( m_pSpot && m_fSpotActive )
|
||||
{
|
||||
m_pSpot->Suspend( 2.1 );
|
||||
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 2.1;
|
||||
}
|
||||
#endif
|
||||
|
||||
if( m_iClip == 0 )
|
||||
iResult = DefaultReload( RPG_MAX_CLIP, RPG_RELOAD, 2 );
|
||||
|
||||
if( iResult )
|
||||
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
|
||||
}
|
||||
|
||||
void CRpg::Spawn()
|
||||
{
|
||||
Precache();
|
||||
m_iId = WEAPON_RPG;
|
||||
|
||||
SET_MODEL( ENT( pev ), "models/w_rpg.mdl" );
|
||||
m_fSpotActive = 1;
|
||||
|
||||
#ifdef CLIENT_DLL
|
||||
if( bIsMultiplayer() )
|
||||
#else
|
||||
if( g_pGameRules->IsMultiplayer() )
|
||||
#endif
|
||||
{
|
||||
// more default ammo in multiplay.
|
||||
m_iDefaultAmmo = RPG_DEFAULT_GIVE * 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_iDefaultAmmo = RPG_DEFAULT_GIVE;
|
||||
}
|
||||
|
||||
FallInit();// get ready to fall down.
|
||||
}
|
||||
|
||||
void CRpg::Precache( void )
|
||||
{
|
||||
PRECACHE_MODEL( "models/w_rpg.mdl" );
|
||||
PRECACHE_MODEL( "models/v_rpg.mdl" );
|
||||
PRECACHE_MODEL( "models/p_rpg.mdl" );
|
||||
|
||||
PRECACHE_SOUND( "items/9mmclip1.wav" );
|
||||
|
||||
UTIL_PrecacheOther( "laser_spot" );
|
||||
UTIL_PrecacheOther( "rpg_rocket" );
|
||||
|
||||
PRECACHE_SOUND( "weapons/rocketfire1.wav" );
|
||||
PRECACHE_SOUND( "weapons/glauncher.wav" ); // alternative fire sound
|
||||
|
||||
m_usRpg = PRECACHE_EVENT( 1, "events/rpg.sc" );
|
||||
}
|
||||
|
||||
int CRpg::GetItemInfo( ItemInfo *p )
|
||||
{
|
||||
p->pszName = STRING( pev->classname );
|
||||
p->pszAmmo1 = "rockets";
|
||||
p->iMaxAmmo1 = ROCKET_MAX_CARRY;
|
||||
p->pszAmmo2 = NULL;
|
||||
p->iMaxAmmo2 = -1;
|
||||
p->iMaxClip = RPG_MAX_CLIP;
|
||||
p->iSlot = 3;
|
||||
p->iPosition = 0;
|
||||
p->iId = m_iId = WEAPON_RPG;
|
||||
p->iFlags = 0;
|
||||
p->iWeight = RPG_WEIGHT;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int CRpg::AddToPlayer( CBasePlayer *pPlayer )
|
||||
{
|
||||
if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
|
||||
{
|
||||
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
|
||||
WRITE_BYTE( m_iId );
|
||||
MESSAGE_END();
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL CRpg::Deploy()
|
||||
{
|
||||
if( m_iClip == 0 )
|
||||
{
|
||||
return DefaultDeploy( "models/v_rpg.mdl", "models/p_rpg.mdl", RPG_DRAW_UL, "rpg" );
|
||||
}
|
||||
|
||||
return DefaultDeploy( "models/v_rpg.mdl", "models/p_rpg.mdl", RPG_DRAW1, "rpg" );
|
||||
}
|
||||
|
||||
BOOL CRpg::CanHolster( void )
|
||||
{
|
||||
if( m_fSpotActive && m_cActiveRockets )
|
||||
{
|
||||
// can't put away while guiding a missile.
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void CRpg::Holster( int skiplocal /* = 0 */ )
|
||||
{
|
||||
m_fInReload = FALSE;// cancel any reload in progress.
|
||||
|
||||
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5;
|
||||
|
||||
SendWeaponAnim( RPG_HOLSTER1 );
|
||||
|
||||
#ifndef CLIENT_DLL
|
||||
if( m_pSpot )
|
||||
{
|
||||
m_pSpot->Killed( NULL, GIB_NEVER );
|
||||
m_pSpot = NULL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void CRpg::PrimaryAttack()
|
||||
{
|
||||
if( m_iClip )
|
||||
{
|
||||
m_pPlayer->m_iWeaponVolume = LOUD_GUN_VOLUME;
|
||||
m_pPlayer->m_iWeaponFlash = BRIGHT_GUN_FLASH;
|
||||
|
||||
#ifndef CLIENT_DLL
|
||||
// player "shoot" animation
|
||||
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
|
||||
|
||||
UTIL_MakeVectors( m_pPlayer->pev->v_angle );
|
||||
Vector vecSrc = m_pPlayer->GetGunPosition() + gpGlobals->v_forward * 16 + gpGlobals->v_right * 8 + gpGlobals->v_up * -8;
|
||||
|
||||
CRpgRocket *pRocket = CRpgRocket::CreateRpgRocket( vecSrc, m_pPlayer->pev->v_angle, m_pPlayer, this );
|
||||
|
||||
UTIL_MakeVectors( m_pPlayer->pev->v_angle );// RpgRocket::Create stomps on globals, so remake.
|
||||
pRocket->pev->velocity = pRocket->pev->velocity + gpGlobals->v_forward * DotProduct( m_pPlayer->pev->velocity, gpGlobals->v_forward );
|
||||
#endif
|
||||
|
||||
// firing RPG no longer turns on the designator. ALT fire is a toggle switch for the LTD.
|
||||
// Ken signed up for this as a global change (sjb)
|
||||
|
||||
int flags;
|
||||
#if defined( CLIENT_WEAPONS )
|
||||
flags = FEV_NOTHOST;
|
||||
#else
|
||||
flags = 0;
|
||||
#endif
|
||||
PLAYBACK_EVENT( flags, m_pPlayer->edict(), m_usRpg );
|
||||
|
||||
m_iClip--;
|
||||
|
||||
m_flNextPrimaryAttack = GetNextAttackDelay( 1.5 );
|
||||
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.5;
|
||||
|
||||
ResetEmptySound();
|
||||
}
|
||||
else
|
||||
{
|
||||
PlayEmptySound();
|
||||
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.2;
|
||||
}
|
||||
UpdateSpot();
|
||||
}
|
||||
|
||||
void CRpg::SecondaryAttack()
|
||||
{
|
||||
m_fSpotActive = !m_fSpotActive;
|
||||
|
||||
#ifndef CLIENT_DLL
|
||||
if( !m_fSpotActive && m_pSpot )
|
||||
{
|
||||
m_pSpot->Killed( NULL, GIB_NORMAL );
|
||||
m_pSpot = NULL;
|
||||
}
|
||||
#endif
|
||||
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.2;
|
||||
}
|
||||
|
||||
void CRpg::WeaponIdle( void )
|
||||
{
|
||||
UpdateSpot();
|
||||
|
||||
if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
|
||||
return;
|
||||
|
||||
if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
|
||||
{
|
||||
ResetEmptySound();
|
||||
|
||||
int iAnim;
|
||||
float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 );
|
||||
if( flRand <= 0.75 || m_fSpotActive )
|
||||
{
|
||||
if( m_iClip == 0 )
|
||||
iAnim = RPG_IDLE_UL;
|
||||
else
|
||||
iAnim = RPG_IDLE;
|
||||
|
||||
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 90.0 / 15.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( m_iClip == 0 )
|
||||
iAnim = RPG_FIDGET_UL;
|
||||
else
|
||||
iAnim = RPG_FIDGET;
|
||||
|
||||
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 3.0;
|
||||
}
|
||||
|
||||
SendWeaponAnim( iAnim );
|
||||
}
|
||||
else
|
||||
{
|
||||
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1;
|
||||
}
|
||||
}
|
||||
|
||||
void CRpg::UpdateSpot( void )
|
||||
{
|
||||
#ifndef CLIENT_DLL
|
||||
if( m_fSpotActive )
|
||||
{
|
||||
if( !m_pSpot )
|
||||
{
|
||||
m_pSpot = CLaserSpot::CreateSpot();
|
||||
}
|
||||
|
||||
UTIL_MakeVectors( m_pPlayer->pev->v_angle );
|
||||
Vector vecSrc = m_pPlayer->GetGunPosition();
|
||||
Vector vecAiming = gpGlobals->v_forward;
|
||||
|
||||
TraceResult tr;
|
||||
UTIL_TraceLine( vecSrc, vecSrc + vecAiming * 8192, dont_ignore_monsters, ENT( m_pPlayer->pev ), &tr );
|
||||
|
||||
UTIL_SetOrigin( m_pSpot, tr.vecEndPos );
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
class CRpgAmmo : public CBasePlayerAmmo
|
||||
{
|
||||
void Spawn( void )
|
||||
{
|
||||
Precache();
|
||||
SET_MODEL( ENT( pev ), "models/w_rpgammo.mdl" );
|
||||
CBasePlayerAmmo::Spawn();
|
||||
}
|
||||
void Precache( void )
|
||||
{
|
||||
PRECACHE_MODEL( "models/w_rpgammo.mdl" );
|
||||
PRECACHE_SOUND( "items/9mmclip1.wav" );
|
||||
}
|
||||
BOOL AddAmmo( CBaseEntity *pOther )
|
||||
{
|
||||
int iGive;
|
||||
#ifdef CLIENT_DLL
|
||||
if( bIsMultiplayer() )
|
||||
#else
|
||||
if( g_pGameRules->IsMultiplayer() )
|
||||
#endif
|
||||
{
|
||||
// hand out more ammo per rocket in multiplayer.
|
||||
iGive = AMMO_RPGCLIP_GIVE * 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
iGive = AMMO_RPGCLIP_GIVE;
|
||||
}
|
||||
|
||||
if( pOther->GiveAmmo( iGive, "rockets", ROCKET_MAX_CARRY ) != -1 )
|
||||
{
|
||||
EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM );
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
};
|
||||
|
||||
LINK_ENTITY_TO_CLASS( ammo_rpgclip, CRpgAmmo )
|
||||
#endif
|
||||
|
|
|
@ -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" );
|
||||
|
||||
|
|
295
dlls/shotgun.cpp
295
dlls/shotgun.cpp
|
@ -23,65 +23,66 @@
|
|||
#include "gamerules.h"
|
||||
|
||||
// special deathmatch shotgun spreads
|
||||
#define VECTOR_CONE_DM_SHOTGUN Vector( 0.08716, 0.04362, 0.00 )// 10 degrees by 5 degrees
|
||||
#define VECTOR_CONE_DM_SHOTGUN Vector( 0.08716, 0.04362, 0.00 )// 10 degrees by 5 degrees
|
||||
#define VECTOR_CONE_DM_DOUBLESHOTGUN Vector( 0.17365, 0.04362, 0.00 ) // 20 degrees by 5 degrees
|
||||
|
||||
enum shotgun_e
|
||||
{
|
||||
SHOTGUN_IDLE = 0,
|
||||
SHOTGUN_IDLE2,
|
||||
SHOTGUN_FIRE,
|
||||
SHOTGUN_FIRE2,
|
||||
SHOTGUN_RELOAD,
|
||||
SHOTGUN_PUMP,
|
||||
SHOTGUN_START_RELOAD,
|
||||
SHOTGUN_DRAW,
|
||||
SHOTGUN_HOLSTER,
|
||||
SHOTGUN_IDLE4,
|
||||
SHOTGUN_IDLE_DEEP
|
||||
SHOTGUN_RELOAD_START,
|
||||
SHOTGUN_RELOAD_INS,
|
||||
SHOTGUN_RELOAD_END,
|
||||
SHOTGUN_DRAW
|
||||
};
|
||||
|
||||
LINK_ENTITY_TO_CLASS( weapon_shotgun, CShotgun )
|
||||
LINK_ENTITY_TO_CLASS( weapon_shotgun, CShotgun );
|
||||
|
||||
void CShotgun::Spawn()
|
||||
void CShotgun::Spawn( )
|
||||
{
|
||||
Precache();
|
||||
Precache( );
|
||||
m_iId = WEAPON_SHOTGUN;
|
||||
SET_MODEL( ENT( pev ), "models/w_shotgun.mdl" );
|
||||
SET_MODEL(ENT(pev), "models/w_shotgun.mdl");
|
||||
|
||||
m_iDefaultAmmo = SHOTGUN_DEFAULT_GIVE;
|
||||
|
||||
FallInit();// get ready to fall
|
||||
}
|
||||
|
||||
|
||||
void CShotgun::Precache( void )
|
||||
{
|
||||
PRECACHE_MODEL( "models/v_shotgun.mdl" );
|
||||
PRECACHE_MODEL( "models/w_shotgun.mdl" );
|
||||
PRECACHE_MODEL( "models/p_shotgun.mdl" );
|
||||
PRECACHE_MODEL("models/v_shotgun.mdl");
|
||||
PRECACHE_MODEL("models/w_shotgun.mdl");
|
||||
PRECACHE_MODEL("models/p_shotgun.mdl");
|
||||
|
||||
m_iShell = PRECACHE_MODEL( "models/shotgunshell.mdl" );// shotgun shell
|
||||
m_iShell = PRECACHE_MODEL ("models/shotgunshell.mdl");// shotgun shell
|
||||
|
||||
PRECACHE_SOUND( "items/9mmclip1.wav" );
|
||||
PRECACHE_SOUND("items/9mmclip1.wav");
|
||||
|
||||
PRECACHE_SOUND( "weapons/dbarrel1.wav" );//shotgun
|
||||
PRECACHE_SOUND( "weapons/sbarrel1.wav" );//shotgun
|
||||
PRECACHE_SOUND ("weapons/dbarrel1.wav");//shotgun
|
||||
PRECACHE_SOUND ("weapons/sbarrel1.wav");//shotgun
|
||||
|
||||
PRECACHE_SOUND( "weapons/reload1.wav" ); // shotgun reload
|
||||
PRECACHE_SOUND( "weapons/reload3.wav" ); // shotgun reload
|
||||
PRECACHE_SOUND ("weapons/shotgun_fire_safe.wav");
|
||||
PRECACHE_SOUND ("weapons/shotgun_fire.wav");
|
||||
PRECACHE_SOUND ("weapons/shotgun_insert.wav");
|
||||
PRECACHE_SOUND ("weapons/shotgun_pump.wav");
|
||||
//PRECACHE_SOUND ("weapons/reload1.wav"); // shotgun reload
|
||||
//PRECACHE_SOUND ("weapons/reload3.wav"); // shotgun reload
|
||||
|
||||
//PRECACHE_SOUND( "weapons/sshell1.wav" ); // shotgun reload - played on client
|
||||
//PRECACHE_SOUND( "weapons/sshell3.wav" ); // shotgun reload - played on client
|
||||
// PRECACHE_SOUND ("weapons/sshell1.wav"); // shotgun reload - played on client
|
||||
// PRECACHE_SOUND ("weapons/sshell3.wav"); // shotgun reload - played on client
|
||||
|
||||
PRECACHE_SOUND( "weapons/357_cock1.wav" ); // gun empty sound
|
||||
PRECACHE_SOUND( "weapons/scock1.wav" ); // cock gun
|
||||
PRECACHE_SOUND ("weapons/357_cock1.wav"); // gun empty sound
|
||||
PRECACHE_SOUND ("weapons/scock1.wav"); // cock gun
|
||||
|
||||
m_usSingleFire = PRECACHE_EVENT( 1, "events/shotgun1.sc" );
|
||||
m_usDoubleFire = PRECACHE_EVENT( 1, "events/shotgun2.sc" );
|
||||
m_usSingleFire = PRECACHE_EVENT( 1, "events/shotgun.sc" );
|
||||
}
|
||||
|
||||
int CShotgun::AddToPlayer( CBasePlayer *pPlayer )
|
||||
{
|
||||
if( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
|
||||
if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
|
||||
{
|
||||
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
|
||||
WRITE_BYTE( m_iId );
|
||||
|
@ -91,16 +92,17 @@ int CShotgun::AddToPlayer( CBasePlayer *pPlayer )
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
int CShotgun::GetItemInfo( ItemInfo *p )
|
||||
|
||||
int CShotgun::GetItemInfo(ItemInfo *p)
|
||||
{
|
||||
p->pszName = STRING( pev->classname );
|
||||
p->pszName = STRING(pev->classname);
|
||||
p->pszAmmo1 = "buckshot";
|
||||
p->iMaxAmmo1 = BUCKSHOT_MAX_CARRY;
|
||||
p->pszAmmo2 = NULL;
|
||||
p->iMaxAmmo2 = -1;
|
||||
p->iMaxClip = SHOTGUN_MAX_CLIP;
|
||||
p->iSlot = 2;
|
||||
p->iPosition = 1;
|
||||
p->iPosition = 2;
|
||||
p->iFlags = 0;
|
||||
p->iId = m_iId = WEAPON_SHOTGUN;
|
||||
p->iWeight = SHOTGUN_WEIGHT;
|
||||
|
@ -108,33 +110,38 @@ int CShotgun::GetItemInfo( ItemInfo *p )
|
|||
return 1;
|
||||
}
|
||||
|
||||
BOOL CShotgun::Deploy()
|
||||
|
||||
|
||||
BOOL CShotgun::Deploy( )
|
||||
{
|
||||
return DefaultDeploy( "models/v_shotgun.mdl", "models/p_shotgun.mdl", SHOTGUN_DRAW, "shotgun" );
|
||||
return DefaultDeploy( "models/v_shotgun.mdl", "models/p_shotgun.mdl", SHOTGUN_DRAW, "Shotgun" );
|
||||
}
|
||||
|
||||
void CShotgun::PrimaryAttack()
|
||||
{
|
||||
// don't fire underwater
|
||||
if( m_pPlayer->pev->waterlevel == 3 )
|
||||
if (m_pPlayer->pev->waterlevel == 3 && m_pPlayer->pev->watertype > CONTENT_FLYFIELD)
|
||||
{
|
||||
PlayEmptySound();
|
||||
m_flNextPrimaryAttack = GetNextAttackDelay( 0.15 );
|
||||
PlayEmptySound( );
|
||||
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.15;
|
||||
return;
|
||||
}
|
||||
|
||||
if( m_iClip <= 0 )
|
||||
if (m_iClip <= 0)
|
||||
{
|
||||
Reload();
|
||||
if( m_iClip == 0 )
|
||||
PlayEmptySound();
|
||||
Reload( );
|
||||
if (m_iClip == 0)
|
||||
PlayEmptySound( );
|
||||
return;
|
||||
}
|
||||
|
||||
m_pPlayer->m_iWeaponVolume = LOUD_GUN_VOLUME;
|
||||
m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH;
|
||||
|
||||
#ifndef CLIENT_DLL
|
||||
SetThink( &CShotgun::LolShell );
|
||||
pev->nextthink = gpGlobals->time + 0.6;
|
||||
#endif
|
||||
m_iClip--;
|
||||
|
||||
int flags;
|
||||
|
@ -143,153 +150,69 @@ void CShotgun::PrimaryAttack()
|
|||
#else
|
||||
flags = 0;
|
||||
#endif
|
||||
m_pPlayer->pev->effects = (int)( m_pPlayer->pev->effects ) | EF_MUZZLEFLASH;
|
||||
|
||||
// player "shoot" animation
|
||||
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
|
||||
m_pPlayer->pev->effects = (int)(m_pPlayer->pev->effects) | EF_MUZZLEFLASH;
|
||||
|
||||
Vector vecSrc = m_pPlayer->GetGunPosition();
|
||||
Vector vecSrc = m_pPlayer->GetGunPosition( );
|
||||
Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
|
||||
|
||||
Vector vecDir;
|
||||
|
||||
#ifdef CLIENT_DLL
|
||||
if( bIsMultiplayer() )
|
||||
#else
|
||||
if( g_pGameRules->IsMultiplayer() )
|
||||
#endif
|
||||
{
|
||||
vecDir = m_pPlayer->FireBulletsPlayer( 4, vecSrc, vecAiming, VECTOR_CONE_DM_SHOTGUN, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );
|
||||
}
|
||||
else
|
||||
{
|
||||
// regular old, untouched spread.
|
||||
vecDir = m_pPlayer->FireBulletsPlayer( 6, vecSrc, vecAiming, VECTOR_CONE_10DEGREES, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );
|
||||
}
|
||||
// regular old, untouched spread.
|
||||
Vector vecDir = m_pPlayer->FireBulletsPlayer( 8, vecSrc, vecAiming, VECTOR_CONE_10DEGREES, 2048, BULLET_PLAYER_BUCKSHOT, 0, gSkillData.plrDmgBuckshot, m_pPlayer->pev, m_pPlayer->random_seed );
|
||||
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usSingleFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );
|
||||
|
||||
if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
|
||||
// HEV suit - indicate out of ammo condition
|
||||
m_pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 );
|
||||
|
||||
//if( m_iClip != 0 )
|
||||
if (m_iClip != 0)
|
||||
m_flPumpTime = gpGlobals->time + 0.5;
|
||||
|
||||
m_flNextPrimaryAttack = GetNextAttackDelay( 0.75 );
|
||||
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 0.75;
|
||||
if( m_iClip != 0 )
|
||||
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.3;
|
||||
if (m_iClip != 0)
|
||||
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 5.0;
|
||||
else
|
||||
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.75;
|
||||
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.3;
|
||||
m_fInSpecialReload = 0;
|
||||
}
|
||||
|
||||
void CShotgun::SecondaryAttack( void )
|
||||
void CShotgun::LolShell( void )
|
||||
{
|
||||
// don't fire underwater
|
||||
if (m_pPlayer->pev->waterlevel == 3 && m_pPlayer->pev->watertype > CONTENT_FLYFIELD)
|
||||
{
|
||||
PlayEmptySound();
|
||||
m_flNextPrimaryAttack = GetNextAttackDelay( 0.15 );
|
||||
return;
|
||||
}
|
||||
#ifndef CLIENT_DLL
|
||||
Vector vecShellVelocity = m_pPlayer->pev->velocity
|
||||
+ gpGlobals->v_right * 60
|
||||
+ gpGlobals->v_up * 200
|
||||
+ gpGlobals->v_forward * 40;
|
||||
|
||||
if( m_iClip <= 1 )
|
||||
{
|
||||
Reload();
|
||||
PlayEmptySound();
|
||||
return;
|
||||
}
|
||||
|
||||
m_pPlayer->m_iWeaponVolume = LOUD_GUN_VOLUME;
|
||||
m_pPlayer->m_iWeaponFlash = NORMAL_GUN_FLASH;
|
||||
|
||||
m_iClip -= 2;
|
||||
|
||||
int flags;
|
||||
#if defined( CLIENT_WEAPONS )
|
||||
flags = FEV_NOTHOST;
|
||||
#else
|
||||
flags = 0;
|
||||
EjectBrass( m_pPlayer->pev->origin + m_pPlayer->pev->view_ofs + gpGlobals->v_up * -12 + gpGlobals->v_forward * 45 + gpGlobals->v_right * 30, vecShellVelocity, pev->angles.y, m_iShell, TE_BOUNCE_SHOTSHELL );
|
||||
#endif
|
||||
m_pPlayer->pev->effects = (int)( m_pPlayer->pev->effects ) | EF_MUZZLEFLASH;
|
||||
|
||||
// player "shoot" animation
|
||||
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );
|
||||
|
||||
Vector vecSrc = m_pPlayer->GetGunPosition();
|
||||
Vector vecAiming = m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
|
||||
|
||||
Vector vecDir;
|
||||
|
||||
#ifdef CLIENT_DLL
|
||||
if( bIsMultiplayer() )
|
||||
#else
|
||||
if( g_pGameRules->IsMultiplayer() )
|
||||
#endif
|
||||
{
|
||||
// tuned for deathmatch
|
||||
vecDir = m_pPlayer->FireBulletsPlayer( 8, vecSrc, vecAiming, VECTOR_CONE_DM_DOUBLESHOTGUN, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );
|
||||
}
|
||||
else
|
||||
{
|
||||
// untouched default single player
|
||||
vecDir = m_pPlayer->FireBulletsPlayer( 12, vecSrc, vecAiming, VECTOR_CONE_10DEGREES, 2048, BULLET_PLAYER_BUCKSHOT, 0, 0, m_pPlayer->pev, m_pPlayer->random_seed );
|
||||
}
|
||||
|
||||
PLAYBACK_EVENT_FULL( flags, m_pPlayer->edict(), m_usDoubleFire, 0.0, (float *)&g_vecZero, (float *)&g_vecZero, vecDir.x, vecDir.y, 0, 0, 0, 0 );
|
||||
|
||||
if( !m_iClip && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 )
|
||||
// HEV suit - indicate out of ammo condition
|
||||
m_pPlayer->SetSuitUpdate( "!HEV_AMO0", FALSE, 0 );
|
||||
|
||||
//if( m_iClip != 0 )
|
||||
m_flPumpTime = gpGlobals->time + 0.95;
|
||||
|
||||
m_flNextPrimaryAttack = GetNextAttackDelay( 1.5 );
|
||||
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.5;
|
||||
if( m_iClip != 0 )
|
||||
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 6.0;
|
||||
else
|
||||
m_flTimeWeaponIdle = 1.5;
|
||||
|
||||
m_fInSpecialReload = 0;
|
||||
}
|
||||
|
||||
void CShotgun::Reload( void )
|
||||
{
|
||||
if( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == SHOTGUN_MAX_CLIP )
|
||||
if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0 || m_iClip == SHOTGUN_MAX_CLIP)
|
||||
return;
|
||||
|
||||
// don't reload until recoil is done
|
||||
if( m_flNextPrimaryAttack > UTIL_WeaponTimeBase() )
|
||||
if (m_flNextPrimaryAttack > UTIL_WeaponTimeBase())
|
||||
return;
|
||||
|
||||
// check to see if we're ready to reload
|
||||
if( m_fInSpecialReload == 0 )
|
||||
if (m_fInSpecialReload == 0)
|
||||
{
|
||||
SendWeaponAnim( SHOTGUN_START_RELOAD );
|
||||
SendWeaponAnim( SHOTGUN_RELOAD_START );
|
||||
m_fInSpecialReload = 1;
|
||||
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.6;
|
||||
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.6;
|
||||
m_flNextPrimaryAttack = GetNextAttackDelay( 1.0 );
|
||||
m_flNextSecondaryAttack = UTIL_WeaponTimeBase() + 1.0;
|
||||
m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 1.0;
|
||||
return;
|
||||
}
|
||||
else if( m_fInSpecialReload == 1 )
|
||||
else if (m_fInSpecialReload == 1)
|
||||
{
|
||||
if( m_flTimeWeaponIdle > UTIL_WeaponTimeBase() )
|
||||
if (m_flTimeWeaponIdle > UTIL_WeaponTimeBase())
|
||||
return;
|
||||
// was waiting for gun to move to side
|
||||
m_fInSpecialReload = 2;
|
||||
|
||||
if( RANDOM_LONG( 0, 1 ) )
|
||||
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/reload1.wav", 1, ATTN_NORM, 0, 85 + RANDOM_LONG( 0, 0x1f ) );
|
||||
else
|
||||
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/reload3.wav", 1, ATTN_NORM, 0, 85 + RANDOM_LONG( 0, 0x1f ) );
|
||||
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/shotgun_insert.wav", 1, ATTN_NORM, 0, 85 + RANDOM_LONG(0,0x1f));
|
||||
|
||||
SendWeaponAnim( SHOTGUN_RELOAD );
|
||||
SendWeaponAnim( SHOTGUN_RELOAD_INS );
|
||||
|
||||
m_flNextReload = UTIL_WeaponTimeBase() + 0.5;
|
||||
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 0.5;
|
||||
|
@ -303,91 +226,73 @@ void CShotgun::Reload( void )
|
|||
}
|
||||
}
|
||||
|
||||
void CShotgun::WeaponTick()
|
||||
{
|
||||
if( m_flPumpTime && m_flPumpTime < gpGlobals->time )
|
||||
{
|
||||
// play pumping sound
|
||||
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/scock1.wav", 1, ATTN_NORM, 0, 95 + RANDOM_LONG( 0, 0x1f ) );
|
||||
m_flPumpTime = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void CShotgun::WeaponIdle( void )
|
||||
{
|
||||
ResetEmptySound();
|
||||
ResetEmptySound( );
|
||||
|
||||
m_pPlayer->GetAutoaimVector( AUTOAIM_5DEGREES );
|
||||
|
||||
if( m_flTimeWeaponIdle < UTIL_WeaponTimeBase() )
|
||||
if ( m_flPumpTime && m_flPumpTime < gpGlobals->time )
|
||||
{
|
||||
if( m_iClip == 0 && m_fInSpecialReload == 0 && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
|
||||
// play pumping sound
|
||||
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/shotgun_pump.wav", 1, ATTN_NORM, 0, 95 + RANDOM_LONG(0,0x1f));
|
||||
m_flPumpTime = 0;
|
||||
}
|
||||
|
||||
if (m_flTimeWeaponIdle < UTIL_WeaponTimeBase() )
|
||||
{
|
||||
if (m_iClip == 0 && m_fInSpecialReload == 0 && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType])
|
||||
{
|
||||
Reload();
|
||||
Reload( );
|
||||
}
|
||||
else if( m_fInSpecialReload != 0 )
|
||||
else if (m_fInSpecialReload != 0)
|
||||
{
|
||||
if( m_iClip != SHOTGUN_MAX_CLIP && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] )
|
||||
if (m_iClip != SHOTGUN_MAX_CLIP && m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType])
|
||||
{
|
||||
Reload();
|
||||
Reload( );
|
||||
}
|
||||
else
|
||||
{
|
||||
// reload debounce has timed out
|
||||
SendWeaponAnim( SHOTGUN_PUMP );
|
||||
|
||||
SendWeaponAnim( SHOTGUN_RELOAD_END );
|
||||
// play cocking sound
|
||||
EMIT_SOUND_DYN( ENT( m_pPlayer->pev ), CHAN_ITEM, "weapons/scock1.wav", 1, ATTN_NORM, 0, 95 + RANDOM_LONG( 0, 0x1f ) );
|
||||
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/shotgun_pump.wav", 1, ATTN_NORM, 0, 95 + RANDOM_LONG(0,0x1f));
|
||||
m_fInSpecialReload = 0;
|
||||
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + 1.5;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int iAnim;
|
||||
float flRand = UTIL_SharedRandomFloat( m_pPlayer->random_seed, 0, 1 );
|
||||
if( flRand <= 0.8 )
|
||||
{
|
||||
iAnim = SHOTGUN_IDLE_DEEP;
|
||||
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + ( 60.0 / 12.0 );// * RANDOM_LONG( 2, 5 );
|
||||
}
|
||||
else if( flRand <= 0.95 )
|
||||
{
|
||||
iAnim = SHOTGUN_IDLE;
|
||||
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + ( 20.0 / 9.0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
iAnim = SHOTGUN_IDLE4;
|
||||
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + ( 20.0 / 9.0 );
|
||||
}
|
||||
SendWeaponAnim( iAnim );
|
||||
SendWeaponAnim( SHOTGUN_IDLE );
|
||||
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + (20.0/9.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
class CShotgunAmmo : public CBasePlayerAmmo
|
||||
{
|
||||
void Spawn( void )
|
||||
{
|
||||
Precache();
|
||||
SET_MODEL( ENT( pev ), "models/w_shotbox.mdl" );
|
||||
CBasePlayerAmmo::Spawn();
|
||||
Precache( );
|
||||
SET_MODEL(ENT(pev), "models/w_shotbox.mdl");
|
||||
CBasePlayerAmmo::Spawn( );
|
||||
}
|
||||
void Precache( void )
|
||||
{
|
||||
PRECACHE_MODEL( "models/w_shotbox.mdl" );
|
||||
PRECACHE_SOUND( "items/9mmclip1.wav" );
|
||||
PRECACHE_MODEL ("models/w_shotbox.mdl");
|
||||
PRECACHE_SOUND("items/9mmclip1.wav");
|
||||
}
|
||||
BOOL AddAmmo( CBaseEntity *pOther )
|
||||
{
|
||||
if( pOther->GiveAmmo( AMMO_BUCKSHOTBOX_GIVE, "buckshot", BUCKSHOT_MAX_CARRY ) != -1 )
|
||||
if (pOther->GiveAmmo( AMMO_BUCKSHOTBOX_GIVE, "buckshot", BUCKSHOT_MAX_CARRY ) != -1)
|
||||
{
|
||||
EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM );
|
||||
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
};
|
||||
|
||||
LINK_ENTITY_TO_CLASS( ammo_buckshot, CShotgunAmmo )
|
||||
LINK_ENTITY_TO_CLASS( ammo_buckshot, CShotgunAmmo );
|
||||
|
|
36
dlls/skill.h
36
dlls/skill.h
|
@ -84,31 +84,37 @@ struct skilldata_t
|
|||
float snarkDmgBite;
|
||||
float snarkDmgPop;
|
||||
|
||||
float wheelchairHealth;
|
||||
float wheelchairDmgAttack;
|
||||
|
||||
float zombieHealth;
|
||||
float zombieDmgOneSlash;
|
||||
float zombieDmgBothSlash;
|
||||
|
||||
float zombie2Health;
|
||||
float zombie2DmgOneSlash;
|
||||
float zombie2DmgBothSlash;
|
||||
|
||||
float zombie3Health;
|
||||
float zombie3DmgOneSlash;
|
||||
float zombie3DmgBothSlash;
|
||||
|
||||
float turretHealth;
|
||||
float miniturretHealth;
|
||||
float sentryHealth;
|
||||
|
||||
// Player Weapons
|
||||
float plrDmgCrowbar;
|
||||
float plrDmg9MM;
|
||||
float plrDmg357;
|
||||
float plrDmgMP5;
|
||||
float plrDmgM203Grenade;
|
||||
float plrDmgKnife;
|
||||
float plrDmgHammer;
|
||||
float plrDmgAxe;
|
||||
float plrDmgGlock;
|
||||
float plrDmgBeretta;
|
||||
float plrDmgP228;
|
||||
float plrDmgRevolver;
|
||||
float plrDmgUzi;
|
||||
float plrDmgMP5K;
|
||||
float plrDmgDeagle;
|
||||
float plrDmgBuckshot;
|
||||
float plrDmgCrossbowClient;
|
||||
float plrDmgCrossbowMonster;
|
||||
float plrDmgRPG;
|
||||
float plrDmgGauss;
|
||||
float plrDmgEgonNarrow;
|
||||
float plrDmgEgonWide;
|
||||
float plrDmgHornet;
|
||||
float plrDmgHandGrenade;
|
||||
float plrDmgSatchel;
|
||||
float plrDmgTripmine;
|
||||
|
||||
// weapons shared by monsters
|
||||
float monDmg9MM;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
|
|
|
@ -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.
|
||||
|
|
203
dlls/weapons.cpp
203
dlls/weapons.cpp
|
@ -36,6 +36,7 @@ extern int gEvilImpulse101;
|
|||
|
||||
#define NOT_USED 255
|
||||
|
||||
DLL_GLOBAL short g_sModelIndexLightning;
|
||||
DLL_GLOBAL short g_sModelIndexLaser;// holds the index for the laser beam
|
||||
DLL_GLOBAL const char *g_pModelNameLaser = "sprites/laserbeam.spr";
|
||||
DLL_GLOBAL short g_sModelIndexLaserDot;// holds the index for the laser beam dot
|
||||
|
@ -300,64 +301,59 @@ void W_Precache( void )
|
|||
UTIL_PrecacheOther( "item_antidote" );
|
||||
UTIL_PrecacheOther( "item_security" );
|
||||
UTIL_PrecacheOther( "item_longjump" );
|
||||
UTIL_PrecacheOther( "item_flashlight" );
|
||||
|
||||
// shotgun
|
||||
UTIL_PrecacheOtherWeapon( "weapon_shotgun" );
|
||||
UTIL_PrecacheOther( "ammo_buckshot" );
|
||||
|
||||
// crowbar
|
||||
UTIL_PrecacheOtherWeapon( "weapon_crowbar" );
|
||||
// knife
|
||||
UTIL_PrecacheOtherWeapon( "weapon_knife" );
|
||||
|
||||
// axe
|
||||
UTIL_PrecacheOtherWeapon( "weapon_axe" );
|
||||
|
||||
// hammer
|
||||
UTIL_PrecacheOtherWeapon( "weapon_hammer" );
|
||||
|
||||
// spear
|
||||
UTIL_PrecacheOtherWeapon( "weapon_Spear" );
|
||||
|
||||
// glock
|
||||
UTIL_PrecacheOtherWeapon( "weapon_9mmhandgun" );
|
||||
UTIL_PrecacheOther( "ammo_9mmclip" );
|
||||
UTIL_PrecacheOther( "ammo_9mmbox" ); //LRC
|
||||
UTIL_PrecacheOtherWeapon( "weapon_glock" );
|
||||
UTIL_PrecacheOther( "ammo_glock" );
|
||||
|
||||
// mp5
|
||||
UTIL_PrecacheOtherWeapon( "weapon_9mmAR" );
|
||||
UTIL_PrecacheOther( "ammo_9mmAR" );
|
||||
UTIL_PrecacheOther( "ammo_ARgrenades" );
|
||||
// mp5k
|
||||
UTIL_PrecacheOtherWeapon( "weapon_mp5k" );
|
||||
UTIL_PrecacheOther( "ammo_mp5k" );
|
||||
|
||||
#if !defined( OEM_BUILD ) && !defined( HLDEMO_BUILD )
|
||||
// python
|
||||
UTIL_PrecacheOtherWeapon( "weapon_357" );
|
||||
UTIL_PrecacheOther( "ammo_357" );
|
||||
// revolver
|
||||
UTIL_PrecacheOtherWeapon( "weapon_revolver" );
|
||||
UTIL_PrecacheOther( "ammo_revolver" );
|
||||
|
||||
// gauss
|
||||
UTIL_PrecacheOtherWeapon( "weapon_gauss" );
|
||||
UTIL_PrecacheOther( "ammo_gaussclip" );
|
||||
// p228
|
||||
UTIL_PrecacheOtherWeapon( "weapon_P228" );
|
||||
UTIL_PrecacheOther( "ammo_P228" );
|
||||
|
||||
// rpg
|
||||
UTIL_PrecacheOtherWeapon( "weapon_rpg" );
|
||||
UTIL_PrecacheOther( "ammo_rpgclip" );
|
||||
// uzi
|
||||
UTIL_PrecacheOtherWeapon( "weapon_uzi" );
|
||||
UTIL_PrecacheOther( "ammo_uzi" );
|
||||
|
||||
// crossbow
|
||||
UTIL_PrecacheOtherWeapon( "weapon_crossbow" );
|
||||
UTIL_PrecacheOther( "ammo_crossbow" );
|
||||
// beretta
|
||||
UTIL_PrecacheOtherWeapon( "weapon_beretta" );
|
||||
UTIL_PrecacheOther( "ammo_beretta" );
|
||||
|
||||
// egon
|
||||
UTIL_PrecacheOtherWeapon( "weapon_egon" );
|
||||
#endif
|
||||
// tripmine
|
||||
UTIL_PrecacheOtherWeapon( "weapon_tripmine" );
|
||||
#if !defined( OEM_BUILD ) && !defined( HLDEMO_BUILD )
|
||||
// satchel charge
|
||||
UTIL_PrecacheOtherWeapon( "weapon_satchel" );
|
||||
#endif
|
||||
// hand grenade
|
||||
UTIL_PrecacheOtherWeapon("weapon_handgrenade");
|
||||
#if !defined( OEM_BUILD ) && !defined( HLDEMO_BUILD )
|
||||
// squeak grenade
|
||||
UTIL_PrecacheOtherWeapon( "weapon_snark" );
|
||||
// desert eagle
|
||||
UTIL_PrecacheOtherWeapon( "weapon_deagle" );
|
||||
UTIL_PrecacheOther( "ammo_deagle" );
|
||||
|
||||
// hornetgun
|
||||
UTIL_PrecacheOtherWeapon( "weapon_hornetgun" );
|
||||
// gmgeneral
|
||||
UTIL_PrecacheOtherWeapon( "weapon_gmgeneral" );
|
||||
UTIL_PrecacheOther( "ammo_gmgeneral" );
|
||||
|
||||
if( g_pGameRules->IsDeathmatch() )
|
||||
{
|
||||
UTIL_PrecacheOther( "weaponbox" );// container for dropped deathmatch weapons
|
||||
}
|
||||
#endif
|
||||
UTIL_PrecacheOther( "weaponbox" );// container for dropped deathmatch weapons
|
||||
|
||||
g_sModelIndexLightning = PRECACHE_MODEL( "sprites/lgtning.spr" );// lightning
|
||||
g_sModelIndexFireball = PRECACHE_MODEL( "sprites/zerogxplode.spr" );// fireball
|
||||
g_sModelIndexWExplosion = PRECACHE_MODEL( "sprites/WXplo1.spr" );// underwater fireball
|
||||
g_sModelIndexSmoke = PRECACHE_MODEL( "sprites/steam1.spr" );// smoke
|
||||
|
@ -563,6 +559,24 @@ void CBasePlayerItem::DefaultTouch( CBaseEntity *pOther )
|
|||
|
||||
CBasePlayer *pPlayer = (CBasePlayer *)pOther;
|
||||
|
||||
if( !( pPlayer->m_afButtonPressed & IN_USE ))
|
||||
return;
|
||||
|
||||
for( int i = 0; i < MAX_ITEM_TYPES; i++ )
|
||||
{
|
||||
if( !pPlayer->m_rgpPlayerItems[i] )
|
||||
continue;
|
||||
|
||||
if( FStrEq( STRING( pPlayer->m_rgpPlayerItems[i]->pev->classname ), STRING( pev->classname ) ) )
|
||||
break;
|
||||
|
||||
if( pPlayer->m_rgpPlayerItems[i]->iItemSlot() == iItemSlot() )
|
||||
{
|
||||
pPlayer->DropPlayerItem( STRING( pPlayer->m_rgpPlayerItems[i]->pev->classname ) );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// can I have this?
|
||||
if( !g_pGameRules->CanHavePlayerItem( pPlayer, this ) )
|
||||
{
|
||||
|
@ -919,31 +933,6 @@ BOOL CBasePlayerWeapon::IsUseable( void )
|
|||
|
||||
BOOL CBasePlayerWeapon::CanDeploy( void )
|
||||
{
|
||||
BOOL bHasAmmo = 0;
|
||||
|
||||
if( !pszAmmo1() )
|
||||
{
|
||||
// this weapon doesn't use ammo, can always deploy.
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if( pszAmmo1() )
|
||||
{
|
||||
bHasAmmo |= ( m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] != 0 );
|
||||
}
|
||||
if( pszAmmo2() )
|
||||
{
|
||||
bHasAmmo |= ( m_pPlayer->m_rgAmmo[m_iSecondaryAmmoType] != 0 );
|
||||
}
|
||||
if( m_iClip > 0 )
|
||||
{
|
||||
bHasAmmo |= 1;
|
||||
}
|
||||
if( !bHasAmmo )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -1067,6 +1056,11 @@ void CBasePlayerAmmo::DefaultTouch( CBaseEntity *pOther )
|
|||
return;
|
||||
}
|
||||
|
||||
CBasePlayer *pPlayer = (CBasePlayer *)pOther;
|
||||
|
||||
if( !( pPlayer->m_afButtonPressed & IN_USE ) )
|
||||
return;
|
||||
|
||||
if( AddAmmo( pOther ) )
|
||||
{
|
||||
if( g_pGameRules->AmmoShouldRespawn( this ) == GR_AMMO_RESPAWN_YES )
|
||||
|
@ -1347,6 +1341,24 @@ void CWeaponBox::Touch( CBaseEntity *pOther )
|
|||
CBasePlayer *pPlayer = (CBasePlayer *)pOther;
|
||||
int i;
|
||||
|
||||
if( !( pPlayer->m_afButtonPressed & IN_USE ) )
|
||||
return;
|
||||
|
||||
for( i = 0; i < MAX_ITEM_TYPES; i++ )
|
||||
{
|
||||
if( !pPlayer->m_rgpPlayerItems[i] )
|
||||
continue;
|
||||
|
||||
if( m_rgpPlayerItems[pPlayer->m_rgpPlayerItems[i]->iItemSlot()] )
|
||||
{
|
||||
if( FStrEq( STRING( pPlayer->m_rgpPlayerItems[i]->pev->classname ), STRING( m_rgpPlayerItems[pPlayer->m_rgpPlayerItems[i]->iItemSlot()]->pev->classname ) ) )
|
||||
break;
|
||||
|
||||
pPlayer->DropPlayerItem( STRING( pPlayer->m_rgpPlayerItems[i]->pev->classname ) );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// dole out ammo
|
||||
for( i = 0; i < MAX_AMMO_SLOTS; i++ )
|
||||
{
|
||||
|
@ -1607,22 +1619,6 @@ void CBasePlayerWeapon::PrintState( void )
|
|||
ALERT( at_console, "m_iclip: %i\n", m_iClip );
|
||||
}
|
||||
|
||||
TYPEDESCRIPTION CRpg::m_SaveData[] =
|
||||
{
|
||||
DEFINE_FIELD( CRpg, m_fSpotActive, FIELD_INTEGER ),
|
||||
DEFINE_FIELD( CRpg, m_cActiveRockets, FIELD_INTEGER ),
|
||||
};
|
||||
|
||||
IMPLEMENT_SAVERESTORE( CRpg, CBasePlayerWeapon )
|
||||
|
||||
TYPEDESCRIPTION CRpgRocket::m_SaveData[] =
|
||||
{
|
||||
DEFINE_FIELD( CRpgRocket, m_flIgniteTime, FIELD_TIME ),
|
||||
DEFINE_FIELD( CRpgRocket, m_hLauncher, FIELD_EHANDLE ),
|
||||
};
|
||||
|
||||
IMPLEMENT_SAVERESTORE( CRpgRocket, CGrenade )
|
||||
|
||||
TYPEDESCRIPTION CShotgun::m_SaveData[] =
|
||||
{
|
||||
DEFINE_FIELD( CShotgun, m_flNextReload, FIELD_TIME ),
|
||||
|
@ -1633,42 +1629,3 @@ TYPEDESCRIPTION CShotgun::m_SaveData[] =
|
|||
};
|
||||
|
||||
IMPLEMENT_SAVERESTORE( CShotgun, CBasePlayerWeapon )
|
||||
|
||||
TYPEDESCRIPTION CGauss::m_SaveData[] =
|
||||
{
|
||||
DEFINE_FIELD( CGauss, m_fInAttack, FIELD_INTEGER ),
|
||||
//DEFINE_FIELD( CGauss, m_flStartCharge, FIELD_TIME ),
|
||||
//DEFINE_FIELD( CGauss, m_flPlayAftershock, FIELD_TIME ),
|
||||
//DEFINE_FIELD( CGauss, m_flNextAmmoBurn, FIELD_TIME ),
|
||||
DEFINE_FIELD( CGauss, m_fPrimaryFire, FIELD_BOOLEAN ),
|
||||
};
|
||||
|
||||
IMPLEMENT_SAVERESTORE( CGauss, CBasePlayerWeapon )
|
||||
|
||||
TYPEDESCRIPTION CEgon::m_SaveData[] =
|
||||
{
|
||||
//DEFINE_FIELD( CEgon, m_pBeam, FIELD_CLASSPTR ),
|
||||
//DEFINE_FIELD( CEgon, m_pNoise, FIELD_CLASSPTR ),
|
||||
//DEFINE_FIELD( CEgon, m_pSprite, FIELD_CLASSPTR ),
|
||||
DEFINE_FIELD( CEgon, m_shootTime, FIELD_TIME ),
|
||||
DEFINE_FIELD( CEgon, m_fireState, FIELD_INTEGER ),
|
||||
DEFINE_FIELD( CEgon, m_fireMode, FIELD_INTEGER ),
|
||||
DEFINE_FIELD( CEgon, m_shakeTime, FIELD_TIME ),
|
||||
DEFINE_FIELD( CEgon, m_flAmmoUseTime, FIELD_TIME ),
|
||||
};
|
||||
|
||||
IMPLEMENT_SAVERESTORE( CEgon, CBasePlayerWeapon )
|
||||
|
||||
TYPEDESCRIPTION CHgun::m_SaveData[] =
|
||||
{
|
||||
DEFINE_FIELD( CHgun, m_flRechargeTime, FIELD_FLOAT ),
|
||||
};
|
||||
|
||||
IMPLEMENT_SAVERESTORE( CHgun, CBasePlayerWeapon )
|
||||
|
||||
TYPEDESCRIPTION CSatchel::m_SaveData[] =
|
||||
{
|
||||
DEFINE_FIELD( CSatchel, m_chargeReady, FIELD_INTEGER ),
|
||||
};
|
||||
|
||||
IMPLEMENT_SAVERESTORE( CSatchel, CBasePlayerWeapon )
|
||||
|
|
828
dlls/weapons.h
828
dlls/weapons.h
|
@ -63,108 +63,93 @@ public:
|
|||
#define ITEM_BATTERY 4
|
||||
|
||||
#define WEAPON_NONE 0
|
||||
#define WEAPON_CROWBAR 1
|
||||
#define WEAPON_GLOCK 2
|
||||
#define WEAPON_PYTHON 3
|
||||
#define WEAPON_MP5 4
|
||||
#define WEAPON_CHAINGUN 5
|
||||
#define WEAPON_CROSSBOW 6
|
||||
#define WEAPON_SHOTGUN 7
|
||||
#define WEAPON_RPG 8
|
||||
#define WEAPON_GAUSS 9
|
||||
#define WEAPON_EGON 10
|
||||
#define WEAPON_HORNETGUN 11
|
||||
#define WEAPON_HANDGRENADE 12
|
||||
#define WEAPON_TRIPMINE 13
|
||||
#define WEAPON_SATCHEL 14
|
||||
#define WEAPON_SNARK 15
|
||||
#define WEAPON_SHOTGUN 7
|
||||
#define WEAPON_BERETTA 16
|
||||
#define WEAPON_GLOCK 17
|
||||
#define WEAPON_P228 18
|
||||
#define WEAPON_DEAGLE 19
|
||||
#define WEAPON_REVOLVER 20
|
||||
#define WEAPON_MP5K 21
|
||||
#define WEAPON_UZI 22
|
||||
#define WEAPON_KNIFE 23
|
||||
#define WEAPON_AXE 24
|
||||
#define WEAPON_HAMMER 25
|
||||
#define WEAPON_SPEAR 26
|
||||
#define WEAPON_GMGENERAL 27
|
||||
|
||||
#define WEAPON_ALLWEAPONS (~(1<<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
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue