reorganized this a bit
--HG-- rename : core/CMsgListenerWrapper.h => core/smn_usermsgs.h extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40596
This commit is contained in:
parent
38c94838b9
commit
5228c86e2c
@ -1,144 +0,0 @@
|
|||||||
/**
|
|
||||||
* vim: set ts=4 :
|
|
||||||
* ===============================================================
|
|
||||||
* SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
|
|
||||||
* ===============================================================
|
|
||||||
*
|
|
||||||
* This file is not open source and may not be copied without explicit
|
|
||||||
* written permission of AlliedModders LLC. This file may not be redistributed
|
|
||||||
* in whole or significant part.
|
|
||||||
* For information, see LICENSE.txt or http://www.sourcemod.net/license.php
|
|
||||||
*
|
|
||||||
* Version: $Id$
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _INCLUDE_SOURCEMOD_CMSGLISTENERWRAPPER_H_
|
|
||||||
#define _INCLUDE_SOURCEMOD_CMSGLISTENERWRAPPER_H_
|
|
||||||
|
|
||||||
extern int g_MsgPlayers[256];
|
|
||||||
|
|
||||||
class MsgListenerWrapper : public IUserMessageListener
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void InitListener(int msgid, IPluginFunction *hook, IPluginFunction *notify, bool intercept);
|
|
||||||
bool IsInterceptHook() const;
|
|
||||||
int GetMessageId() const;
|
|
||||||
IPluginFunction *GetHookedFunction() const;
|
|
||||||
IPluginFunction *GetNotifyFunction() const;
|
|
||||||
public: //IUserMessageListener
|
|
||||||
void OnUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter);
|
|
||||||
ResultType InterceptUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter);
|
|
||||||
void OnUserMessageSent(int msg_id);
|
|
||||||
private:
|
|
||||||
size_t PreparePlArray(int *pl_array, IRecipientFilter *pFilter);
|
|
||||||
private:
|
|
||||||
IPluginFunction *m_Hook;
|
|
||||||
IPluginFunction *m_Intercept;
|
|
||||||
IPluginFunction *m_Notify;
|
|
||||||
bool m_IsInterceptHook;
|
|
||||||
int m_MsgId;
|
|
||||||
};
|
|
||||||
|
|
||||||
inline size_t MsgListenerWrapper::PreparePlArray(int *pl_array, IRecipientFilter *pFilter)
|
|
||||||
{
|
|
||||||
size_t size = static_cast<size_t>(pFilter->GetRecipientCount());
|
|
||||||
|
|
||||||
for (size_t i=0; i<size; i++)
|
|
||||||
{
|
|
||||||
pl_array[i] = pFilter->GetRecipientIndex(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool MsgListenerWrapper::IsInterceptHook() const
|
|
||||||
{
|
|
||||||
return m_IsInterceptHook;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline int MsgListenerWrapper::GetMessageId() const
|
|
||||||
{
|
|
||||||
return m_MsgId;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline IPluginFunction *MsgListenerWrapper::GetHookedFunction() const
|
|
||||||
{
|
|
||||||
if (m_Hook)
|
|
||||||
{
|
|
||||||
return m_Hook;
|
|
||||||
} else {
|
|
||||||
return m_Intercept;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline IPluginFunction *MsgListenerWrapper::GetNotifyFunction() const
|
|
||||||
{
|
|
||||||
return m_Notify;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void MsgListenerWrapper::InitListener(int msgid, IPluginFunction *hook, IPluginFunction *notify, bool intercept)
|
|
||||||
{
|
|
||||||
if (intercept)
|
|
||||||
{
|
|
||||||
m_Intercept = hook;
|
|
||||||
m_Hook = NULL;
|
|
||||||
} else {
|
|
||||||
m_Hook = hook;
|
|
||||||
m_Intercept = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (notify)
|
|
||||||
{
|
|
||||||
m_Notify = notify;
|
|
||||||
} else {
|
|
||||||
m_Notify = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_MsgId = msgid;
|
|
||||||
m_IsInterceptHook = intercept;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void MsgListenerWrapper::OnUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter)
|
|
||||||
{
|
|
||||||
cell_t res;
|
|
||||||
size_t size = PreparePlArray(g_MsgPlayers, pFilter);
|
|
||||||
|
|
||||||
m_Hook->PushCell(msg_id);
|
|
||||||
m_Hook->PushCell(0); //:TODO: push handle!
|
|
||||||
m_Hook->PushArray(g_MsgPlayers, size);
|
|
||||||
m_Hook->PushCell(size);
|
|
||||||
m_Hook->PushCell(pFilter->IsReliable());
|
|
||||||
m_Hook->PushCell(pFilter->IsInitMessage());
|
|
||||||
m_Hook->Execute(&res);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline ResultType MsgListenerWrapper::InterceptUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter)
|
|
||||||
{
|
|
||||||
cell_t res = static_cast<cell_t>(Pl_Continue);
|
|
||||||
size_t size = PreparePlArray(g_MsgPlayers, pFilter);
|
|
||||||
|
|
||||||
m_Intercept->PushCell(msg_id);
|
|
||||||
m_Intercept->PushCell(0); //:TODO: push handle!
|
|
||||||
m_Intercept->PushArray(g_MsgPlayers, size);
|
|
||||||
m_Intercept->PushCell(size);
|
|
||||||
m_Intercept->PushCell(pFilter->IsReliable());
|
|
||||||
m_Intercept->PushCell(pFilter->IsInitMessage());
|
|
||||||
m_Intercept->Execute(&res);
|
|
||||||
|
|
||||||
return static_cast<ResultType>(res);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void MsgListenerWrapper::OnUserMessageSent(int msg_id)
|
|
||||||
{
|
|
||||||
cell_t res;
|
|
||||||
|
|
||||||
if (!m_Notify)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_Notify->PushCell(msg_id);
|
|
||||||
m_Notify->Execute(&res);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif //_INCLUDE_SOURCEMOD_CMSGLISTENERWRAPPER_H_
|
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
<VisualStudioProject
|
<VisualStudioProject
|
||||||
ProjectType="Visual C++"
|
ProjectType="Visual C++"
|
||||||
Version="8,00"
|
Version="8.00"
|
||||||
Name="sourcemod_mm"
|
Name="sourcemod_mm"
|
||||||
ProjectGUID="{E39527CD-7CAB-4420-97CC-DA1B93B260BC}"
|
ProjectGUID="{E39527CD-7CAB-4420-97CC-DA1B93B260BC}"
|
||||||
RootNamespace="sourcemod_mm"
|
RootNamespace="sourcemod_mm"
|
||||||
@ -297,10 +297,6 @@
|
|||||||
RelativePath="..\CLogger.h"
|
RelativePath="..\CLogger.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
<File
|
|
||||||
RelativePath="..\CMsgListenerWrapper.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
<File
|
||||||
RelativePath="..\ConCmdManager.h"
|
RelativePath="..\ConCmdManager.h"
|
||||||
>
|
>
|
||||||
@ -365,6 +361,10 @@
|
|||||||
RelativePath="..\sm_version.h"
|
RelativePath="..\sm_version.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\smn_usermsgs.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\sourcemm_api.h"
|
RelativePath="..\sourcemm_api.h"
|
||||||
>
|
>
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#include "HandleSys.h"
|
#include "HandleSys.h"
|
||||||
#include "PluginSys.h"
|
#include "PluginSys.h"
|
||||||
#include "CUserMessages.h"
|
#include "CUserMessages.h"
|
||||||
#include "CMsgListenerWrapper.h"
|
#include "smn_usermsgs.h"
|
||||||
|
|
||||||
HandleType_t g_WrBitBufType;
|
HandleType_t g_WrBitBufType;
|
||||||
Handle_t g_CurMsgHandle;
|
Handle_t g_CurMsgHandle;
|
||||||
@ -149,11 +149,119 @@ bool UsrMessageNatives::RemoveListener(IPluginContext *pCtx, MsgListenerWrapper
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************
|
/***************************************
|
||||||
* *
|
* *
|
||||||
* USER MESSAGE NATIVE IMPLEMENTATIONS *
|
* USER MESSAGE WRAPPER IMPLEMENTATION *
|
||||||
* *
|
* *
|
||||||
***************************************/
|
***************************************/
|
||||||
|
|
||||||
|
size_t MsgListenerWrapper::PreparePlArray(int *pl_array, IRecipientFilter *pFilter)
|
||||||
|
{
|
||||||
|
size_t size = static_cast<size_t>(pFilter->GetRecipientCount());
|
||||||
|
|
||||||
|
for (size_t i=0; i<size; i++)
|
||||||
|
{
|
||||||
|
pl_array[i] = pFilter->GetRecipientIndex(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MsgListenerWrapper::IsInterceptHook() const
|
||||||
|
{
|
||||||
|
return m_IsInterceptHook;
|
||||||
|
}
|
||||||
|
|
||||||
|
int MsgListenerWrapper::GetMessageId() const
|
||||||
|
{
|
||||||
|
return m_MsgId;
|
||||||
|
}
|
||||||
|
|
||||||
|
IPluginFunction *MsgListenerWrapper::GetHookedFunction() const
|
||||||
|
{
|
||||||
|
if (m_Hook)
|
||||||
|
{
|
||||||
|
return m_Hook;
|
||||||
|
} else {
|
||||||
|
return m_Intercept;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IPluginFunction *MsgListenerWrapper::GetNotifyFunction() const
|
||||||
|
{
|
||||||
|
return m_Notify;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MsgListenerWrapper::InitListener(int msgid, IPluginFunction *hook, IPluginFunction *notify, bool intercept)
|
||||||
|
{
|
||||||
|
if (intercept)
|
||||||
|
{
|
||||||
|
m_Intercept = hook;
|
||||||
|
m_Hook = NULL;
|
||||||
|
} else {
|
||||||
|
m_Hook = hook;
|
||||||
|
m_Intercept = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (notify)
|
||||||
|
{
|
||||||
|
m_Notify = notify;
|
||||||
|
} else {
|
||||||
|
m_Notify = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_MsgId = msgid;
|
||||||
|
m_IsInterceptHook = intercept;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MsgListenerWrapper::OnUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter)
|
||||||
|
{
|
||||||
|
cell_t res;
|
||||||
|
size_t size = PreparePlArray(g_MsgPlayers, pFilter);
|
||||||
|
|
||||||
|
m_Hook->PushCell(msg_id);
|
||||||
|
m_Hook->PushCell(0); //:TODO: push handle!
|
||||||
|
m_Hook->PushArray(g_MsgPlayers, size);
|
||||||
|
m_Hook->PushCell(size);
|
||||||
|
m_Hook->PushCell(pFilter->IsReliable());
|
||||||
|
m_Hook->PushCell(pFilter->IsInitMessage());
|
||||||
|
m_Hook->Execute(&res);
|
||||||
|
}
|
||||||
|
|
||||||
|
ResultType MsgListenerWrapper::InterceptUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter)
|
||||||
|
{
|
||||||
|
cell_t res = static_cast<cell_t>(Pl_Continue);
|
||||||
|
size_t size = PreparePlArray(g_MsgPlayers, pFilter);
|
||||||
|
|
||||||
|
m_Intercept->PushCell(msg_id);
|
||||||
|
m_Intercept->PushCell(0); //:TODO: push handle!
|
||||||
|
m_Intercept->PushArray(g_MsgPlayers, size);
|
||||||
|
m_Intercept->PushCell(size);
|
||||||
|
m_Intercept->PushCell(pFilter->IsReliable());
|
||||||
|
m_Intercept->PushCell(pFilter->IsInitMessage());
|
||||||
|
m_Intercept->Execute(&res);
|
||||||
|
|
||||||
|
return static_cast<ResultType>(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MsgListenerWrapper::OnUserMessageSent(int msg_id)
|
||||||
|
{
|
||||||
|
cell_t res;
|
||||||
|
|
||||||
|
if (!m_Notify)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_Notify->PushCell(msg_id);
|
||||||
|
m_Notify->Execute(&res);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************
|
||||||
|
* *
|
||||||
|
* USER MESSAGE NATIVE IMPLEMENTATIONS *
|
||||||
|
* *
|
||||||
|
***************************************/
|
||||||
|
|
||||||
static UsrMessageNatives s_UsrMessageNatives;
|
static UsrMessageNatives s_UsrMessageNatives;
|
||||||
|
|
||||||
|
42
core/smn_usermsgs.h
Normal file
42
core/smn_usermsgs.h
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
/**
|
||||||
|
* vim: set ts=4 :
|
||||||
|
* ===============================================================
|
||||||
|
* SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
|
||||||
|
* ===============================================================
|
||||||
|
*
|
||||||
|
* This file is not open source and may not be copied without explicit
|
||||||
|
* written permission of AlliedModders LLC. This file may not be redistributed
|
||||||
|
* in whole or significant part.
|
||||||
|
* For information, see LICENSE.txt or http://www.sourcemod.net/license.php
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_SOURCEMOD_CMSGLISTENERWRAPPER_H_
|
||||||
|
#define _INCLUDE_SOURCEMOD_CMSGLISTENERWRAPPER_H_
|
||||||
|
|
||||||
|
extern int g_MsgPlayers[256];
|
||||||
|
|
||||||
|
class MsgListenerWrapper : public IUserMessageListener
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void InitListener(int msgid, IPluginFunction *hook, IPluginFunction *notify, bool intercept);
|
||||||
|
bool IsInterceptHook() const;
|
||||||
|
int GetMessageId() const;
|
||||||
|
IPluginFunction *GetHookedFunction() const;
|
||||||
|
IPluginFunction *GetNotifyFunction() const;
|
||||||
|
public: //IUserMessageListener
|
||||||
|
void OnUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter);
|
||||||
|
ResultType InterceptUserMessage(int msg_id, bf_write *bf, IRecipientFilter *pFilter);
|
||||||
|
void OnUserMessageSent(int msg_id);
|
||||||
|
private:
|
||||||
|
size_t PreparePlArray(int *pl_array, IRecipientFilter *pFilter);
|
||||||
|
private:
|
||||||
|
IPluginFunction *m_Hook;
|
||||||
|
IPluginFunction *m_Intercept;
|
||||||
|
IPluginFunction *m_Notify;
|
||||||
|
bool m_IsInterceptHook;
|
||||||
|
int m_MsgId;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //_INCLUDE_SOURCEMOD_CMSGLISTENERWRAPPER_H_
|
Loading…
Reference in New Issue
Block a user