|
|
|
/***
|
|
|
|
*
|
|
|
|
* 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 "../hud.h"
|
|
|
|
#include "../cl_util.h"
|
|
|
|
#include "../demo.h"
|
|
|
|
|
|
|
|
#include "demo_api.h"
|
|
|
|
#include "const.h"
|
|
|
|
#include "entity_state.h"
|
|
|
|
#include "cl_entity.h"
|
|
|
|
|
|
|
|
#include "pm_defs.h"
|
|
|
|
#include "event_api.h"
|
|
|
|
#include "entity_types.h"
|
|
|
|
#include "r_efx.h"
|
|
|
|
|
|
|
|
extern BEAM *pBeam;
|
|
|
|
extern BEAM *pBeam2;
|
|
|
|
extern TEMPENTITY *pFlare; // Vit_amiN: egon's energy flare
|
|
|
|
void HUD_GetLastOrg( float *org );
|
|
|
|
|
|
|
|
void UpdateBeams( void )
|
|
|
|
{
|
|
|
|
vec3_t forward, vecSrc, vecEnd, origin, angles, right, up;
|
|
|
|
vec3_t view_ofs;
|
|
|
|
pmtrace_t tr;
|
|
|
|
cl_entity_t *pthisplayer = gEngfuncs.GetLocalPlayer();
|
|
|
|
int idx = pthisplayer->index;
|
|
|
|
|
|
|
|
// Get our exact viewangles from engine
|
|
|
|
gEngfuncs.GetViewAngles( (float *)angles );
|
|
|
|
|
|
|
|
// Determine our last predicted origin
|
|
|
|
HUD_GetLastOrg( (float *)&origin );
|
|
|
|
|
|
|
|
AngleVectors( angles, forward, right, up );
|
|
|
|
|
|
|
|
VectorCopy( origin, vecSrc );
|
|
|
|
|
|
|
|
VectorMA( vecSrc, 2048, forward, vecEnd );
|
|
|
|
|
|
|
|
gEngfuncs.pEventAPI->EV_SetUpPlayerPrediction( false, true );
|
|
|
|
|
|
|
|
// Store off the old count
|
|
|
|
gEngfuncs.pEventAPI->EV_PushPMStates();
|
|
|
|
|
|
|
|
// Now add in all of the players.
|
|
|
|
gEngfuncs.pEventAPI->EV_SetSolidPlayers( idx - 1 );
|
|
|
|
|
|
|
|
gEngfuncs.pEventAPI->EV_SetTraceHull( 2 );
|
|
|
|
gEngfuncs.pEventAPI->EV_PlayerTrace( vecSrc, vecEnd, PM_STUDIO_BOX, -1, &tr );
|
|
|
|
|
|
|
|
gEngfuncs.pEventAPI->EV_PopPMStates();
|
|
|
|
|
|
|
|
if( pBeam )
|
|
|
|
{
|
|
|
|
pBeam->target = tr.endpos;
|
|
|
|
pBeam->die = gEngfuncs.GetClientTime() + 0.1f; // 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.1f; // We keep it alive just a little bit forward in the future, just in case.
|
|
|
|
}
|
|
|
|
|
|
|
|
if( pFlare ) // Vit_amiN: beam flare
|
|
|
|
{
|
|
|
|
pFlare->entity.origin = tr.endpos;
|
|
|
|
pFlare->die = gEngfuncs.GetClientTime() + 0.1f; // We keep it alive just a little bit forward in the future, just in case.
|
|
|
|
|
|
|
|
if( gEngfuncs.GetMaxClients() != 1 ) // Singleplayer always draws the egon's energy beam flare
|
|
|
|
{
|
|
|
|
pFlare->flags |= FTENT_NOMODEL;
|
|
|
|
|
|
|
|
if( !( tr.allsolid || tr.ent <= 0 || tr.fraction == 1.0f ) ) // Beam hit some non-world entity
|
|
|
|
{
|
|
|
|
physent_t *pEntity = gEngfuncs.pEventAPI->EV_GetPhysent( tr.ent );
|
|
|
|
|
|
|
|
// Not the world, let's assume that we hit something organic ( dog, cat, uncle joe, etc )
|
|
|
|
if( pEntity && !( pEntity->solid == SOLID_BSP || pEntity->movetype == MOVETYPE_PUSHSTEP ) )
|
|
|
|
{
|
|
|
|
pFlare->flags &= ~FTENT_NOMODEL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
=====================
|
|
|
|
Game_AddObjects
|
|
|
|
|
|
|
|
Add game specific, client-side objects here
|
|
|
|
=====================
|
|
|
|
*/
|
|
|
|
void Game_AddObjects( void )
|
|
|
|
{
|
|
|
|
if( pBeam || pBeam2 || pFlare ) // Vit_amiN: egon flare added
|
|
|
|
UpdateBeams();
|
|
|
|
}
|