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