123 lines
4.0 KiB
C++
123 lines
4.0 KiB
C++
|
//======= Copyright (c) 1996-2009, Valve Corporation, All rights reserved. ======
|
||
|
//
|
||
|
// Implementation of the CGameEventTransmitter class.
|
||
|
//
|
||
|
//
|
||
|
//===============================================================================
|
||
|
|
||
|
|
||
|
#include <tier0/vprof.h>
|
||
|
#include "gameeventtransmitter.h"
|
||
|
#include "net.h"
|
||
|
#include "tier1/convar.h"
|
||
|
#include "GameEventManager.h"
|
||
|
#include "tier0/icommandline.h"
|
||
|
|
||
|
// memdbgon must be the last include file in a .cpp file!!!
|
||
|
#include "tier0/memdbgon.h"
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
// Construction/Destruction
|
||
|
//////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
static CGameEventTransmitter s_GameEventTransmitter;
|
||
|
CGameEventTransmitter &g_GameEventTransmitter = s_GameEventTransmitter;
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Convar function to set the IP address and port.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CC_TransmitEvents( const CCommand &args )
|
||
|
{
|
||
|
if ( !g_GameEventTransmitter.SetIPAndPort( args.ArgS() ) )
|
||
|
{
|
||
|
if ( args.ArgC() > 1 )
|
||
|
{
|
||
|
Msg("Invalid address or port: %s\n", args.ArgS() );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Msg("No address and port passed in.\n" );
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Msg("SUCCESS! address and port is now set to: %s\n", args.ArgS() );
|
||
|
}
|
||
|
}
|
||
|
static ConCommand TransmitEvents( "TransmitEvents", CC_TransmitEvents, "Transmits Game Events to <address:port>", FCVAR_DEVELOPMENTONLY );
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Initializes the network address based on IP and port
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CGameEventTransmitter::SetIPAndPort( const char *address )
|
||
|
{
|
||
|
m_Adr.SetFromString( address );
|
||
|
return m_Adr.IsValid();
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Constructor
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CGameEventTransmitter::CGameEventTransmitter()
|
||
|
{
|
||
|
m_Adr.Clear();
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Destructor
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CGameEventTransmitter::~CGameEventTransmitter()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Used to be able to set the IP address and port from the command line.
|
||
|
// This will be the primary way to initialize the system, so that uses
|
||
|
// won't have to enter the address/port during game play.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CGameEventTransmitter::Init()
|
||
|
{
|
||
|
const char *address = CommandLine()->ParmValue( "-transmitevents", "" );
|
||
|
|
||
|
if ( address[0] )
|
||
|
{
|
||
|
SetIPAndPort( address );
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// This function actually serializes the event data and sends it out on the network
|
||
|
// to the address and port previously provided.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CGameEventTransmitter::TransmitGameEvent( IGameEvent *event )
|
||
|
{
|
||
|
// Don't bother doing anything if we don't have a transmit address, bad event, or a non-networked event
|
||
|
if ( !m_Adr.IsValid() || NULL == event || ( event && event->IsLocal() ) )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
CSVCMsg_GameEvent_t eventData;
|
||
|
|
||
|
// We send the event name instead of event ID becase the ID's can change depending on what the server sends to the clients
|
||
|
eventData.set_event_name( event->GetName() );
|
||
|
|
||
|
// create bitstream from KeyValues
|
||
|
if ( g_GameEventManager.SerializeEvent( event, &eventData ) )
|
||
|
{
|
||
|
bf_write buffer;
|
||
|
unsigned char buffer_data[MAX_EVENT_BYTES];
|
||
|
|
||
|
buffer.StartWriting( buffer_data, sizeof(buffer_data) );
|
||
|
|
||
|
eventData.WriteToBuffer( buffer );
|
||
|
|
||
|
NET_SendPacket( NULL, NS_CLIENT, m_Adr, buffer_data, buffer.GetNumBytesWritten() );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DevMsg("GameEventTransmitter: failed to serialize event '%s'.\n", event->GetName() );
|
||
|
}
|
||
|
}
|