/*** * * Copyright (c) 1996-2001, 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 #define DLLEXPORT __declspec( dllexport ) int g_demosniper = 0; int g_demosniperdamage = 0; float g_demosniperorg[3]; float g_demosniperangles[3]; float g_demozoom; // FIXME: There should be buffer helper functions to avoid all of the *(int *)& crap. extern "C" { void DLLEXPORT Demo_ReadBuffer( int size, unsigned char *buffer ); } /* ===================== Demo_WriteBuffer Write some data to the demo stream ===================== */ void Demo_WriteBuffer( int type, int size, unsigned char *buffer ) { int pos = 0; unsigned char buf[ 32 * 1024 ]; *( int * )&buf[pos] = type; pos+=sizeof( int ); memcpy( &buf[pos], buffer, size ); // Write full buffer out gEngfuncs.pDemoAPI->WriteBuffer( size + sizeof( int ), buf ); } /* ===================== Demo_ReadBuffer Engine wants us to parse some data from the demo stream ===================== */ void DLLEXPORT Demo_ReadBuffer( int size, unsigned char *buffer ) { int type; int i = 0; type = *( int * )buffer; i += sizeof( int ); switch ( type ) { case TYPE_SNIPERDOT: g_demosniper = *(int * )&buffer[ i ]; i += sizeof( int ); if ( g_demosniper ) { g_demosniperdamage = *( int * )&buffer[ i ]; i += sizeof( int ); g_demosniperangles[ 0 ] = *(float *)&buffer[i]; i += sizeof( float ); g_demosniperangles[ 1 ] = *(float *)&buffer[i]; i += sizeof( float ); g_demosniperangles[ 2 ] = *(float *)&buffer[i]; i += sizeof( float ); g_demosniperorg[ 0 ] = *(float *)&buffer[i]; i += sizeof( float ); g_demosniperorg[ 1 ] = *(float *)&buffer[i]; i += sizeof( float ); g_demosniperorg[ 2 ] = *(float *)&buffer[i]; i += sizeof( float ); } break; case TYPE_ZOOM: g_demozoom = *(float * )&buffer[ i ]; i += sizeof( float ); break; default: gEngfuncs.Con_DPrintf( "Unknown demo buffer type, skipping.\n" ); break; } }