207 lines
4.4 KiB
C++
207 lines
4.4 KiB
C++
/***
|
|
*
|
|
* 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.
|
|
*
|
|
****/
|
|
// shared event functions
|
|
#include "hud.h"
|
|
#include "cl_util.h"
|
|
#include "const.h"
|
|
#include "entity_state.h"
|
|
#include "cl_entity.h"
|
|
|
|
#include "r_efx.h"
|
|
|
|
#include "eventscripts.h"
|
|
#include "event_api.h"
|
|
#include "pm_shared.h"
|
|
|
|
#define IS_FIRSTPERSON_SPEC ( g_iUser1 == OBS_IN_EYE || (g_iUser1 && (gHUD.m_Spectator.m_pip->value == INSET_IN_EYE)) )
|
|
/*
|
|
=================
|
|
GetEntity
|
|
|
|
Return's the requested cl_entity_t
|
|
=================
|
|
*/
|
|
struct cl_entity_s *GetEntity( int idx )
|
|
{
|
|
return gEngfuncs.GetEntityByIndex( idx );
|
|
}
|
|
|
|
/*
|
|
=================
|
|
GetViewEntity
|
|
|
|
Return's the current weapon/view model
|
|
=================
|
|
*/
|
|
struct cl_entity_s *GetViewEntity( void )
|
|
{
|
|
return gEngfuncs.GetViewModel();
|
|
}
|
|
|
|
/*
|
|
=================
|
|
EV_CreateTracer
|
|
|
|
Creates a tracer effect
|
|
=================
|
|
*/
|
|
void EV_CreateTracer( float *start, float *end )
|
|
{
|
|
gEngfuncs.pEfxAPI->R_TracerEffect( start, end );
|
|
}
|
|
|
|
/*
|
|
=================
|
|
EV_IsPlayer
|
|
|
|
Is the entity's index in the player range?
|
|
=================
|
|
*/
|
|
qboolean EV_IsPlayer( int idx )
|
|
{
|
|
if ( idx >= 1 && idx <= gEngfuncs.GetMaxClients() )
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
=================
|
|
EV_IsLocal
|
|
|
|
Is the entity == the local player
|
|
=================
|
|
*/
|
|
qboolean EV_IsLocal( int idx )
|
|
{
|
|
// check if we are in some way in first person spec mode
|
|
if ( IS_FIRSTPERSON_SPEC )
|
|
return (g_iUser2 == idx);
|
|
else
|
|
return gEngfuncs.pEventAPI->EV_IsLocal( idx - 1 ) ? true : false;
|
|
}
|
|
|
|
/*
|
|
=================
|
|
EV_GetGunPosition
|
|
|
|
Figure out the height of the gun
|
|
=================
|
|
*/
|
|
void EV_GetGunPosition( event_args_t *args, float *pos, float *origin )
|
|
{
|
|
int idx;
|
|
Vector view_ofs(0, 0, 0);
|
|
|
|
idx = args->entindex;
|
|
|
|
view_ofs[2] = DEFAULT_VIEWHEIGHT;
|
|
|
|
if ( EV_IsPlayer( idx ) )
|
|
{
|
|
// in spec mode use entity viewheigh, not own
|
|
if ( EV_IsLocal( idx ) && !IS_FIRSTPERSON_SPEC )
|
|
{
|
|
// Grab predicted result for local player
|
|
gEngfuncs.pEventAPI->EV_LocalPlayerViewheight( view_ofs );
|
|
}
|
|
else if ( args->ducking == 1 )
|
|
{
|
|
view_ofs[2] = VEC_DUCK_VIEW;
|
|
}
|
|
}
|
|
|
|
VectorAdd( origin, view_ofs, pos );
|
|
}
|
|
|
|
/*
|
|
=================
|
|
EV_EjectBrass
|
|
|
|
Bullet shell casings
|
|
=================
|
|
*/
|
|
void EV_EjectBrass( float *origin, float *velocity, float rotation, int model, int soundtype, int life )
|
|
{
|
|
vec3_t endpos;
|
|
VectorClear( endpos );
|
|
endpos[1] = rotation;
|
|
gEngfuncs.pEfxAPI->R_TempModel( origin, velocity, endpos, life, model, soundtype );
|
|
}
|
|
|
|
/*
|
|
=================
|
|
EV_GetDefaultShellInfo
|
|
|
|
Determine where to eject shells from
|
|
=================
|
|
*/
|
|
void EV_GetDefaultShellInfo( event_args_t *args, float *origin, float *velocity, float *ShellVelocity, float *ShellOrigin, float *forward, float *right, float *up, float forwardScale, float upScale, float rightScale, bool bReverseDirection )
|
|
{
|
|
int idx = args->entindex;
|
|
|
|
vec3_t view_ofs = { 0, 0, DEFAULT_VIEWHEIGHT };
|
|
if ( EV_IsPlayer( idx ) )
|
|
{
|
|
if ( EV_IsLocal( idx ) )
|
|
{
|
|
gEngfuncs.pEventAPI->EV_LocalPlayerViewheight( view_ofs );
|
|
}
|
|
else if ( args->ducking == 1 )
|
|
{
|
|
view_ofs[2] = VEC_DUCK_VIEW;
|
|
}
|
|
}
|
|
|
|
float fR = gEngfuncs.pfnRandomFloat( 50, 70 );
|
|
float fU = gEngfuncs.pfnRandomFloat( 75, 175 );
|
|
float fF = gEngfuncs.pfnRandomFloat( 25, 250 );
|
|
float fDirection = rightScale > 0.0f ? -1.0f : 1.0f;
|
|
|
|
for ( int i = 0; i < 3; i++ )
|
|
{
|
|
if( bReverseDirection )
|
|
{
|
|
ShellVelocity[i] = velocity[i] * 0.5f - right[i] * fR * fDirection + up[i] * fU + forward[i] * fF;
|
|
}
|
|
else
|
|
{
|
|
ShellVelocity[i] = velocity[i] * 0.5f + right[i] * fR * fDirection + up[i] * fU + forward[i] * fF;
|
|
}
|
|
ShellOrigin[i] = velocity[i] * 0.1f + origin[i] + view_ofs[i] +
|
|
upScale * up[i] + forwardScale * forward[i] + rightScale * right[i];
|
|
}
|
|
}
|
|
|
|
/*
|
|
=================
|
|
EV_MuzzleFlash
|
|
|
|
Flag weapon/view model for muzzle flash
|
|
=================
|
|
*/
|
|
void EV_MuzzleFlash( void )
|
|
{
|
|
// Add muzzle flash to current weapon model
|
|
cl_entity_t *ent = GetViewEntity();
|
|
if ( !ent )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Or in the muzzle flash
|
|
ent->curstate.effects |= EF_MUZZLEFLASH;
|
|
}
|