|
From: <ha...@us...> - 2003-03-30 07:52:19
|
Update of /cvsroot/decaldev/source/DecalFilters
In directory sc8-pr-cvs1:/tmp/cvs-serv9623
Added Files:
IdentifyQueue.cpp IdentifyQueue.h IdentifyQueue.rgs
Log Message:
ID Filter! yay! (probably tons of bugs still, but it made 6s work again reliably in my testing)
--- NEW FILE: IdentifyQueue.cpp ---
// IdentifyQueue.cpp : Implementation of CIdentifyQueue
#include "stdafx.h"
#include "IdentifyQueue.h"
// Timeout in millisec to re-request ID
#define TIMEOUT 700
enum AcMessages
{
msgGameEvent = 0xF7B0,
msgUnknown = 0
};
enum AcGameEvents
{
gevIDItem = 0x00C9,
gevUnknown = 0
};
// CIdentifyQueue
HRESULT CIdentifyQueue::onInitialize()
{
if( m_pService->get_Decal( &m_pDecal ) == S_OK )
{
if( m_pDecal->get_Hooks( &m_pHooks ) == S_OK )
{
m_pHooks->SetIDFilter( this );
}
}
return S_OK;
}
HRESULT CIdentifyQueue::onTerminate()
{
m_pDecal.Release();
m_pHooks.Release();
return S_OK;
}
STDMETHODIMP CIdentifyQueue::DispatchServer( IMessage2 *pMsg )
{
long lType;
pMsg->get_Type( &lType );
CComPtr< IMessageIterator > pMembers;
pMsg->get_Begin( &pMembers );
switch( lType )
{
case msgGameEvent: DoGameEvent( pMembers ); break;
}
// Check for timeout...
if( m_bWaiting )
{
IDStruct* &Front = m_Queue.front();
if( abs( Front->lTime - timeGetTime() ) > TIMEOUT )
{
if( ++m_lAttempts >= 3 )
{
m_lAttempts = 0;
m_Queue.erase( m_Queue.begin() );
m_bWaiting = false;
Request();
}
else
{
Front->lTime = timeGetTime();
m_bWaiting = false;
Request();
}
}
}
return S_OK;
}
STDMETHODIMP CIdentifyQueue::AddToQueue( long lObjectID )
{
#ifdef _DEBUG
char szOut[2048]; memset( szOut, 0, sizeof( szOut ) );
_snprintf( szOut, sizeof( szOut ), "IDF: Added 0x%8X to Queue!", lObjectID );
m_pHooks->ChatOut( _bstr_t( szOut ), 7 );
#endif
if( m_Queue.size() > 0 )
{
IDStruct* &Back = m_Queue.back();
if( Back->lObjectID == lObjectID )
return S_OK;
else
{
IDStruct *QueueObj = new IDStruct();
QueueObj->lObjectID = lObjectID;
QueueObj->lTime = timeGetTime();
m_Queue.push_back( QueueObj );
}
}
else
{
IDStruct *QueueObj = new IDStruct();
QueueObj->lObjectID = lObjectID;
QueueObj->lTime = timeGetTime();
m_Queue.push_back( QueueObj );
}
if( !m_bWaiting )
Request();
return S_OK;
}
void CIdentifyQueue::DoGameEvent( IMessageIterator *pMembers )
{
long lEvent;
pMembers->get_NextInt( _bstr_t( "event" ), &lEvent );
switch( lEvent )
{
case gevIDItem: DoIDItem( pMembers ); break;
}
}
void CIdentifyQueue::DoIDItem( IMessageIterator *pMembers )
{
long lObjectID;
pMembers->get_NextInt( _bstr_t( "object" ), &lObjectID );
IDStruct* &Front = m_Queue.front();
if( lObjectID == Front->lObjectID )
{
#ifdef _DEBUG
char szOut[2048]; memset( szOut, 0, sizeof( szOut ) );
_snprintf( szOut, sizeof( szOut ), "IDF: Deleting ID 0x%8X from Queue!", Front->lObjectID );
m_pHooks->ChatOut( _bstr_t( szOut ), 7 );
#endif
m_lAttempts = 0;
m_Queue.erase( m_Queue.begin() );
}
if( m_bWaiting )
{
m_bWaiting = false;
Request();
}
}
void CIdentifyQueue::Request()
{
if( !m_bWaiting )
{
if( m_Queue.size() > 0 )
{
IDStruct* &Front = m_Queue.front();
#ifdef _DEBUG
char szOut[2048]; memset( szOut, 0, sizeof( szOut ) );
_snprintf( szOut, sizeof( szOut ), "IDF: Requested ID for 0x%8X!", Front->lObjectID );
m_pHooks->ChatOut( _bstr_t( szOut ), 7 );
#endif
m_pHooks->RequestID( Front->lObjectID );
m_bWaiting = true;
if( Front->lObjectID == 0 )
{
m_bWaiting = false;
m_Queue.erase( m_Queue.begin() );
Request();
}
}
}
}
--- NEW FILE: IdentifyQueue.h ---
// IdentifyQueue.h : Declaration of the CIdentifyQueue
#ifndef __IDQUEUE_H_
#define __IDQUEUE_H_
#pragma once
#include "resource.h" // main symbols
#include "DecalFilters.h"
#include "DecalNetImpl.h"
#include "..\include\decal.h"
#include <deque>
struct IDStruct
{
long lObjectID;
long lTime;
};
// CIdentifyQueue
class ATL_NO_VTABLE CIdentifyQueue :
public IKitchenSink,
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CIdentifyQueue, &CLSID_IdentifyQueue>,
public IDispatchImpl<IIdentifyQueue, &IID_IIdentifyQueue, &LIBID_DecalFilters, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public INetworkFilterImpl<CIdentifyQueue>
{
public:
CIdentifyQueue()
{
m_bWaiting = false;
m_lAttempts = 0;
}
DECLARE_REGISTRY_RESOURCEID(IDR_IDENTIFYQUEUE)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CIdentifyQueue)
COM_INTERFACE_ENTRY(IIdentifyQueue)
COM_INTERFACE_ENTRY(INetworkFilter2)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
private:
CComPtr< IDecal > m_pDecal;
CComPtr< IACHooks > m_pHooks;
std::deque< IDStruct* > m_Queue;
bool m_bWaiting;
long m_lAttempts;
void DoGameEvent( IMessageIterator *pMembers );
void DoIDItem( IMessageIterator *pMembers );
void Request();
public:
// INetworkFilterImpl
HRESULT onInitialize();
HRESULT onTerminate();
// INetworkFilter
STDMETHOD(DispatchServer)( IMessage2 *pMsg );
// IKitchenSink
STDMETHOD(AddToQueue)( long lObjectID );
};
#endif //__IDQUEUE_H_
--- NEW FILE: IdentifyQueue.rgs ---
HKCR
{
DecalFilters.IdentifyQueue.1 = s 'IdentifyQueue Class'
{
CLSID = s '{B0C05A9A-273D-4BC4-B7BA-E27CF94C8EF4}'
}
DecalFilters.IdentifyQueue = s 'IdentifyQueue Class'
{
CLSID = s '{B0C05A9A-273D-4BC4-B7BA-E27CF94C8EF4}'
CurVer = s 'DecalFilters.IdentifyQueue.1'
}
NoRemove CLSID
{
ForceRemove {B0C05A9A-273D-4BC4-B7BA-E27CF94C8EF4} = s 'IdentifyQueue Class'
{
ProgID = s 'DecalFilters.IdentifyQueue.1'
VersionIndependentProgID = s 'DecalFilters.IdentifyQueue'
ForceRemove 'Programmable'
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
'TypeLib' = s '{DA16DAA9-7F16-45D9-A59F-8C45A7F2ACB1}'
}
}
}
HKLM
{
NoRemove SOFTWARE
{
NoRemove Decal
{
NoRemove NetworkFilters
{
ForceRemove {B0C05A9A-273D-4BC4-B7BA-E27CF94C8EF4} = s 'Identify Queue Filter'
{
val Enabled = d '1'
}
}
}
}
}
|